在上一篇筆記當中,已經成功使用了服務註冊和發現。但是所有微服務還是處於單點的狀態,我們也應該對微服務進行負載均衡,這是相當有必要的。SpringCloud 提供了Ribbon負載均衡器。它可以有助於控制HTTP和TCP客戶端的訪問行爲。爲Ribbon配置服務提供者地址後,Ribbon就可以基於負載均衡算法進行負載均衡。Ribbon默認提供了很多種負載均衡算法,輪詢、隨機等。Ribbon也可以使用自定義的負載均衡算法。
在SpringCloud中,當Ribbon於Eureka 配合使用時,Ribbon可以自動從Eureka Server 獲得服務提供者的地址列表,並基於特定的負載均衡算法,請求其中一個服務提供者。
一、整合Ribbon到微服務
如果你的微服務在MAVEN上已經整合了eureka,就不需要添加ribbon的依賴配置了。如果你想單獨使用ribbon你可以添加如下的maven依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ribbon</artifactId> </dependency>
事實上非常簡單,我們只需要在RestTemplate的bean當中,添加@LoadBalanced annotation即可:
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
然後然後開始測試,我們需要啓動超過兩個用戶服務系統,從而觀察會選擇哪個節點。筆者已經啓動了兩個用戶服務節點
我們在商品服務系統的測試controller當中,添加如下代碼測試是否存在負載均衡:
@Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/testInstance") public String testInstance() { ServiceInstance serviceInstance = this.loadBalancerClient.choose("tony-mall-provider-user"); String hostAndPort = serviceInstance.getHost() + ":" + serviceInstance.getPort() + "[id:" + serviceInstance.getServiceId() + "]"; return hostAndPort; }在幾次測試當中發現是輪詢的(只是估計):
192.168.28.100:8801[id:tony-mall-provider-user]
192.168.28.100:8801[id:tony-mall-provider-user]
在多次調用微服務的接口也是一樣,發現每次調用SQL的服務器都是不同的,從而發現已經實現了負載均衡。
二、Ribbon的配置
從Spring Cloud Netfilx 1.2.0開始 已經提供使用配置方式定義Ribbon:
配置前綴爲服務名稱,如用戶服務的名稱就爲:tony-mall-provider-user
例如:
tony-mall-provider-user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule事實上筆者目前的參考書上對配置部分講解還是相對模糊,後續筆者將會繼續參考其他書籍和官網文檔,將會基礎補充這一部分。
Ribbon可以脫離Eureka單獨使用,但是這裏我就不作演示了。