代碼地址:https://gitlab.com/showkawa/architect/tree/master/microservice/eurakegit
基於springcloud2分析eurake知識點分三部分:eurake高可用集羣搭建, eurake的自我保護機制 ,eurake的原理分析web
1.eurake高可用集羣搭建
高可用註冊中心
在微服務中,註冊中心很是核心,能夠實現服務治理,若是一旦註冊出現故障的時候,可能會致使整個微服務沒法訪問,在這時候就須要對註冊中心實現高可用集羣模式。spring
Eureka高可用原理
默認狀況下Eureka是服務註冊中心,默認是註冊本身(默認配置register-with-eureka: true)緩存
###由於該應用爲註冊中心,不須要註冊本身 register-with-eureka: false ###不須要去註冊中心上檢索服務 fetch-registry: true
Eureka高可用實際上將本身做爲服務向其餘服務註冊中心註冊本身,這樣就能夠造成一組相互註冊的服務註冊中心,從而實現服務清單的互相同步,達到高可用效果。服務器
Eureka集羣環境搭建
Eureka 1 配置
###服務端口號 server: port: 9100 ###eureka 基本信息配置 spring: application: name: brian-eureka-server eureka: instance: ###註冊到eurake ip地址 hostname: 127.0.0.1 client: serviceUrl: defaultZone: http://127.0.0.1:9200/eureka/ ###集羣裏面eurake相互註冊 register-with-eureka: true ###集羣相互註冊下,須要檢索服務 fetch-registry: true
Eureka 2 配置
###服務端口號 server: port: 9200 ###eureka 基本信息配置 spring: application: name: brian-eureka-server eureka: instance: ###註冊到eurekaip地址 hostname: 127.0.0.1 client: serviceUrl: defaultZone: http://127.0.0.1:9100/eureka/ ###集羣裏面eurake相互註冊 register-with-eureka: true ###集羣相互註冊下,須要檢索服務
fetch-registry: true
客戶端集成Eureka集羣配置
server: port: 8012 ###服務別名----服務註冊到註冊中心名稱 spring: application: name: brian-member-server eureka: client: service-url: ##### 將會員服務註冊到eureka服務地址 defaultZone: http://localhost:9200/eureka,http://localhost:9100/eureka ### 須要將個人服務註冊到eureka上 register-with-eureka: true ####須要檢索服務 fetch-registry: true
Maven配置
服務端配置
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 注意: 這裏必需要添加, 否者各類依賴有問題 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
客戶端配置
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
測試eurake集羣
開啓5個服務,註冊中心2個 EurakeServerApplication 01和02 ,會員member服務2個, 訂單order服務1個網絡
查看註冊中心端口 9100,此時上面只顯示有9200eurake的註冊信息,說明如今該9100端口的註冊中心是備機app
查看註冊中心端口 9200,此時上面只顯示有全度啓動的服務的註冊信息jvm
此時使用訂單服務order採用RestTemplate方式調用會員服務member, 能夠看到會輪詢調用到兩個會員服務8011和8012端口的服務maven
如今咱們假設註冊中心9200的服務和會員服務8012服務同時不可用spring-boot
如今發現以前註冊的服務信息從9200的註冊中心轉移到了9100註冊中心上去了
原來的order仍然可用,只是如今的輪詢機制調用的是8011這個端口的會員member服務
因此說eurake在高可用方面仍是不錯的,經過簡單的配置就能夠實現一個高可用的集羣
2.eurake的自我保護機制
Eureka詳解
服務消費者模式
獲取服務
消費者啓動的時候,使用服務別名,會發送一個rest請求到服務註冊中心獲取對應的服務信息,讓後會緩存到本地jvm客戶端中,同時客戶端每隔30秒從服務器上更新一次。
能夠經過 registry-fetch-intevall-seconds=30參數進行修以經過eureka.client .registry-fetch-intevall-seconds該參數默認值爲30, 單位爲秒。
服務下線
在系統運行過程當中必然會面臨關閉或重啓服務的某個實例的狀況,在服務關閉期有咱們天然不但願客戶端會繼續調用關閉了的實例。因此在客戶端程序中,當服務實例過正常的關閉操做時,它會觸發一個服務下線的REST請求給Eureka Server, 告訴服務日中心:「我要下線了」。服務端在接收到請求以後,將該服務狀態置爲下線(DOWN),井該下線事件傳播出去。
服務註冊模式
失效剔除
有些時候,咱們的服務實例並不必定會正常下線,可能因爲內存溢出、網絡故障氣因使得服務不能正常工做,而服務註冊中心並未收到「服務下線」的請求。爲了從服務表中將這些沒法提供服務的實例剔除,Eureka Server 在啓動的時候會建立一個定時任務默認每隔一一段時間(默認爲60秒)將當前清單中超時(默認爲90秒)沒有續約的服務除出去
自我保護
當咱們在本地調試基於Eureka的程序時,基本上都會碰到這樣-一個問題, 在服務主中心的信息面板中出現相似下面的紅色警告信息( )
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY 'RERENENALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIREDTO BE SAFE.
實際上,該警告就是觸發了Eureka Server的自我保護機制。以前咱們介紹過,服務註冊到Eureka Server以後,會維護個心跳鏈接, 告訴Eureka Server本身還活着。Eureka Server在運行期間,會統計心跳失敗的比例在15分鐘以內是否低於85%若是出現低於的狀況單機調試的時候很容易知足,實際在生產環境上一般是因爲網絡不穩定致使,Eureka Server會將當前的實例註冊信息保護起來,讓這些實例不會過時,儘量保護這些註冊信-息。可是,在這段保護期間內實例若出現問題,那麼客戶端很容易拿到實際已經不存服務實例,會出現調用失敗的狀況,因此客戶端必需要有容錯機制,好比可使用請使用重試、斷路器等機制。
因爲本地調試很容易觸發註冊中心的保護機制,這會使得註冊中心維護的服務不會特別準確。因此,咱們在本地進行開發的時候,可使用eureka.server.enablp-self-preservation=false參數來關閉保護機制,以確保註冊中心能夠將不可用的例正確剔除。
關閉服務保護
Eureka服務器端配置 這裏以9100端口的註冊中心爲例,添加如下核心配置
server: # 開發測試時關閉自我保護機制,保證不可用服務及時踢出 enable-self-preservation: false eviction-interval-timer-in-ms: 2000
注意追加的內容是在根節點eureka下面追加的配置
Eureka客戶端配置 這裏以8011端口的會員服務爲例,添加如下核心配置
# 心跳檢測檢測與續約時間 # 測試時將值設置設置小些,保證服務關閉後註冊中心能及時踢出服務 instance: ###Eureka客戶端向服務端發送心跳的時間間隔,單位爲秒(客戶端告訴服務端本身會按照該規則) lease-renewal-interval-in-seconds: 1 ####Eureka服務端在收到最後一次心跳以後等待的時間上限,單位爲秒,超過則剔除(客戶端告訴服務端按照此規則等待本身) lease-expiration-duration-in-seconds: 2
這裏跟上面的配置同樣也是基於eureka做爲根節點追加的
此處就不一一截圖了,感興趣的能夠本身下載代碼測試
3.eurake的原理分析
1.當啓動eurake客戶端應用,好比上面說到的會員服務member,會把當前服務好比服務地址和端口以別名的註冊到註冊中心
2.當服務消費者好比上面說到的order訂單服務,在接口調用的時候,使用服務別名也就是service id去註冊中心獲取實際的rpc遠程調用地址
3. 服務消費者在獲取到實際的rpc遠程調用地址後,在本地使用HttpClient技術調用遠程接口
流程圖以下: