熟悉微服務架構或Dubbo框架的都知道,微服務中最核心、最基礎的組件就是注冊中心了。下面利用Spring Cloud Eureka實現服務注冊中心。並注冊一個簡單的服務提供者。
首先先創建一個spirngboot工程,並添加公用依賴。
如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引入spring-cloud-starter-eureka-server依賴
如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.5.RELEASE</version> </dependency>
啟動類添加@EnableEurekaServer,啟用注冊中心服務
如下:
@EnableEurekaServer @SpringBootApplication public class RegisterApplication { public static void main(String[] args) { SpringApplication.run(RegisterApplication.class,args); } }
配置application.yml
如下:
#端口號
server:
port: 8888
#Eureka實例名,集群中根據這里相互識別
eureka:
instance:
hostname: eureka
#客戶端
client:
#是否開啟注冊服務,因為這里如果為true表示自己注冊自己,而自己就是一個服務注冊方,沒必要自己注冊自己
register-with-eureka: false
#是否拉取服務列表,這里我只提供服務給別的服務。
fetch-registry: false
#注冊中心地址
service-url:
defaultZone: http://localhost:8888/eureka/
然后啟動springboot工程,從瀏覽器訪問http://localhost:8888/,可以看到如下界面,因為還沒有注冊服務,所以應用列表是空的
到這里,注冊中心就搭建好了。接下來我們就創建兩個服務提供者,注冊到注冊中心。
注冊服務
新建provider1,provider2兩個子模塊,用作服務提供者。
如下圖:
添加eureka客戶端依賴
兩個服務提供者的pom.xml都是一樣的,如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</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>
修改兩個application.yml文件,圖下圖:
#端口號 server: port: 8080 #Eureka實例名,集群中根據這里相互識別 spring: application: name: hello-service eureka: #客戶端 client: #注冊中心地址 service-url: defaultZone: http://localhost:8888/eureka/
第二provider如下:
#端口號 server: port: 8081 #Eureka實例名,集群中根據這里相互識別 spring: application: name: hello-service eureka: #客戶端 client: #注冊中心地址 service-url: defaultZone: http://localhost:8888/eureka/
兩個分別在啟動類上加如下@EnableDiscoveryClient注解,如下所示:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class Provider1Application { public static void main(String[] args) { SpringApplication.run(Provider1Application.class, args); } }
然后分別啟動這兩個服務,如下圖所示:
看到有兩個HELLO-SERVICE證明兩個服務已經注冊成功了。
構建高可用的注冊中心
注冊中心
在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,包括服務的主機與端口號、服務版本號、通訊協議等一些附加信息。注冊中心按照服務名分類組織服務清單,
同時還需要以心跳檢測的方式去監測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。
在實際的項目中,單機往往是不夠的,而需要注冊中心集群,實現注冊中心的高可用。如下圖所示:
服務注冊
在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,包括服務的主機與端口號、服務版本號、通訊協議等一些附加信息。注冊中心按照服務名分類組織服務清單,同時還需要以心跳檢測的方式去監測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。
服務發現
在服務治理框架下,服務間的調用不再通過指定具體的實例地址來實現,而是通過服務名發起請求調用實現。服務調用方通過服務名從服務注冊中心的服務清單中獲取服務實例的列表清單,通過指定的負載均衡策略取出一個服務實例位置來進行服務調用。
Eureka服務端
Eureka服務端,即服務注冊中心。它同其他服務注冊中心一樣,支持高可用配置。依托於強一致性提供良好的服務實例可用性,可以應對多種不同的故障場景。
Eureka服務端支持集群模式部署,當集群中有分片發生故障的時候,Eureka會自動轉入自我保護模式。它允許在分片發生故障的時候繼續提供服務的發現和注冊,當故障分配恢復時,集群中的其他分片會把他們的狀態再次同步回來。集群中的的不同服務注冊中心通過異步模式互相復制各自的狀態,這也意味着在給定的時間點每個實例關於所有服務的狀態可能存在不一致的現象。
Eureka客戶端
Eureka客戶端,途中的即服務提供者,主要處理服務的注冊和發現。客戶端服務通過注冊和參數配置的方式,嵌入在客戶端應用程序的代碼中。在應用程序啟動時,Eureka客戶端向服務注冊中心注冊自身提供的服務,並周期性的發送心跳來更新它的服務租約。同時,他也能從服務端查詢當前注冊的服務信息並把它們緩存到本地並周期行的刷新服務狀態。
這里給讀者解釋一下什么是注冊,什么是續約,什么是下線,什么是Relicate
1.注冊,表示服務提供者需要向注冊中心注冊服務,在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,包括服務的主機與端口號、服務版本號、通訊協議等一些附加信息。
注冊中心按照服務名分類組織服務清單,同時還需要以心跳檢測的方式去監測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。
2.續約,這里類似於心跳檢測機制,默認是每隔90秒,服務提供者需要向注冊中心進行續約,目的是隔一段時間Service Provider調用接口,告訴Eureka Server它還活着沒掛,不要把它T了。通俗的說就是它們兩之間的心跳檢測,避免服務提供者被剔除掉
3.下線,表示服務提供者斷開
為了模擬注冊中心的集群形式,我這里再創建一個springcloud-Eureka1注冊中心模塊,用於模擬兩台服務的啟動,如下:
修改第一個Eureka配置如下:
#端口號 server: port: 8888 #Eureka實例名,集群中根據這里相互識別 eureka: instance: hostname: eureka #客戶端 client: service-url: defaultZone: http://localhost:8889/eureka/ server: #是否開啟安全保護,默認是開啟的,如果默認開啟,注冊中心的服務列表就算有些服務斷開了,也會繼續保存 enable-self-preservation: false spring: application: name: eureka-service
再修改第二個Eureka配置,如下:
#端口號 server: port: 8889 #Eureka實例名,集群中根據這里相互識別 eureka: instance: hostname: eureka1 ##續約時間 # lease-expiration-duration-in-seconds: 90 ##定時任務是時間,每個隔多少秒去重新刷新續約時間 # lease-renewal-interval-in-seconds: 30 #客戶端 client: service-url: defaultZone: http://localhost:8888/eureka/ ##每個隔多少秒刷新獲取服務列表世界 # registry-fetch-interval-seconds: 30 #服務端: server: enable-self-preservation: false spring: application: name: eureka-service
其他基本不變,Eureka實現高可用原理其實很簡單,就是兩個Eureka相互注冊,你向我注冊,我向你注冊。
然后分別啟動這兩個Eureka
如下:
看一看到,服務列表有兩個同名的EUREKA-SERVICE,證明高可用注冊中心搭建起來了。