1. 程式人生 > >SpringCloud之Eureka學習筆記

SpringCloud之Eureka學習筆記

Eureka介紹及原理
理解

Eureka就像一個物業管理公司,其他微服務就像小區的住戶,每個住戶入住時都要向物業管理公司註冊,並定時向物業公司交管理費。
介紹
Eureka是一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。
Eureka主管服務註冊與發現,在微服務中,以後了這兩者,只需要使用服務的識別符號(就是那個在每個服務的yml檔案中取得服務名稱),就可以訪問到服務,不需要修改服務呼叫的配置檔案
Eureka遵循AP原則(高可用,分割槽容錯性),因為使用了自我保護機制所以保證了高可用
原理
Eureka使用的是C-S結構(客戶端-服務端)
兩大元件:Eureka Server(提供註冊服務)、 Eureka Client(JAVA客戶端,負責傳送心跳)
系統中的其他微服務使用Eureka客戶端連線到Eureka服務端維持心跳連線(即註冊)。SpringCloud的其他模組可以通過Eureka Server 來發現系統中的微服務並加以呼叫。
Eureka服務註冊中心構建
加入服務端依賴

org.springframework.cloud
spring-cloud-starter-eureka-server

配置yml
理解:物業公司肯定不向自己註冊自己,並肯定知道自己在哪,不用參加檢索

server:
  port: 7001
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false     #false表示不向註冊中心註冊自己
    fetch-registry: false           #false表示自己就是註冊中心,職責是維護例項,不參加檢索
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #設定eureka server的互動地址,即對外暴露的地址

新增啟動類
注意:要在類前加@EnableEurekaServer標註

    package com.XXX;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    @SpringBootApplication
    @EnableEurekaServer
    public class Eureka7001_APP {
        public static void main(String[] args) {
            SpringApplication.run(Eureka7001_APP.class,args);
        }

    }

驗證是否構建成功
啟動主程式,訪問該服務地址即可
向Eureka註冊中心註冊微服務
增加依賴

在要註冊的微服務的pom.xml檔案中增加依賴

     <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>   

修改yml
在application.yml中增加以內容,將客戶端註冊到服務列表內
理解:小區使用者要找到物業管理處的地址進行註冊eureka:

      client:
        service-url:
          defaultZone: http://localhost:7001/eureka

主啟動類增加註解

    增加@EnableEurekaClient註解
    @SpringBootApplication
    @EnableEurekaClient
    public class Provider8001_APP {
        public static void main(String[] args) {
            SpringApplication.run(Provider8001_APP.class,args);
        }
    }

actuator與微服務註冊完善
主機名稱與服務名稱的修改

修改服務名稱,在yml中eureka節點下新增如下內容

 eureka:
  instance:
    instance-id: dept8001        #修改別名
    prefer-ip-address: true        #顯示IP地址

info內容的詳細資訊修改
作用

在檢視Eureka時點選進入某個微服務的info時,能給檢視者一些必要的資訊,可以幫助檢視者快速的瞭解該微服務,開發中十分有意義。

修改方法

當前工程新增依賴

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

2.總的父工程的build節點下新增如下內容

<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>

3.在當前工程 的application.yml檔案添加回顯資訊

	info:
	  author: XXX
	  build-version: $project.version$

Eureka的自我保護
介紹

Eureka的自我保護機制主要是為了網路異常時保持高可用設計的,當在Eureka中註冊的微服務超過設定是時間內(預設90秒)沒有向Eureka服務端傳送心跳,該微服務會進入自我保護模式。在自我保護模式中,Eureka會保護服務登錄檔中的資訊,不會登出任何服務例項,直至收到的心跳數恢復至閾值以上,該微服務退出自我保護模式。
理解

好死不如賴活:Eureka的設計哲學是寧可保留錯誤的服務資訊,也不盲目登出可能健康的服務。所以異常的服務不會被登出,而是進入了自我保護模式。
自我保護模式的開關

在Eureka Server模組下的yml檔案中新增配置資訊即可,true表示開啟自我保護模式;false表示關閉自我保護模式(不推薦)

server:
enable-self-preservation: false

Eureka的服務發現
介紹

系統中的微服務可以通過Eureka的服務發現去獲得在Eureka中註冊的服務的資訊,這是一個對外暴露的介面。
使用方法(provider中)

注入DiscoveryClient 物件(spring包下的),在controller方法中獲取

@Autowired
private DiscoveryClient discoveryClient;    

@ResponseBody
@GetMapping("/provider/discovery")
public Object discovery(){
        List<String> list = discoveryClient.getServices();
        System.out.println(list);
        List<ServiceInstance> insList = discoveryClient.getInstances("MICROSERVICECLOUD-DEPT");
        for (ServiceInstance si:insList) {
            System.out.println(si.getHost() +"," + si.getServiceId() +"," +si.getPort() +"," +si.getUri() +"," +si.getMetadata());
        }
        return this.discoveryClient;
    }
  1. 在主啟動類中加入@EnableDiscoveryClient註解

     @SpringBootApplication
     @EnableEurekaClient
     @EnableDiscoveryClient
     public class Provider8001_APP {
     	public static void main(String[] args) {
        		 SpringApplication.run(Provider8001_APP.class,args);
    	 }
     }
    

使用方法
在controller方法中使用restTemplate物件呼叫provider中暴露的URL 並獲得返回物件即可

@GetMapping("/discovery")
public Object discovery() {
    return restTemplate.getForObject(URL_PREFIX+"/provider/discovery",Object.class);
}

Eureka的叢集配置
叢集

叢集就是在不同的機器上配置相同的服務來構建要一個大的運算整體

實現叢集

新建N個Eureka Server模組
每個模組的pom.xml中加入與單個Eureka Server相同的依賴
每個模組加入主程式(記得加@EnableEurekaServer註解)
修改hosts檔案(Win10的路徑是C:\Windows\System32\drivers\etc)
列如: 
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com

修改Eureka Server模組的application.yml檔案,加入叢集,主要修改兩個地方:hostname:修改為hosts檔案中對映的地址 service-url下的defaultZone節點:填入叢集中另外的server服務端的地址

server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com    #hostname為hosts檔案中對映的地址
  client:
    register-with-eureka: false     #false表示不向註冊中心註冊自己
    fetch-registry: false           #false表示自己就是註冊中心,職責是維護例項,不參加檢索
service-url:
  #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #設定eureka server的互動地址
  defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  #其他兩個服務端的地址
  1. 修改Eureka Client模組的application.yml檔案,使其向叢集註冊服務

service-url下的defaultZone節點:填入叢集中需要向其註冊server服務端的地址

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
  1. 訪問地址

    http://eureka7001.com:7001
    http://eureka7002.com:7002
    http://eureka7003.com:7003

  2. 注:defaultZone中eureka/字尾是必須的,如果刪除,Server類不會報錯,但是Client註冊時會報404錯誤

Eureka與Zookeeper對比
CAP設計原則不同

Eureka遵守AP,Zookeeper遵守CP(C:強一致性,A:高可用,P:分割槽容錯性,三者只能選其二,高併發下P必選)

Zookeeper:

當網路出現故障時,剩餘zk叢集會發起投票選舉新的leader,但是此過程會持續30~120s,此過程對於高併發來說十分漫長,會導致整個註冊服務的癱瘓,這是不可容忍的

Eurkeka:在15分鐘內85%的節點都沒有心跳,則註冊中心 會認為客戶端與之出現了網路故障,則會進入自動保護模式。1.Eureka不會移除沒有收到心跳的服務;2.新的服務仍能在服務端註冊,但是暫時不會被同步到其他節點上直到網路穩定

小結:

Eureka可以很好的應對網路故障導致部分節點失去連線的情況,而不會像zookeeper那樣導致整個註冊服務系統的癱瘓。