springCloud系列之(二) ---------- 服務治理:Eureka

目錄

 

 

服務治理

服務註冊

服務發現

Eureka

工作原理

eureka配置解析

instance配置

client配置

server配置

面板配置

eureka集羣配置

config方式配置:

eureka安全

eureka源碼分析


 

服務治理

服務治理可以說是微服務架構中最核心和基礎的模塊,它主要用來實現微服務實例的自動化註冊與發現。

服務註冊

在服務治理框架中,通常會有一個服務註冊中心,每個服務都會向服務註冊中心登記自己提供的服務的ip、port、版本、通信協議等信息,註冊中心會按照服務名分類組織服務清單。

服務發現

由於在服務治理框架下,服務之間的調用不再通過指定具體地址來實現,而是通過向服務名稱發起請求來調用服務。所以,服務調用方在調用服務的時候,並不知道具體的服務實例位置。因此,服務調用方需要向註冊中心查詢並獲取所有服務的實例清單,以實現對具體服務實例的訪問。

Eureka

Spring Cloud Eureka包含服務端和客戶端。Eureka服務端是服務的註冊中心。Eureka客戶端是服務的producer和consumer。Eureka服務端通過註解和參數配置的方式嵌入到了客戶端應用程序中,所以Eureka的server就是一個應用程序。

工作原理

1、初始化client,當producer和consumer啓動的時候,會向Eureka的server發送自己的實例信息,包括:IP、port、版本、通行協議等

2、eureka server管理實例信息,eureka server會將所有的實例信息按照服務名分類然後來維護一個實力列表

3、服務續約,當client註冊到eureka server以後,就會定時向Eureka server發送一個心跳,目的是刷新client的自己的狀態信息,也保證自己不會被Eureka server剔除服務列表

4、更新服務列表,client會定時從Eureka server同步實例列表,過程是先從Eureka server獲取增量信息,然後個本地的實例列表比較併合並。所以可知,服務列表是被緩存在client本地的,並不是每次訪問都會向Eureka server請求一次信息

5、服務下線,下線時會通知Eureka server,將實例從實例列表中剔除

eureka配置解析

eureka的配置分爲四部分:instance配置、client配置、server配置、面板配置,這裏只有一下常用的配置項的分析,更多的配置項的介紹可以參考:http://www.majunwei.com/view/201808130827002632.html

instance配置

instance配置信息全部保存在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean類中,在instance的配置中最常用的就是下面的三個配置:

屬性 默認值 屬性的作用
lease-expiration-duration-in-secondes 90 定義租約到期時間,就是該時間沒有續租就認爲實例租約到期,就會被剔除
lease-renewal-interval-in-secondes 30 定義續約任務的執行時間間隔,就是心跳的時間間隔
prefer-ip-address false 設置爲true表示使用ip地址作爲註冊中心的地址

注意:eureka.instance.lease-renewal-interval-in-seconds=30設置的是心跳時間,不是用來設置真正client獲取服務和刷新client上的服務清單換緩存的時間間隔。心跳和耍緩存是分開的,通過後面的源碼分析我們接可以知道,它們是DiscoveryClient類中initScheduledTasks()方法中的兩個timer完成的。刷緩存的時間是通過eureka.client.registry-fetch-interval-seconds屬性來設置的,後面的client配置中後介紹。

client配置

client配置信息全部保存在org.springframework.cloud.netflix.eureka.EurekaClientConfigBean類中。client可能是producer也可能是consumer,其中一些配置是當client無論是producer還是從consumer的時候都需要配置的

屬性 默認值 屬性作用
register-with-eureka true 是否將本client組冊到註冊中心
fetch-registry true 是否從組冊中心獲取服務清單
region us-east-1 client所屬區域,可以自定義設置,比如:region=chengdu
availability-zones defaultZone 註冊中心的可用分區,多個之間用逗號分割,但是配置時的格式是:availability-zones.chengdu=zone1,zone2,zone3
service-url defaultZone

註冊中心的分區地址,有一個默認分區defaultZone,我們也可以使用自定義的分區,比如:service-url.zone1=http://ip1:port/eureka,http://ip1:port/eureka

cache-refresh-executor-exponential-back-of-bound 10 緩存refresh的最大延遲倍數,
registry-fetch-interval-seconds 30 client從註冊中心獲取實例信息的時間間隔,就是刷新緩存的時間間隔
     

1、以上的register-with-eureka和fetch-registry兩個配置的作用是:是否將client註冊到註冊中心和是否從註冊中心獲取服務清單,一般我們在單節點的時候,會將這兩個屬性都設置爲false,否則在啓動的時候會打印異常,但是還是可以啓動。當集羣部署註冊中心的時候,就需要將這兩個屬性都設置爲true,這樣register之間可以相互同步服務清單。

2、以上region、availability-zones和service-url三個屬性配置的作用是:配置client註冊的區域和分區,如果不設置region和availability-zones,那麼就會使用默認的區域和分區,默認的區域是us-east-1,分區是defaultZone。eureka通過這種region和zone的設計有利於服務的區域性故障容錯。因爲client在訪問服務的時候,優先訪問自己所在局點下的服務,如果在自己所在局點下沒有可以使用的producer,那麼就訪問其他局點下的producer,這樣可以實現區域性故障的容錯集羣。

3、registry-fetch-interval-seconds和cache-refresh-executor-exponential-back-of-bound這兩個配置屬性的作用是:用來設置來consumer刷緩存的時間間隔,因爲所有的

eureka-server-total-connections 200 register的總連接
eureka-server-total-connections-per-host 50 單臺register replica的連接總數

上面連個屬性配置的作用需要驗證

屬性 默認值 屬性作用
healthcheck.enabled false 是否開啓健康檢查

上面的這一個配置是健康檢查的配置項

eureka的健康檢查分爲兩類:producer是否掛了、producer是否正常提供服務

producer是否掛了:這個檢查通過eureka的心跳和剔除機制就能實現

producer是否正常提供服務:這個需要spring-boot-starter-actuator模塊來提供,我們只需要在pom文件中導入spring-boot-starter-actuator的依賴,然後配置eureka.client.healthcheck.enabled=true開啓健康檢查就可以了。

server配置

server配置其實就是registry配置,server的配置信息全部保存在org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean類中。在registry中會維護一份服務清單,同時還會維護一份只讀的服務清單,當有client請求服務清單的時候,registry響應client的是這一份只讀的服務清單。server的配置項很多,常用的就是下面兩項。

屬性 默認值 屬性作用
enable-self-preservation true 是否開啓自我保護機制
renewal-percent-threshold 0.85 設置自我保護續約比例的閾值,該值只有當enable-self-preservation被設置爲真的時候纔有效
     

以上兩項配置是registry的自我保護的配置,有時候我們通過baseboard查看eureka registry的時候會出現下面的紅色警告:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

該警告出現的原因是Renews (last min)與Renews threshold的比值小於eureka.server.renewalPercentThreshold屬性設置的比例的時候,註冊中心會開啓自我保護功能(selt-preservation),該狀態下的註冊中心不會刪除服務清單中的任何一個producer的信息,這可能會導致實例已經掛了,但是還在註冊中心中。

eureka.server.renewalPercentThreshold屬性的默認值爲0.85。

Renews (last min):表示註冊中心上一分鐘收到的心跳

Renews threshold:表示註冊中心期望每分鐘收到的心跳,Renews threshold = 2*n+1,n表示client的數量

面板配置

baseboard一般我們都是使用默認配置

eureka集羣配置

eureka的集羣化是通過註冊中心之間的相互註冊來實現的,將自己作爲client註冊到註冊中心,然後同步註冊中心的服務清單,這樣就可以實現所有註冊中心之間服務清單的相互同步了。

eureka的集羣配置方式分爲兩種:config方式、DNS方式。DNS方式需要配置DNS服務器,所以一般就使用config的方式配置集羣,但是config的方式有一個問題,就是不能動態地增加register server到集羣中,每次增加節點的時候都需要修改register的配置文件。

具體是使用config方式還是使用DNS方式,是通過use-dns-for-fetching-service-urls配置項來指定的。通過下面的源碼就可以知道。

在這個方法中:DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args, Provider<BackupRegistry> backupRegistryProvider, EndpointRandomizer endpointRandomizer)

    if (this.clientConfig.shouldUseDnsForFetchingServiceUrls()) {
        azToRegionMapper = new DNSBasedAzToRegionMapper(this.clientConfig);
    } else {
        azToRegionMapper = new PropertyBasedAzToRegionMapper(this.clientConfig);
    }
eureka-server-url-context null 當採用DNS搭建集羣時,
eureka-server-port null 當採用DNS搭建集羣時,
eureka-server-DNS-name null 當採用DNS搭建集羣時,
use-dns-for-fetching-service-urls false 是否使用DNS機制來獲取“實例信息列表”

config方式配置:

server:
  port: 58801

spring:
  application:
    name: eureka-registry

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    healthcheck:
      enabled: true
    region: chengdu
    availability-zones:
      chengdu: zone1,zone2
    service-url:
      zone1: http://192.168.1.194:58801,http://192.168.1.194:58802
      zone2: http://192.168.1.194:58801,http://192.168.1.194:58802

eureka安全

現在的eureka集羣是處於裸奔狀態,沒有任何保護機制,只要知道了eureka的服務註冊地址就可以將服務註冊到註冊中心上,沒有任何的保護措施。

在實際生產過程中我們可以將註冊中心部署到內網,然後將服務網關部署到外網,從而實現基本的保護作用。但是我們開可以通過另一種方式來保護eureka registry,就是通過spring-security給eureka registry提供安全認證。

在加入來eureka的安全校驗之後,需要將server-url中的地址按照這種個是寫:http://<username>:<password>@ip:port/eureka

https://www.cnblogs.com/linjiqin/p/10085847.html

eureka源碼分析

在eureka的工作中有四個最重要的動作:註冊,續約,刷緩存,剔除

註冊:就是client註冊到register的過程

續約:就是client註冊成功以後,需要定時給register發送心跳,以避免自己被register從服務清單中剔除

刷緩存:就是client定時從register獲取服務清單,來刷新自己緩存的服務清單

剔除:就是register會定時檢查租約,如果超出來lease-expiration-duration-in-secondes設置的時間還沒有續約就會被從服務清單剔除

這四個動作中,註冊和續約是在同一個if條件中完成的,如果組成成功就啓動續約的timer,續約只是發心跳,不會獲取服務清單。刷緩存和續約是獨立的,它們是在兩個不同的timer中執行的。

 

 

彩蛋:

SpringCloud官方文檔:https://projects.spring.io/spring-cloud/spring-cloud.html#_features

SpringCloud系列博客:http://blog.didispace.com/spring-cloud-learning/

SpringCloud-Eureka博客:http://blog.didispace.com/springcloud-sourcecode-eureka/

 

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