Eureka實現對微服務的註冊並監控微服務的使用狀態。
服務啓動後向Eureka註冊,Eureka Server會將註冊信息向其他Eureka Server進行同步,當服務消費者要調用服務提供者,則向服務註冊中心獲取服務提供者地址(即:服務應用名,spring.application.name參數配置),然後會將服務提供者地址緩存在本地,下次再調用時,則直接從本地緩存中取,完成一次調用。
當服務註冊中心Eureka Server檢測到服務提供者因爲宕機、網絡原因不可用時,則在服務註冊中心將服務置爲DOWN狀態,並把當前服務提供者狀態向訂閱者發佈,訂閱過的服務消費者更新本地緩存。
服務提供者在啓動後,週期性(默認30秒)向Eureka Server發送心跳,以證明當前服務是可用狀態。Eureka Server在一定的時間(默認90秒)未收到客戶端的心跳,則認爲服務宕機,註銷該實例。
在默認配置中,Eureka Server在默認90s沒有得到客戶端的心跳,則註銷該實例,但是往往因爲微服務跨進程調用,網絡通信往往會面臨着各種問題,比如微服務狀態正常,但是因爲網絡分區故障時,Eureka Server註銷服務實例則會讓大部分微服務不可用,這很危險,因爲服務明明沒有問題。
爲了解決這個問題,Eureka 有自我保護機制,通過在Eureka Server配置如下參數,可啓動保護機制。
eureka.server.enable-self-preservation=true
它的原理是,當Eureka Server節點在短時間內丟失過多的客戶端時(可能發送了網絡故障),那麼這個節點將進入自我保護模式,不再註銷任何微服務,當網絡故障回覆後,該節點會自動退出自我保護模式。
服務端:
使用https://start.spring.io/ 選擇spring web start和Eureka server
或加載
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.yml配置文件:
server:
port: 8761
eureka:
##實例
instance:
hostname: localhost
client:
##自身不加載不註冊爲客戶端
fetchRegistry: false
registerWithEureka: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
##服務名稱等屬性
spring:
application:
name: eureka-server
增加啓動項@EnableEurekaServer
客戶端:
使用https://start.spring.io/ 選擇spring web start和Eureka Client
或加載
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml配置文件:
eureka:
##客戶端配置
client:
##配置訪問的服務端地址
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8081
spring:
application:
name: eureka-client
增加啓動項@EnableEurekaClient
Eureka集羣:
搭建兩個相同註冊中心,application.yml配置相互如下:、
EXP1:
server:
port: 8762
eureka:
instance:
hostname: localhost
client:
fetchRegistry: false
registerWithEureka: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-server01
EXP2:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
fetchRegistry: false
registerWithEureka: false
serviceUrl:
defaultZone: http://localhost:8762/eureka/
spring:
application:
name: eureka-server