①SpringCloud 實戰:引入Eureka組件,完善服務治理

簡介

Netflix Eureka 是一款由 Netflix 開源的基於 REST 服務的註冊中心,用於提供服務發現功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件的一部分,基於 Netflix Eureka 進行了二次封裝,主要負責完成微服務架構中的服務治理功能。git

Spring Cloud Eureka 是一個基於 REST 的服務,並提供了基於 Java 的客戶端組件,可以很是方便的將服務註冊到 Spring Cloud Eureka 中進行統一管理。github

部署 Eureka Server

  1. 建立一個名爲 eureka-server 的 Spring Cloud 的項目(略)web

  2. 引入 eureka-server 依賴(maven)spring

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  3. 開啓 EurekaServer
    在啓動類上添加 @EnableEurekaServer註解,開啓 EurekaServer 的自動裝配功能。網絡

  4. 修改服務端口爲8761架構

  5. 修改 register-with-eureka 配置
    添加一個eureka.client.register-with-eureka=false的配置,做爲EurekaServer能夠不將本身的實例註冊到 Eureka Server 中,若是是集羣部署設置爲true(不配置默認值也是true)。app

  6. 修改 fetch-registry 配置
    添加一個 eureka.client.fetch-registry=false 的配置,表示不從 Eureka Server 中獲取 Eureka 的註冊表信息,若是是集羣部署設置爲true(不配置默認值也是true)。maven

  7. 添加defaultZone配置
    添加一條配置eureka.client.service-url.defaultZone=http://localhost:8761/eureka/(若是不加這個的話又自定義了端口,可能會報錯Connect to localhost:8761 timed out)spring-boot

  8. 啓動 Eureka Server,訪問 http://localhost:8761/,若是順利的話能夠看到以下成功頁面
    微服務

至此,一個簡單的Eureka註冊中心就完成了,後面實戰中的 Eureka Client 都會註冊到這個註冊中心。上面的demo只是一個單機部署,接下里咱們看看咱們要部署多個Eureka節點時怎麼作。

Eureka Server 集羣部署

集羣部署通常有兩種狀況,一是僞集羣部署,二是真正的集羣部署。

集羣部署,咱們能夠在多臺物理機上部署,這樣多個實例能夠用同一個端口,不會出現僞集羣端口衝突的問題,更推薦這種方式,性能更高,穩定性也更好。

僞集羣部署通常說的是在同一臺物理機器上部署多個節點,這時候端口就必須不同,不然啓動的時候會出現端口衝突;

僞集羣部署示例:

假設要部署3個節點:master/slave1/slave2

  1. 在application.yml配置定義三個節點的端口:

    port:
      master: 8761
      slave1: 8762
      slave2: 8763
  2. 咱們能夠分別建立三個配置文件application-master.yml、application-slave1.yml、application-slave2.yml,三個配置文件除了有衝突的地方端口不同,其餘配置徹底同樣

    # application-master.yml
    server:
      port: ${port.slave1} # 服務端口
    
    # application-master.yml
    server:
      port: ${port.slave1} # 服務端口
    
    # application-slave2slave2.yml
    server:
      port: ${port.slave2} # 服務端口
    
    # 如下配置三個配置文件都同樣
    eureka:
      client:
        register-with-eureka: true #不將本身的實例註冊到 Eureka Server
        fetch-registry: true #不從 Eureka Server 中獲取 Eureka 的註冊表信息
        service-url:
          defaultZone: http://127.0.0.1:${port.master}/eureka/,http://127.0.0.1:${port.slave1}/eureka/,http://127.0.0.1:${port.slave2}/eureka/
      instance:
        hostname: eureka-server
      server:
        enable-self-preservation: true # 開啓自我保護機制,默認也是開啓的
  3. IDEA 分別以三個不一樣的profiles啓動

  4. 訪問 http://localhost:8761/ 或者 http://localhost:8762/ 或者 http://localhost:8761/,出現如下相似頁面則表明成功

觀察上面的頁面,發現 Eureka Server 節點均出如今 unavailable-replicas 下,說明集羣搭建仍是失敗了,那這個問題怎麼解決呢?

  1. host添加如下配置

    127.0.0.1       eureka-server-master
    127.0.0.1       eureka-server-slave1
    127.0.0.1       eureka-server-slave2
  2. 修改三個配置文件的defaultZone信息

    eureka:
      client:
        service-url:
          defaultZone: http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
  3. 配置eureka.instance.hostname信息(尤爲是在同一臺物理機上配置三個節點時,須要修改成不一樣的host)

    eureka:
    	instance:
        hostname: eureka-server-master
    
    eureka:
    	instance:
        hostname: eureka-server-slave1
    
    **eureka:
    	instance:
        hostname: eureka-server-slave2
  4. 從新啓動,訪問http://localhost:8761/ ,其餘兩個節點君出如今 available-replicas 選項

    注意:若是執行完上面仍是出如今,請檢查是否配置了 prefer-ip-address = true,true #以IP地址註冊到服務中心,相互註冊使用IP地址,若是是在一臺物理機上,IP都是一個,因此建議設置成false,或者不配置再試試。

部署 Eureka Client

  1. 建立一個名爲eureka-client 的SprintBoot的項目(略)

  2. 引入eureka-client依賴(maven)

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
  3. 引入spring-boot-starter-web依賴,若是沒有加上spring-boot-starter-web,服務沒法正常啓動

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  4. 開啓 EurekaClient
    在啓動類上加入註解@EnableEurekaClient,用於啓用Eureka發現配置

  5. 配置端口爲8081

    server.port = 8081
    port.master = 8761
    port.slave1 = 8762
    port.slave2 = 8763
  6. 配置註冊中心地址
    添加配置 eureka.client.serviceUrl.defaultZone=http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/

  7. 啓動服務,刷新 http://localhost:8761/ 頁面,若是看到了EUREKA-CLIENT應用則表示註冊成功

Eureka自我保護機制

自我保護機制是爲了不因網絡分區故障而致使服務不可用的問題。具體現象爲當網絡故障後,全部的服務與 Eureka Server 之間沒法進行正常通訊,必定時間後,Eureka Server 沒有收到續約的信息,將會移除沒有續約的實例。這個時候正常的服務也會被移除掉,因此須要引入自我保護機制來解決這種問題。

當服務提供者出現網絡故障,沒法與 Eureka Server 進行續約,Eureka Server 會將該實例移除,此時服務消費者從 Eureka Server 拉取不到對應的信息,實際上服務提供者處於可用的狀態,問題就是這樣產生的。

開啓自我保護機制

eureka.server.enable-self-preservation=true # 開啓自我保護機制,默認也是開啓的

當服務提供者出現網絡故障,沒法與 Eureka Server 進行續約時,雖然 Eureka Server 開啓了自我保護模式,但沒有將該實例移除,服務消費者仍是能夠正常拉取服務提供者的信息,正常發起調用。

可是自我保護機制也有很差的地方,若是服務提供者真的下線了,因爲 Eureka Server 自我保護還處於打開狀態,不會移除任務信息,當服務消費者對服務提供者 B 進行調用時,就會出錯。

自我保護模式有利也有弊,但咱們建議在生產環境中仍是開啓該功能,默認配置也是開啓的。

完整代碼實例:

  1. Eureka Server 代碼實例
  2. Eureka Client 代碼示例

總結

  1. 使用@EnableEurekaServer 註解實現註冊中心
  2. 使用@EnableEurekaClient 註冊到註冊中心
  3. Eureka Server 集羣部署的時候須要保證register-with-eurekafetch-registry 爲true,單機部署能夠爲false
  4. 生產環境建議開啓自我保護機制
相關文章
相關標籤/搜索