在上兩篇文章中,咱們已經搭建起微服務架構中的核心組件 服務註冊 中心(包括單節點模式和高可用模式)。同時, 還對上一章中實現的Spring Boot入門程序 作了改造。 經過簡單的配置,使該程序註冊到Emeka註冊中心上,成爲該服務治理體系下 的一個服務,命名爲hello-service。 如今咱們已經有了服務註冊中心和服務提供者, 下面就來嘗試構建一個服務消費者,它主要完成兩個目標,發現服務以及消費服務。其中, 服務發現的任務由Eureka的客戶端完成,而服務消費的任務由ribbon完成。Ribbon是一個基 千HTTP和TCP的客戶端負載均衡器,它能夠在經過客戶端中配置的 ribbonServerList 服務端列表去輪詢訪問以達到均衡負載的做用。 當Ribbon與Eureka聯合使用時,ribbon 的服務實例清單ribbonServerList會被DiscoveryEnabledNIWSServerList重寫, 擴展成從Eureka註冊中心中獲取服務端列表。 同時它也會用 NIWSDiscoveryPing 來取代IPing, 它將職責委託給Eureka來肯定服務端是否已經啓動。 java
下面咱們經過構建一個簡單的示例,看看在Eureka的服務治理體系下如何實現服務的 發現與消費。web
• 首先,咱們作一些準備工做 。啓動以前實現的服務註冊中心 eureka-server以及 hello-service服務,爲了實驗ribbon的客戶端負載均衡功能, 咱們經過 java -jar命令行的方式來啓動兩個不一樣端口的hello-service, 具體以下: spring
java -jar Eureka-0.0.1-SNAPSHOT.jar --server.port=8081
java -jar Eureka-0.0.1-SNAPSHOT.jar --server.port=8082
• 在成功啓動兩個hello-service服務以後, 以下圖所示,從Eureka信息面板中 能夠看到名爲HELLO-SERVICE的服務中出現了兩個實例單元,分別是經過命令行 啓動的8081端口和8082端口的服務。 架構
• 建立一個 Spring Boot 的基礎工程來實現服務消費者, 取名爲 ribbon-consumer, 並在 pom.xml 中引入以下的依賴內容。 較以前的 hello-service, 咱們新增了 Ribbon 模塊的依賴spring-cloud-starter-ribbon。 app
pom.xml負載均衡
• 建立應用主類ConsumerApplication, 經過@EnableDiscoveryClient註解 讓該應用註冊爲 Eureka客戶端應用, 以得到服務發現的能力。 同時, 在該主類中創 建RestTemplate的 Spring Bean 實例,並經過@LoadBalanced 註解開啓客戶端 負載均衡。框架
• 建立ConsumerController類並實現/ribbon-consumer接口。 在該接口中, 經過在上面建立的RestTemplate 來實現對 HELLO-SERVICE服務提供的 /hello接口進行調用。 能夠看到這裏訪問的地址是服務名HELLO-SERVICE,而 不是一個具體的地址,在服務治理框架中, 這是一個很是重要的性特。 微服務
• 在application.properties中配置Eureka服務註冊中心的位置, 須要與以前 HELLO-SEVRCIE 同樣, 否則是發現不了該 服務的,同時設置該消費者的端口爲 9000, 不能與以前啓動的應用端口衝突。 spa
• 啓動ribbon-consumer 應用後, 咱們能夠在 Eureka 信息面板中看到, 當前除了 HELLO-SERVICE 以外, 還多了咱們實現的RIBBON-CONSUMER服務。 命令行
• 經過向 http://localhost:9000/ribbon-consumer 發起 GET 請求, 成功返 回了 "Hello World"。 此時, 咱們能夠在 ribbon-consumer 應用的控制檯中看到 以下信息, Ribbon 輸出了當前客戶端維護的 HELLO-SERVICE 的服務列表狀況。其 中包含了各個實例的位置, ribbon 就是按照此信息進行輪詢訪問, 以實現基千客戶 端的負載均衡。 另外還輸出了一些其餘很是有用的信息, 如對各個實例的請求總數 量、 第一次鏈接信息、 上一次鏈接信息、 總的請求失敗數量等。
再嘗試發送幾回請求, 並觀察啓動的兩個 HELLO-SERVICE 的控制檯, 能夠看到兩個控 制臺會交替打印下面的日誌, 這是咱們以前在 HelloController 中實現的對服務信息的輸 出, 能夠用來判斷當前豆bbon-consumer 對HELLO-SERVICE 的調用是不是負載均衡的。
com.didispace.web.HelloController : /hello , host:PC-201807022055
service id:hello-service