Spring Cloud 學習筆記-Eureka 服務註冊與發現

Eureka 客戶端的服務註冊

       Eureka 客戶端在運行時會向 Eureka 服務端發送週期性的心跳,Eureka 服務端利用客戶端週期性的心跳續約請求來保證註冊表的實時性。其中客戶端會向服務端提供一個若是多久沒有向服務端發送心跳請求,就再也不維護這個客戶端的時間閾值。git

- eureka.instance.lease-renewal-interval-in-seconds 輸入圖片說明

Eureka 客戶端的服務拉取

       在一般狀況下服務提供者可能爲多個實例,服務調用者在調用服務時經過一些特定的負載均衡算法來把請求轉發到該服務調用者的實例上。Eureka 客戶端也會定時向服務端獲取最新的服務列表,若是想保證明時性更高的話須要修改其配置來實現。github

輸入圖片說明

Eureka 服務端的註冊列表維護

       當客戶端心跳續約請求超過與服務端約定好的時間閾值以後,Eureka 服務端會將該客戶端實例加入到待清理的一個列表中以後由定時器來清理。若是咱們想讓服務端的註冊列表實時性更高一些除了須要修改客戶端的配置也須要修改服務端清理定時器的配置。算法

Eureka 的自我保護機制

       如下來自Netflix官方解釋 原文連接spring

Eureka 客戶嘗試與同一區域的Eureka服務器通話。若是在與服務器交談時出現問題,或者服務器不在同一區域中,則客戶端將故障轉移到其餘區域中的服務器。 一旦服務器開始接收流量,服務器上執行的全部操做都會複製到服務器知道的全部對等節點。若是某個操做因爲某種緣由而失敗,則該信息將與下一個在服務器之間複製的心跳同步。 當Eureka服務器啓動時,它會嘗試從鄰居節點獲取全部實例註冊表信息。若是從節點獲取信息時出現問題,則服務器在放棄以前先嚐試全部對等節點。若是服務器可以成功獲取全部實例,則會根據該信息設置它應該接收的更新閾值。若是任什麼時候候,續訂低於爲該值配置的百分比(在15分鐘內低於85%),則服務器將中止到期實例以保護當前實例註冊表信息。 在Netflix中,上述安全措施稱爲自我保護模式 ,主要用於在一組客戶端與Eureka服務器之間存在網絡分區的狀況下的保護。在這些狀況下,服務器會嘗試保護已有的信息。在發生大量停機的狀況下,可能會出現這種狀況,這可能會致使客戶獲取再也不存在的實例。客戶端必須確保它們對於返回不存在或不響應的實例的尤里卡服務器具備彈性。在這些狀況下最好的保護是快速超時並嘗試其餘服務器。        Eureka的自我保護機制,經過配置 eureka.server.enable-self-preservation(true/false)來打開或者禁用自我保護機制,默認打開狀態。在自我保護開啓的時候,若是心跳的失敗率超過必定比例,服務端會將這些實例保護起來,並不會立刻將其從註冊表中剔除。此時對於調用的客戶端來講有可能會拿到一些沒法使用的實例,這種狀況可能會致使災難的惡化。對於這種狀況咱們能夠用 netflix 提供的容錯框架hystrix 來觸發fallback或者熔斷來解決,使微服務集羣更加健壯。對於開發環境咱們能夠關閉自我保護,這樣在出現網絡問題或者其餘問題時,服務端將不會保護過時實例。安全

模擬

Eureka 服務提供者

       更改上一篇文章中的服務提供者的啓動方法爲控制檯輸入端口啓動服務器

@EnableEurekaClient
@SpringBootApplication
public class EkProviderApplication {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        new SpringApplicationBuilder(EkProviderApplication.class).properties("server.port=" + scanner.nextLine()).run(args);
    }
}

       在這裏咱們啓動8080和8081兩個端口實例。網絡

Eureka 服務調用者

       增長上一篇文章中的服務調用者的REST服務app

@Autowired
    EurekaClient eurekaClient;

    @RequestMapping("/getServices")
    public void getServices() {
        Applications applications = eurekaClient.getApplications();
        List<Application> registereds = applications.getRegisteredApplications();
        for (Application registered : registereds) {
            System.out.println("服務: " + registered.getName());
            System.out.print(" 實例:");
            for (InstanceInfo info : registered.getInstances()) {
                System.out.print(" ");
                System.out.print(info.getHomePageUrl());
            }
            System.out.println("");
        }

       啓動以後能夠在 Eureka 控制檯看到以下實例列表負載均衡

輸入圖片說明

       經過訪問http://localhost:9000/getServices 看到客戶端獲取的註冊列表爲框架

輸入圖片說明

       以後咱們停掉8081的服務提供者能夠在Eureka控制檯看到Eureka 告警提示,經過再次訪問getService接口知道不會立馬剔除這個服務實例。(若是未出現以下狀況能夠嘗試幾回訪問invoke使其達到開啓自我保護的條件)

輸入圖片說明

Eureka 服務

       增長上一篇文章中的Eureka 服務的application.yml的配置,使其關閉自我保護模式

server:
  port: 8761
eureka:
  server:
    enable-self-preservation: false
  client:
    registerWithEureka: false
    fetchRegistry: false

       啓動以後能夠在 Eureka控制檯看到已關閉自我保護的文字,以後當客戶端達到剔除規則以後就會被清理掉。

輸入圖片說明

源碼

相關文章
相關標籤/搜索