服務治理-> Spring Cloud Eureka

  • 服務治理->搭建服務註冊中心

    服務治理能夠說是微服務架構中最爲核心和基礎的模塊, 它主要用來實現各個微服務 實例的自動化註冊與發現。 爲何咱們在微服務架構中那麼須要服務治理模塊呢?微服務 系統沒有它會有什麼很差的地方嗎?spring

    在最初開始構建微服務系統的時候可能服務並很少, 咱們能夠經過作一些靜態配置來 完成服務的調用。 好比,有兩個服務 A 和 B, 其中服務 A 須要調用服務 B 來完成一個業務 操做時, 爲了實現服務 B 的高可用, 不論採用服務端負載均衡仍是客戶端負載均衡, 都需 要手工維護服務 B 的具體實例清單。 可是隨着業務的發展, 系統功能愈來愈複雜, 相應的 微服務應用也不斷增長, 咱們的靜態配置就會變得愈來愈難以維護。 而且面對不斷髮展的業務, 咱們的集羣規模、 服務的位置 、 服務的命名等都有可能發生變化, 若是仍是經過手 工維護的方式, 那麼極易發生錯誤或是命名衝突等問題。 同時, 對於這類靜態內容的維護 也必將消耗大量的人力。緩存

    爲了解決微服務架構中的服務實例維護問題, 產生了大量的服務治理框架和產品。 這 些框架和產品的實現都圍繞着服務註冊與服務發現機制來完成對微服務應用實例的自動化管理。架構

    • 服務註冊:在服務治理框架中, 一般都會構建一個註冊中心, 每一個服務單元向註冊 中心登記本身提供的服務, 將主機與端口號、 版本號、 通訊協議等一些附加信息告 知註冊中心, 註冊中心按服務名分類組織服務清單。 好比, 咱們有兩個提供服務A 的進程分別運行於 192.168.0.100:8000和192.168.0.101:8000位置上, 另外還有三個 提供服務B的進程分別運行千192.168.0.100:9000 、 192.168.0.101:9000、 192.168.0.102:9000位置上。 當這些進程均啓動, 並向註冊中心註冊本身的服務以後, 註冊中心就會維護相似下面的一個服務清單。 另外, 服務註冊中心還須要以心跳的方式去監測清單中的服務是否可用, 若不可用 須要從服務清單中剔除, 達到排除故障服務的效果。app

   服務名                                                              位置 負載均衡

   服務A                                 192.168.0.100:8000、192.168.0.101:8000框架

   服務B                         192.168.0.100:9000、192.168.0.101:9000、192.168.0.102:9000異步

 

    • 服務發現:因爲在服務治理框架下運做, 服務間的調用再也不經過指定具體的實例地 址來實現, 而是經過向服務名發起請求調用實現。 因此, 服務調用方在調用服務提 供方接口的時候, 並不知道具體的服務實例位置。 所以, 調用方須要向服務註冊中 心諮詢服務, 並獲取全部服務的實例清單, 以實現對具體服務實例的訪問。 好比, 現有服務C但願調用服務A, 服務C就須要向註冊中心發起諮詢服務請求, 服務注 冊中心就會將服務A的位置清單返回給服務C, 如按上例服務A的狀況,C便得到 了服務A的兩個可用位置 192.168.0.100:8000和192.168.0.101:8000。 當服務C要發起調用的時候, 便從該清單中以某種輪詢策略取出一 個位置來進行服 務調用, 這就是後續咱們將會介紹的客戶端負載均衡。 這裏咱們只是列舉了一種簡 單的服務治理邏輯, 以方便理解服務治理框架的基本運行思路。 實際的框架爲了性 能等因素, 不會採用每次都向服務註冊中心獲取服務的方式, 而且不一樣的應用場景 在緩存和服務剔除等機制上也會有一些不一樣的實現策略。分佈式

   Spring Cloud Eureka, 使用Netflix Eureka來實現服務註冊與發現, 它既包含了服務端組件,也包含了客戶端組件,而且服務端與客戶端均採用Java編寫,因此Eureka主要適用 於經過Java實現的分佈式系統,或是與NM兼容語言構建的系統。可是, 因爲Eureka服 務端的服務治理機制提供了完備的RESTfulAPL因此它也支持將非Java語言構建的微服 務應用歸入Eureka的服務治理體系中來。只是在使用其餘語言平臺的時候,須要本身來實 現Eureka的客戶端程序。不過慶幸的是,在目前幾個較爲流行的開發平臺上,都已經有了 一些針對Eureka 註冊中心的客戶端實現框架, 好比.NET平臺的 Steeltoe、 Node.js 的 eureka-js-client等。spring-boot

    Eureka服務端,咱們也稱爲服務註冊中心。 它同其餘服務註冊中心同樣,支持高可用 配置。它依託於強一致性提供良好的服務實例可用性,能夠應對多種不一樣的故障場景。 如 果Eureka以集羣模式部署,當集羣中有分片出現故障時,那麼Eureka就轉入自我保護模 式。它容許在分片故障期間繼續提供服務的發現和註冊,當故障分片恢復運行時, 集羣中 的其餘分片會把它們的狀態再次同步回來。以在AWS 上的實踐爲例, Netflix推薦每一個可 用的區域運行一個Eureka服務端,經過它來造成集羣。不一樣可用區域的服務註冊中心經過 異步模式互相複製各自的狀態,這意味着在任意給定的時間點每一個實例關於全部服務的狀 態是有細微差異的。微服務

    Eureka客戶端,主要處理服務的註冊與發現。客戶端服務經過註解和參數配置的方式, 嵌入在客戶端應用程序的代碼中,在應用程序運行時,Eureka客戶端向註冊中心註冊自身 提供的服務並週期性地發送心跳來更新它的服務租約。同時,它也能從服務端查詢當前注 冊的服務信息並把它們緩存到本地並週期性地刷新服務狀態。

    下面咱們來構建一些簡單示例,學習如何使用Eureka構建註冊中心以及進行註冊與發 現服務。

搭建服務註冊中心

    首先,建立一個基礎的Spring Boot工程,命名爲eureka-server, 並在pom.xml 中引入必要的依賴內容, 代碼以下:

<parent>        
    <groupId>org.springframework.boot</groupId>        
    <artifactId>spring-boot-starter-parent</artifactId>        
    <version>1.5.10.RELEASE</version>        
    <relativePath/> <!-- lookup parent from repository -->    
</parent>
 <dependency>          
     <groupId>org.springframework.cloud</groupId>           
     <artifactId>spring-cloud-starter-eureka-server</artifactId>           
     <version>1.4.4.RELEASE</version>        
 </dependency>
 <dependencyManagement>    
     <dependencies>            
         <dependency>                
             <groupId>org.springframework.cloud</groupId>                
             <artifactId>spring-cloud-dependencies</artifactId>                
             <version>Brixton.SR7</version>                
             <type>pom</type>                
             <scope>import</scope>            
         </dependency>        
     </dependencies>    
 </dependencyManagement>

 

經過@EnableEurekaServer 註解啓動一個服務註冊中心提供給其餘應用進行對話。 這一步很是簡單, 只需在一個普通的 Spring Boot 應用中添加這個註解就能開啓此功能, 比 以下面的例子:

https://img2.mukewang.com/5b3075210001800107820526.jpg

    在默認設置下, 該服務註冊中心也會將本身做爲客戶端來嘗試註冊它本身,因此咱們 須要禁用它的客戶端註冊行爲, 只需在 application.properties 中增長以下配置:

https://img.mukewang.com/5b308a540001042808990530.jpg

• eureka.client.register-with-eureka: 因爲該應用爲註冊中心,因此設置 爲 false, 表明不向註冊中心註冊本身。

• eureka.client.fetch-registry: 因爲註冊中心的職責就是維護服務實例, 它並不須要去檢索服務, 因此也設置爲 false。

   在完成了上面的配置後,啓動應用並訪問 http://localhost: 8081/。能夠看到Eureka 信息面板, 其中 Instances currently registered with Eureka 欄是空的, 說明該註冊中心尚未註冊任何服務。

https://img3.mukewang.com/5b30c3410001fd4f18750971.jpg

  • 服務治理->註冊服務提供者

在完成了服務註冊中心的搭建以後,接下來咱們嘗試將一個既有的 Spring Boot 應用加 入 Emeka 的服務治理體系中去。

  • 新建一個新的Spring Boot 項目

https://img2.mukewang.com/5b30cc9b0001e63204150329.jpg

  • 首先, 修改 pom.xml, 增長 Spring Cloud Eureka 模塊的依賴, 具體代 碼以下所示:

https://img1.mukewang.com/5b30ccdc0001e2eb07730761.jpg

  • 接着, 建立HelloContorller   , /hello 請求處理接口, 經過注入 DiscoveryClient對象, 在日誌中打 印出服務的相關內容。

https://img3.mukewang.com/5b30cd8900017d1108500500.jpg

  • 而後, 在主類中經過加上 @EnableDiscoveryClient 註解, 激活 Eureka 中的 DiscoveryClient 實現(自動化配置, 建立 DiscoveryClient 接口針對 Eureka 客戶 端的 EurekaDiscoveryClient 實例), 才能實現上述 Controller 中對服務信息的輸出。

https://img4.mukewang.com/5b30cde30001cb3f07390496.jpg

  • 最後 ,咱們須要在 application. yml 配置文件中, 通 過 spring. application.name屬性來爲 服 務命名, 好比命名 爲 hello-service。 再經過 eureka.client. serviceUrl.defaultZone屬性來指定服務註冊中心的地址, 這裏 咱們指定爲以前構建的服務註冊中心地址, 完整配置以下所示:

https://img3.mukewang.com/5b30ce2300019e5005930339.jpg

訪問地址:http://localhost:8081/

https://img3.mukewang.com/5b30cf2c00016f6b10950082.jpg

 

https://img2.mukewang.com/5b30ce8300013a6618290903.jpg

相關文章
相關標籤/搜索