javascript
Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
文章目錄
- 概述
- Ribbon演示
- 服務提供者微服務改造為使用MySql數據庫
- 新建服務消費者微服務,配置Ribbon
- 注意事項
- 源碼
概述
Spring Cloud-03將微服務注冊到Eureka Server上 + 為Eureka Server添加用戶認證中遺留的問題還記得吧 ,對,服務消費者調用服務提供者是硬編碼的方式,雖然把地址配置到了application.yml中,但是一旦服務端的地址發生改變,那肯定是要修改配置文件的。
如何解決呢? Spring Cloud整合了Ribbon.
Ribbon是Nextflix發布的負載均衡器,為Ribbon配置服務提供者地址后,Ribbon就可以基于某種負載均衡的算法,自動幫助服務消費者請求。
Ribbon支持輪詢、隨機等負載均衡算法,當然也支持實現自定義的負載均衡算法。
在Spring Cloud中,當Ribbon和Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者的地址列表,并基于某種負載均衡算法,請求其中一個服務提供者實例。
Ribbon演示
服務提供者微服務改造為使用MySql數據庫
當然了,這一步不是必須的。
Step1 修改pom.xml增加mysql的依賴
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency>Step2: applicaiton.yml中關于數據庫的部分調整為
spring:datasource:url: jdbc:mysql://localhost:3306/artisan?useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver新建服務消費者微服務,配置Ribbon
Step1: 在maven父工程上右鍵新建maven module ,名稱為:micorservice-consumer-movie-ribbon
Step2: pom.xml引入ribbon依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>Step3: 為RestTemplate添加@LoadBalanced注解
只需要為RestTemplate添加@LoadBalanced注解,就可以為RestTemlate整合Ribbon,使其具備負載均衡的能力
Step4: 修改Controller層代碼,將地址調整為注冊在Eureka上的虛擬主機名
package com.artisan.microservice.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;import com.artisan.microservice.model.User;import lombok.extern.slf4j.Slf4j;@RestController @Slf4j public class MovieController {@Autowiredprivate RestTemplate restTemplate;@AutowiredLoadBalancerClient loadBalancerClient;@GetMapping("/movie/{id}")public User findById(@PathVariable Long id) {// 調用注冊在Eureka上的服務端的地址return this.restTemplate.getForObject("http://microservice-provider-user/user/" + id, User.class);}@GetMapping("/callProvider")public String callUserInstance() {ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");// 打印當前選擇的哪個節點log.info("serviceId: {} , host: {} ,port: {} ,uri: {}" ,serviceInstance.getServiceId() , serviceInstance.getHost(), serviceInstance.getPort(),serviceInstance.getUri());return serviceInstance.getUri().toString();} }我們把地址修改為了http://microservice-provider-user/user , 其中
microservice-provider-user用戶微服務的虛擬主機名,是注冊在Eureka Server上的名字,也是服務提供者微服務的配置文件中配置的spring.application.name
當Ribbon和Eureka同時使用時,會自動將虛擬主機名映射為微服務的網絡地址。
同時為了更加直觀的獲取當前選擇的用戶微服務節點,我們新增加了個方法callProvider,待會測試就可以看到效果了。
Step5: 驗證Ribbon提供的能力
1.啟動Eureka Server
2.啟動兩個 microservice-provider-user實例 。(在STS中啟動一個后,修改下application.yml的端口,再次run as spring boot app 即可啟動第二個實例,以此類推)
3.啟動microservice-provider-movie-ribbon
4.訪問Eureka Server的頁面,查看是否注冊成功
http://localhost:8761/login
登錄后,可以看到2個服務提供者,1個服務消費者都成功的注冊到了Eureka Server上。
我們在服務消費者微服務,調用的地址為
,對應兩個服務提供者的地址。
同時我們在服務消費者微服務工程中,為RestTemplate標注了@LoadBalanced注解,所以會使用Ribbon的負載均衡算法來分發到不同的服務提供者地址
多次訪問 http://localhost:7902/movie/1 ,觀察控制臺每個節點的日志輸出情況。
同時訪問http://localhost:7902/callProvider
注意事項
默認情況下,虛擬主機名和服務名稱是一致的,也可以通過eureka.instance.virtual-host-name或者eureka.instance.secure-virtual-host-name指定虛擬主機名
不能將restTemplate.getForObject()和loadBalancerClient寫在同一個方法中,兩者會沖突,因為RestTemplate實際上是一個Ribbon客戶端,本身已經包含了choose的行為
虛擬主機名不能包含"_"之類的字符,否則Ribbon再調用的時候會拋出異常
源碼
https://github.com/yangshangwei/SpringCloudMaster
總結
以上是生活随笔為你收集整理的Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud【Finchle
- 下一篇: Spring Cloud【Finchle