Eureka 服務註冊與發現

Eureka 服務註冊與發現

版本採用 Zuul Core 1.4.6

微服務架構由一組小的服務組成,服務之間採用輕量級的通訊機制進行溝通,微服務之間調用關係是一個網狀結構,一個微服務在調用另一個微服務的時候,無法知道另一個微服務的具體地址;由於每個服務屬於"微"服務,每個服務生命週期不長,每個服務可能隨時被關閉、重啓、替換;在隨着訪問量增加的時候,微服務需要擴容,訪問量減少時,微服務需要縮容;這樣就導致每個微服務的地址在動態變化。這時候必然引入一個服務的註冊與發現問題。

在如今的的服務註冊與發現的框架中,SpringCloud提供了一套相對完整的技術組件,其中包括服務發現與註冊eureka,Eureka 是 Netflix 出品的用於實現服務註冊和發現的工具。 Spring Cloud 集成了 Eureka,並提供了開箱即用的支持。Eureka 又可細分爲 Eureka Server 和 Eureka Client。

內容概覽

快速部署

Spring Cloud中,包括API網關以及服務註冊中心都是以服務的形式存在,所以,要部署Eureka,就是構建一個服務,在服務中添加以下依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

在啓動類上加入@EnableEurekaServer開啓服務註冊中心

添加配置文件

server.port = 8001
server.sessionTimeout=15
server.tomcat.max-threads = 800
server.tomcat.uri-encoding = UTF-8
 
#服務Eureka Server的身份驗證
#security.basic.enabled=true
#security.user.name=root
#security.user.password=angus
 
#是否將eureka自身作爲應用註冊到eureka註冊中心
eureka.client.registerWithEureka=false
#爲true時,可以啓動,但報異常:Cannot execute request on any known server
eureka.client.fetchRegistry=false
 
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/

框架說明

服務註冊中心的高可用性,高可用的保證,就是備份,Eureka通過對自身的備份,當自身出現故障時,能保證整個系統的正常運行。註冊中心提供3個端口:

  • Application Service port:爲服務提供者提供服務註冊,更新,下線,剔除,服務通訊等功能
  • Application Client port:爲服務消費者提供服務發現和獲取服務提供者地址的功能
  • Replicate port:爲處於不同節點的Eureka進行數據同步提供服務

在這裏插入圖片描述

Eureka基本使用

服務註冊

添加依賴:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

在啓動類上加上註解 @EnableEurekaClient 聲明爲 EurekaClient

配置服務註冊中心地址:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/
server:
  port: 8762
spring:
  application:
    name: service-hi

服務消費

添加依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

在啓動類上加上註解 @EnableDiscoveryClient 聲明爲 EurekaConsume

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/
server:
  port: 8764
spring:
  application:
    name: service-consume

之後就可以調用服務提供者的服務完成服務消費

負載均衡

在服務消費者的pom中添加依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

在啓動類中向程序的ioc注入一個bean: restTemplate,並通過@LoadBalanced註解表明這個restRemplate開啓負載均衡的功能

@Bean
@LoadBalanced
RestTemplate restTemplate() {
    return new RestTemplate();
}

此時架構如圖:

在這裏插入圖片描述

服務註冊中心的自我保護

在默認配置中,Eureka Server在默認90s沒有得到客戶端的心跳,則註銷該實例,但是往往因爲微服務跨進程調用,網絡通信往往會面臨着各種問題,比如微服務狀態正常,但是因爲網絡分區故障時,Eureka Server註銷服務實例則會讓大部分微服務不可用,爲了解決這個問題,Eureka 有自我保護機制,通過在Eureka Server配置如下參數,可啓動保護機制:

eureka.server.enable-self-preservation=true

它的原理是,當Eureka Server節點在短時間內丟失過多的客戶端時(可能發送了網絡故障),那麼這個節點將進入自我保護模式,不再註銷任何微服務,當網絡故障回覆後,該節點會自動退出自我保護模式。

服務註冊中心的高可用性實現

簡單來說, Eureka的高可用,實際上就是將自己也作爲服務向其他服務註冊中心進行註冊,這樣就可以形成一組相互註冊的服務註冊中心,以實現服務清單的互相同步,達到高可用的效果。在CAP原則中,相對於zookeeper滿足AP(可用性和分區容錯性)來說,Eureka是滿足CP( 一致性和分區容錯性)的。這是它與zookeeper的最大區別。

每個註冊中心都將自己作爲EurekaClient註冊到其他註冊中心中去

例如:以下兩個註冊中心

  • Peer1
spring.application.name=eureka-service-1
# 端口
server.port=1000
# 實例的主機名稱
eureka.instance.hostname=Peer1
# 不要向註冊中心註冊自己
#eureka.client.register-with-eureka=false
#表示不去檢索其他的服務,因爲服務註冊中心本身的職責就是維護服務實例,它也不需要去檢索其他服務
#eureka.client.fetch-registry=false
# 指定服務註冊中心地址
eureka.client.service-url.defaultZone=http://Peer2:1001/eureka
  • Peer2
spring.application.name=eureka-service-2
# 端口
server.port=1001
# 實例的主機名稱
eureka.instance.hostname=Peer2
# 不要向註冊中心註冊自己
#eureka.client.register-with-eureka=false
#表示不去檢索其他的服務,因爲服務註冊中心本身的職責就是維護服務實例,它也不需要去檢索其他服務
#eureka.client.fetch-registry=false
# 指定服務註冊中心地址
eureka.client.service-url.defaultZone=http://Peer1:1000/eureka

而對於服務提供者,可作如下修改:

eureka.client.service-url.defaultZone=http://Peer1:1000/eureka,http://Peer2:1001/eureka

當然,也可只註冊到某個節點上,其他的節點會通過Replicate進行同步,一般建議以集羣方式進行配置,即多註冊中心配置。避免單點故障,Eureka在搜索註冊中心時,根據defaultZone列表,找到一個可用的,之後就不會繼續去下一個註冊中心地址拉取服務列表了,此時若其中一個註冊中心發生故障,這個時候客戶端會繼續去第二個註冊中心拉取服務列表的。

生產環境

TODO

常見問題

TODO

更新計劃

  • 增加自定義負載均衡策略實現
  • Eureka的自我保護策略改進實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章