SpringCloud:Eureka(服務的註冊與發現、集羣、自我i保護機制)

1、Eureka

(1)概念

  服務註冊與發現對於微服務架構來說是非常重要的,有了服務發現與註冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。功能類似於dubbo的註冊中心,比如Zookeeper,服務的註冊與發現是Eureka的核心內容。

  服務的提供者需要進行服務的註冊,服務的消費者才能發現服務的提供者所提供的服務。

 

2、Eureka的使用

(1)環境搭建

添加依賴:

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

配置文件:

server:
  port: 7001
eureka:
  instance:
    hostname: localhost #eureka服務端的實例名稱
  client:
    register-with-eureka: false #false表示不向註冊中心註冊自己。
    fetch-registry: false #false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/        #設置與Eureka Server交互的地址查詢服務和註冊服務都需要依賴這個地址。

主啓動類:

需要添加Eureka允許其他服務註冊進來的註解

@EnableEurekaServer

測試:

 目錄結構:

 (2)服務的註冊(將8001服務註冊進Eureka)

在服務的提供者(8001)添加依賴(Eureka的客戶端依賴):

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

在服務的提供者(8001)添加有關Eureka的配置:

eureka:
  client: #客戶端註冊進eureka服務列表內
    service-url: 
      defaultZone: http://localhost:7001/eureka

在服務的提供者(8001)的主啓動類中添加註解:

@EnableEurekaClient //本服務啓動後會自動註冊進eureka服務中

啓動7001與8001進行測試:

 服務名稱與地址的修改:

 修改服務名稱和顯示IP地址:需要在服務的提供者的配置文件中添加配置

prefer-ip-address設置爲true的目的是訪問路徑可以顯示IP地址

eureka:
  client: 
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
    instance-id: my8001
    prefer-ip-address: true

 (3)微服務信息的完善

8001添加依賴:主管監控與信息的完善

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

在父依賴中添加配置:

<build>
   <finalName>microservicecloud</finalName>
   <resources>
     <resource>
       <directory>src/main/resources</directory>
       <filtering>true</filtering>
     </resource>
   </resources>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-resources-plugin</artifactId>
       <configuration>
         <delimiters>
          <delimit>$</delimit>
         </delimiters>
       </configuration>
     </plugin>
   </plugins>
  </build>

8001主配置添加info:

info:
  app.name: ZHB
  company.name: www.zzzhhhbbb
  build.artifactId: $project.artifactId$
  build.version: $project.version$

測試:

(4)自我保護

  默認情況下,如果EurekaServer在一定時間內沒有接收到某個微服務實例的心跳,EurekaServer將會註銷該實例(默認90秒)。但是當網絡分區故障發生時,微服務與EurekaServer之間無法正常通信,微服務本身沒有問題,是由於網絡的原因導致的,這個時候是不應該註銷微服務的。

  在自我保護模式中,Eureka Server會保護服務註冊表中的信息,不再註銷任何服務實例。當它收到的心跳數重新恢復到閾值以上時,該Eureka Server節點就會自動退出自我保護模式。它的設計哲學就是寧可保留錯誤的服務註冊信息,也不盲目註銷任何可能健康的服務實例。

 (5)服務發現

註冊進Eureka裏面的服務可以通過服務發現來獲取服務中的信息

 @RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
    public Object discovery()
    {
        List<String> list = discoveryClient.getServices();
        System.out.println("**********" + list);

        List<ServiceInstance> srvList = discoveryClient.getInstances("provider-8001");
        for (ServiceInstance element : srvList) {
            System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
                    + element.getUri());
        }
        return this.discoveryClient;
    }
PROVIDER-8001    192.168.88.1    8001    http://192.168.--.-:8001

需要在主類上添加註解:

@EnableDiscoveryClient

 

 

 

3、集羣的搭建

(1)新建Eureka的模塊,分別佔用7002和7003端口

需要修改7002和7003的pom.xml和主啓動類

(2)在hosts文件中配置地址的映射

127.0.0.1  eureka7001.com
127.0.0.1  eureka7002.com
127.0.0.1  eureka7003.com

(3)配置三個模塊的yml文件

如7001的配置如下:

 defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

(4)配置消費者的yml文件

      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

(5)測試

 

 

 

 4、Eureka與Zookeeper的對比

  CAP理論指出,一個分佈式系統不可能同時滿足C(一致性)、A(可用性)和P(分區容錯性)。由於分區容錯性P是在分佈式系統中必須要保證的,因此我們只能在A和C之間選擇一個。Zookeeper保證的是CP,Eureka則是AP。
  Zookeeper保證CP,當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊信息,但不能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。但是zk會出現這樣一種情況,當master節點因爲網絡故障與其他節點失去聯繫時,剩餘節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集羣都是不可用的,這就導致在選舉期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間導致的註冊長期不可用是不能容忍的。
  Eureka保證AP,Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊或時如果發現連接失敗,則會自動切換至其它節點,只要有一臺Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,此時會出現以下幾種情況: 
1. Eureka不再從註冊列表中移除因爲長時間沒收到心跳而應該過期的服務 
2. Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用) 
3. 當網絡穩定時,當前實例新的註冊信息會被同步到其它節點中
因此, Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像zookeeper那樣使整個註冊服務癱瘓。

 

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