天天看點

再續微服務Eureka

Eureka架構中的三個核心角色

  1. 服務注冊中心

    Eureka的服務端應用,提供服務注冊和發現功能,就是上篇文章裡的springcloud-eurekaserver

  2. 服務提供者

    提供服務的應用,可以是springboot應用,也可以是其它任意技術實作,隻要對外提供的是Rest風格即可

  3. 服務消費者

    消費應用從注冊中心擷取清單服務,進而得到每個服務的資訊,直到去哪裡調用服務方。

Eureka注冊中心高可用叢集

在微服務架構的這種分布式系統中,我們要充分考慮每個服務元件的高可用性問題,不能有單點故障,由于注冊中心eureka本身也是一個服務,如果它隻有一個節點,那麼它可能發生故障,這樣就不能注冊和查詢服務了,是以需要一個高可用的服務注冊中心,這就需要通過注冊中心叢集來解決。

eureka服務注冊中心它本是一個服務,它也可以看做是一個提供者,又可以看做事一個消費者,通過配置

eureka.client.register-with-eureka=false
           

讓注冊中心不注冊自己,但是我們可以向其他注冊中心注冊自己;

Eureka Server的高可用實際上就是将自己作為服務向其服務注冊中心注冊自己,這樣就形成一組互相注冊的服務注冊中心,進而實作服務清單的互相同步,往注冊中心A上注冊的服務,可以被複制同步到注冊中心B上,是以從任何一台注冊中心上都能查詢到已經注冊的服務,進而達到高可用的效果。

再續微服務Eureka

搭建高可用的EurekaServer

假設運作兩個EurekaServer的叢集,端口分别為10086和10087,隻需要把eureka啟動兩次即可。
  1. 啟動第一個eurekaServer,修改原來的eurekaServer配置:
#配置服務端口
server:
  port: 10086
#配置應用名稱,會在Eureka中顯示
spring:
  application:
    name: eureka-server
#EurekaServer的位址,現在是自己的位址,如果是叢集,需要加上其他Server的位址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10087/eureka
           

所謂的高可用注冊中心,其實就是把EurekaServer自己也作為一個服務進行注冊,這樣多個EurekaServer之間就能互相發現對方,進而形成叢集。

2. 啟動第二個eurekaServer,再次修改urekaServer配置:

server:
  port: 10087 # 端口
spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
  client:
    service-url: # 配置其他Eureka服務的位址,而不是自己,比如10087
      defaultZone: http://127.0.0.1:10086/eureka
           
  1. 通路叢集,測試
    再續微服務Eureka
  2. 用戶端注冊服務到叢集

    因為EurekaServer不止一個,是以注冊服務的時候,service-url參數需要變化

eureka:
  client:
    service-url:
      #EruekaServer位址
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
           

10086

再續微服務Eureka

10087

再續微服務Eureka

服務提供者

服務提供者要向EurekaServer注冊服務,并且完成服務續約等工作

服務注冊

服務提供者在啟動時,會檢測配置屬性中的

eureka.client.register-with-eureka=true
           

參數是否正确,事實上預設就是true。如果值确實為true,則會向EurekaServer發起一個Rest請求,并攜帶自己的中繼資料資訊,EurekaServer會把這些資訊儲存到一個雙層Map結構中。

第一層Map的key就是服務id,一般是配置中的spring.application.name屬性

第二層Map的key是服務的執行個體id。一般是host+port

值則是服務的執行個體對象,也就說一個服務,可以同時啟動多個不同執行個體,形成叢集

服務續約

在注冊服務完成以後,服務提供者會維持一個心跳(定時向EurekaServer發起Rest請求),告訴EurekaServer:“我還活着”。這個我們稱為服務的續約(renew)

有兩個重要的參數可以修改服務續約的行為:

eureka:
  instance:
  	#服務失效時間,預設為90秒
    lease-expiration-duration-in-seconds: 90
    #服務續約(renew)的間隔,預設為30秒
    lease-renewal-interval-in-seconds: 30
           
也就是說,預設情況下每隔30秒服務會向注冊中心發送一次心跳,證明自己還活着。如果超過90秒沒有發送心跳,EurekaServer就會認為該服務當機,會從服務清單中移除,這兩個值在生産環境下不要修改,預設即可。

服務消費者

擷取服務清單

當服務消費者啟動時,會檢測

eureka-client-fetch-registry=true
           
參數的值,如果為true,則會拉取EurekaServer服務的清單隻讀備份,然後緩存在本地。并且每隔30秒會重新擷取并更新資料,可以通過下面的參數來修改
eureka:
  client:
    registry-fetch-interval-seconds: 5
           
生産環境下,不需要這個值,但是為了能夠快速得到服務的最新狀态,可以将其設定小一點。

失效剔除和自我保護

服務下線

當服務進行正常關閉操作時,它會觸發一個服務下線的Rest請求給EurekaServer,告訴服務注冊中心:“我要下線了”。服務中心接受請求後,将該服務置為下線狀态。

失效剔除

有些時候,服務提供方并一定會正常下線,可能因為某些原因導緻服務無法正常工作。EurekaServer需要将這樣的服務剔除服務清單。是以它會開啟一個定時任務,每隔60秒對所有失效的服務(超過90秒未響應)進行剔除。

可以通過

eureka.server.evicton-interval-timer-in-ms
           

參數對其進行修改,機關是毫秒,生産環境下不要修改。

自我保護

當我關停一個服務,就會在Eureka面闆看到一條消息

再續微服務Eureka

這是觸發了Eureka的自我保護機制,當一個服務未按時進行心跳續約時,Eureka會統計最近15分鐘心跳失敗的服務執行個體的比例是否超過了85%。在生産環境下,因為網絡延遲等原因,心跳失敗執行個體的比例很有可能超标,但是此時就把服務剔除清單并不妥當,因為服務可能沒有當機。Eureka就會把目前執行個體的注冊資訊保護起來,不予删除。生産環境下,保證了大多數服務依然可用。

但是會給開發帶來麻煩,因為開發階段我們會自動關閉自我保護模式

eureka:
  server:
    enable-self-preservation: false # 關閉自我保護模式(預設為打開)
    eviction-interval-timer-in-ms: 1000 # 掃描失效服務的間隔時間(預設為60*1000ms)
           
關于自我保護常用的幾個配置
#測試時關閉自我保護機制,保證不可用服務及時剔除
eureka.server.enable-self-preservation=false
#每隔2秒,向伺服器發送一條心跳,證明自己還活着
eureka.instance.lease-renewal-interval-in-seconds=2
#告訴伺服器,如果10秒之内内有給你發心跳,就代表我涼了,将我剔除
eureka.instance.lease-expiration-duration-in-seconds=10
           

繼續閱讀