前言
前面完成了商品和用戶微服務的註冊發現,是基於點對點的微服務之間的調用,那麼在實際場景中微服務都是集羣部署的,調用關係如下圖所示:
看到這裏大家會想到不就是負載均衡嘛!項目中經常用Nginx來解決圖中的服務集羣問題,那如果有1000+甚至10000+的服務呢?每增加一個服務要去Nginx裏面配置一下,然後重啓?額…想想都頭皮發麻!並且Nginx的負載均衡模式和本文將要講的是有區別的。
那麼本章將會用到Ribbon組件來解決上述問題。
Ribbon簡介及使用場景
Ribbon通俗來講就是一個負載均衡器,用來控制HTTP和TCP客戶端行爲,Ribbon從配置服務提供者列表庫(例如:Eureka、Zookeeper)去獲取服務配置信息,基於負載均衡算法計算出要請求的目標服務地址。
在Spring Cloud中Ribbon通常配合Eureka使用,Ribbon可以自動從Eureka Server獲取服務提供者地址列表,並基於負載均衡算法,選擇其中一個服務提供者實例。下圖展示了Ribbon與Eureka配合使用時的大致架構。
Spring Cloud集成Ribbon
第一步:複製商品和用戶微服務項目
複製項目microservice-consumer-goods,將pom.xml文件中ArtifactId內容修改爲 microservice-consumer-goods-ribbon 。如下圖所示:
複製項目microservice-provider-user,將pom.xml文件中ArtifactId 內容修改爲microservice-provider-user-ribbon。如下圖所示:
備註:記得修改端口,不然啓動會出現端口衝突問題。
第二步:添加Ribbon依賴
由於 spring-cloud-starter-netflix-eureka-client 已經包含 spring-cloud-starter-netfilx-ribbon ,這一步可以省略。
第三步:在RestTemplate上增加@LoadBalanced註解支持
MicroserviceConsumerGoodsRibbonApplication.java
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
};
對的,你沒看錯,到這裏就結束了!只需要添加LoadBalanced註解就可以讓RestTemplate整合Ribbon。
第四步: 修改調用用戶微服務
GoodsController.java
@GetMapping("/goods/{id}")
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://microservice-provider-user/simple/"+id,User.class);
}
前面我們在調用用戶微服務的時候採用的是IP+端口+目標服務端點的方式,這裏將請求目標改爲http://{目標服務名稱}/{目標服務端點} 的形式。這樣的話Ribbon會自動在實際調用時,將目標服務名替換爲該服務的IP和端口。
第五步:啓動測試
- 啓動microservice-discovery-eureka
- 啓動microservice-provider-user
- 啓動microservice-provider-user-ribbon
- 啓動microservice-consumer-goods-ribbon
如上圖所示,2個用戶微服務和1個商品微服務都註冊到了Eureka Server,由於2個用戶微服務的名稱都是microservice-provider-user那麼會自動識別爲同一個集羣服務,也就是上面商品微服務調用用戶微服務的目標服務名稱。
訪問http://127.0.0.1:8091/goods/2
10次,會發現兩個用戶微服務示例都會打印日誌並且是每個被請求5次。
配套代碼
主代碼庫:https://github.com/yundianzixun/spring-cloud-study
商品微服務:https://github.com/yundianzixun/spring-cloud-study/tree/master/microservice-consumer-goods-ribbon
Eureka Server:https://github.com/yundianzixun/spring-cloud-study/tree/master/microservice-discovery-eureka
用戶微服務1:https://github.com/yundianzixun/spring-cloud-study/tree/master/microservice-provider-user
用戶微服務2:https://github.com/yundianzixun/spring-cloud-study/tree/master/microservice-provider-user-ribbon