您好,登錄后才能下訂單哦!
這篇文章主要介紹“eureka服務治理的概念和用法是什么”,在日常操作中,相信很多人在eureka服務治理的概念和用法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”eureka服務治理的概念和用法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
[TOC]
分布式是現在互聯網架構的首選。在分布式中我們會有三方理論簡稱CAP
簡稱 | 全稱 | 解釋 |
---|---|---|
C | Consistency | 數據一致性 |
A | Availability | 可用性,性能 |
P | Partition tolerance | 分區容錯性 |
今天我們就來看看分布式中關于服務治理這塊的服務
在多個服務之間相互調用的時候比較零散,管理起來比較麻煩。當被調用者有所改動可能都會牽扯到調用者的修改。所以服務治理應運而生。
spring cloud的Eureka實現了服務注冊、服務調用、負載均衡、容錯。這也是服務治理模塊通用功能。
服務注冊和服務調用在eureka看來都是客戶端。eureka服務是服務端。所以他是一種典型的CS架構。eureka客戶端需要與eureka服務保持心跳機制。這樣eureka服務才會認為客戶端沒有宕機。
上述的架構圖可以清楚的看出,eureka服務端可集群化,服務提供者可以集群化。客戶端就沒必要集群化。就算集群化對于eureka服務來說也是單機的consumer。
service provider啟動時會將自己服務的信息封裝后注冊到eureka注冊中心上。service consumer已provider注冊名去注冊中心尋找到真實地址并進行調用。
針對service provider的管理對于service consumer來說不需要知道service provider的具體信息。只需要知道service provider的注冊名就行了。在我們集群化后也不用擔心provider我們具體的調用地址。負載均衡也是eureka幫我分配了。我們客戶端只負責接口的調用。
這里我們不做spring其他的解釋,詳細請看git分支詳細代碼
點我下載源碼
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
在我們新建的項目中pom文件中新增如上gva。就會將eureka服務端功能注入。下面我們只需要添加一些配置啟動就行了。
添加依賴后我們在springboot項目中yml中添加如下配置
eureka: instance: hostname: localhost client: register-with-eureka: false #表示該模塊作為eureka服務,自己是不需要想自己注冊的,注冊了只是徒增煩惱 fetch-registry: false # 表示自己就是注冊中心。自己是管理者不是被管理者。 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
最后我們在spiringboot啟動類上開啟eurekaserver就行了。@EnableEurekaServer
能夠訪問說明我們的eureka服務正常啟動。現在沒有客戶端注冊上來。所以現在看到DS Replicas列表是空的。
上面我們已經單機啟動了eureka服務。下面我們看看服務注冊是否可以。我們已之前payment模塊為例。
pom中添加client坐標
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
yml中填入地址
eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:7001/eureka
主啟動類上添加注解@EnableEurekaClient
現在我們多開幾個payment進行注冊
因為我們是在idea中開發的。還沒有打成jar包。也是為了方便調試這里通過idea直接復制的payment項目
現在我們看看我們本地idea啟動項目的情況 , payment已經有兩個了分別是8001,8002
現在我們看到eureka服務上也出現了8001,8002了
還記得我們的feature/cloud-pre上order模塊是如何調用payment的嗎。是的我們通過resetTemplate進行http方式調用的。現在我們還是通過他進行調用只不過調用地址是payment注冊在eureka上的服務名。
這里客戶端如何注冊和payment配置一樣的。因為雖然是order調用payment,但是對于eureka來說payment和order都是客戶端。所以配置都是一樣的。
現在在單機的eureka上我們看到了單機的order服務和集群的payment服務。下面我們order調用payment的地方做如下修改
只是調用跟地址進行了修改。當然前提是restTemplate支持了負載均衡。
下面結果如何讀者可以自行測試了。http://localhost/order/getpayment/123
針對這個接口調用多次。會發現返回結果里的服務端口會不斷的8001,8002切換。因為restTemplate默認是輪詢的。而我們這里payment提供了兩個服務。到這里我們就實現了eureka單機版的服務注冊及調用
上面是單機的eurake。下面我們看看eurake集群如何配置。對于eureka客戶端來說注冊到eureka集群上來說非常簡單。
eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:7001/eureka,http://www.eureka2/eureka
像上述一樣defaultZone后面直接追加eureka服務就行了。正常集群都是布置在不同機器上的。所以域名或者ip都是不同的。如果讀者在一臺機器上部署可以通過nginx將不同服務分配到不同域名下。因為在eureka服務端上配置需要用到域名。
客戶端是直接追加。eureka服務端改動也不是很多只需要將hostname配置唯一就行了。
eureka: instance: hostname: www.zxhtom1.com #eureka服務端的實例名字 client: register-with-eureka: false #表識不向注冊中心注冊自己 fetch-registry: false #表示自己就是注冊中心,職責是維護服務實例,并不需要去檢索服務 service-url: defaultZone: http://eureka7002.com:7002/eureka/
所以說如果是單機部署集群,我們就需要通過nginx轉發下。這里不贅述
剛才在部署集群的時候為了方便演示。我們借助idea啟動多個實例。在里面分配不同的端口。但是在部署eureka集群是就沒法搞了。因為需要改變配置文件內容。我們可以在啟動的時候指定外部配置文件
上面我們發現有兩個8002的payment。為什么會出現如此奇怪的問題呢。排查發現一開始我通過idea啟動了8001,8002。然后我又通過引入外部配置文件的方式重新啟動了8002。這個時候原來的8002實例其實已經掛了。這個時候eureka會認為出現50%的客戶端沒有準時發送心跳。50<85 這個時候eureka認為大批客戶端可能因為網絡波動導致沒有及時回復。eureka會開啟自我保護機制。
雖然上面是個反面列子。也恰恰說明了為什么需要自我保護。加入這個時候8002在其他機器上因為網絡延遲被踢出就會出現冤假錯案。所以這也解釋了為什么上述出現兩個8002.
自我保護的功能是默認開啟的。eureka.server.enable-self-preservation: false
我們通過此屬性設置false就是關閉自我保護。
其實上面兩個8002是一種意外。我們無意中觸發了自我保護。
自我保護機制條件 : 最近一分鐘收到心跳數線程占總線程85%以下。
低于85%說明沒有指定活躍數進行心跳回復,所以認為是網絡波動了。
自我保護的臨界值= renews(last min)/renews(threshold)
通過計算我們知道是75% 。 如果不算上正常的8002 。 那就是50% 。 所以不管怎么樣都會觸發自我保護的。
自我保護也滿足的開篇提到的CAP原理中的A理論。eureka滿足了高可用性原則。及時客戶端真的宕機了也要留下。寧可多留也不錯殺。這樣就會導致數據不一致的情況。
到此,關于“eureka服務治理的概念和用法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。