SpringCloud——搭建Eureka服務註冊中心
一:Eureka簡介
Eureka和Consul、Zookeeper等類似,是一個使用者服務發現和服務註冊的元件,最開始主要用於亞馬遜旗下的雲端計算服務平臺AWS。Eureka分為EurekaServer(服務註冊中心)和EurekaClient(客戶端)。
Eureka優點
- 1:完全開源,且經過三年時間迭代,效能和功能都非常穩定。
- 2:是SpringCloud官方推薦的註冊中心,能夠和SpringCloud其他元件完美對接。
- 3:Eureka能夠和Ribbon、Hystrix、Zuul等其他元件相互配合,快速完成服務註冊中心,和這些元件並稱Netfilx OOS元件,由SpringCloud整合,是SpringCloud的核心服務元件,也是基礎元件。
二:搭建第一個服務註冊中心
Talking is boolshit, just look at the code!
- 父專案pom.xml
<groupId>com.calvin.cloud</groupId> <artifactId>cloud_day01</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>eureka-server</module> <module>eureka-client</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
使用SpringInitializr建立兩個子Module,分別是eureka-server和eureka-client
- eureka-server/pom.xml
<parent> <artifactId>cloud_day01</artifactId> <groupId>com.calvin.cloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>eureka-server</artifactId> <dependencies> <!-- springcloud的版本如果有問題,這個包引入就會有問題 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
- eureka-server/EurekaServerApplication.java
/**
* EurekaServer啟動類
* @author Calvin
* @date 2019/07/29
*/
@SpringBootApplication
@EnableEurekaServer
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class);
}
}
- eureka-server/application.yml
server:
port: 8080
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone:
http://${eureka.instance.hostname}:${server.port}/eureka
啟動EurekaServerApplication.main(),瀏覽器訪問 http://localhost:8080/eureka 此時顯示並沒有可用服務註冊進來
No instances available
再來寫一個EurekaClient
- eureka-client/pom.xml
<parent>
<artifactId>cloud_day01</artifactId>
<groupId>com.calvin.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-client</artifactId>
<dependencies>
<!-- springcloud的版本如果有問題,這個包引入就會有問題 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- eureka-client/application.yml
server:
port: 8081
spring:
application:
name: my_eureka_client
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/
- eureka-client/ClientApplication.java
/**
* Client測試啟動類
* @author Calvin
* @date 2019/09/29
*/
@SpringBootApplication
@EnableEurekaClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class);
}
}
重新整理http://localhost:8080/eureka 發現服務已經註冊成功了
三:Eureka核心探索
微服務中的概念
-
1:Register———服務註冊 服務註冊即是EurekaClient祥EurekaServer提交註冊自己的服務資訊,包括IP地址、埠,ServiceID等資訊。如果EurekaClient中沒有ServiceId,則預設以配置檔案中的#{spring.application.name}為服務名。
-
2:Renew———服務續約
EurekaClient預設每隔30s傳送一次心跳來進行服務續約。通過服務續約來告知EurekaServer該EurekaClient依然可用,沒有出現故障。如果EurekaServer在90s之內沒有收到心跳,則EurekaServer會認為該服務已經掛掉,則會將該EurekaClient實力從註冊列表中剔除掉。 -
3:FetchRegistries———獲取服務註冊列表資訊
EurekaClient從EurekaServer中獲取服務登錄檔資訊,並將其快取在本地。EurekaClient會使用服務註冊列表中的資訊查詢其他服務的資訊,從而進行遠端呼叫。
該註冊列表資訊會定時30s從服務端更新一次,每次返回的註冊列表資訊可能與EurekaClient快取的資訊不匹配,EurekaClient會自己處理這些資訊。如果由於某種原因導致註冊列表資訊不能及時匹配,則EurekaClient會重新更新這些資訊。
EurekaServer快取了所有的服務註冊列表資訊,並將整個服務列表以及每隔應用程式進行了壓縮,壓縮內容和沒有壓縮的內容完全相同。EurekaClient和EurekaServer可以是用JSON和XML資料格式相互通訊。在預設的情況下,EurekaClient使用JSON格式的方式獲取服務註冊列表資訊。 -
4:Cancel———服務下線
EurekaClient在程式關閉時可以向EurekaServer傳送下線請求,傳送請求後,該客戶端的例項資訊將從EurekaServer的服務資訊列表中刪除。該下線請求不會自動完成,需要在程式關閉時呼叫以下程式碼DiscoverManager.getInstance().shutdownComponent();
-
5:Evication———服務剔除
在預設情況下,當EurekaClient連續90s沒有像EurekaServer傳送心跳,EurekaServer則會認為該服務已經不可用,將該服務例項從服務列表資訊中刪除。
高可用服務註冊中心
上面的架構描述了Eureka在Netflix上的部署方式,也是正常Eureka正常的部署和執行方式。每個區域都有一個Eureka叢集,且每個區域至少有一個Eureka伺服器來處理區域故障。
服務在EurekaServer註冊,然後傳送心跳以每30秒更新其租約。如果客戶端無法保持心跳,EurekaServer將在90秒後從出伺服器註冊列表中剔除此服務例項。註冊資訊和續約資訊將複製到叢集中的所有EurekaServer節點。來自任何區域EurekaClient都可以每隔30s獲取到所有註冊列表資訊,並進行遠端呼叫。 以上資料來自於官網:https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance
四:小結
- 簡單介紹Eureka以及優缺點
- 編寫第一個Eureka註冊中心
- 瞭解Eureka中的概念和高可用註冊中心的架構
五:問題總結
- 內容相對簡單,沒有對概念進行深入剖析
- 程式碼中沒有進行叢集搭建,也沒有測試服務提供者和消費者
- 後續應該加上