Ribbon簡介
分佈式系統中,各個微服務會部署多個實例,如何將服務消費者均勻分攤到多個服務提供者實例上,就要使用到負載均衡器
Ribbon 是負載均衡器,它提供了很多負載均衡算法,例如輪詢、隨即等,在配置服務提供者地址後,可以將服務消費者請求均勻的分發
為服務消費者整合Ribbon
添加Ribbon 依賴庫
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ribbobn</artifactId></dependency>
給RestTemplate 添加@LoadBalaced 註解,就可整合RestTemplate 和Ribbon
@Bean@LoadBalancedpublic RestTemplate restTemplate(){ return new RestTemplate();}修改Controller,請求地址修改為http://flim-user/user/ ,當Ribbon 和Eureka 配合使用時,會自動將虛擬主機名映射成微服務的網絡地址,並註入了LoadBalancerClient 輸出當前選擇的微服務節點
@RestControllerpublic class MovieController { private final Logger log = LoggerFactory.getLogger(MovieController.class); @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/user/{id}") public User findById(@PathVariable int id){ return this.restTemplate.getForObject("http://flim-user/"+id,User.class); } @GetMapping("/log-instance") public void logInstance(){ ServiceInstance serviceInstance = this.loadBalancerClient.choose("flim-user"); log.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort()); }}運行測試程序
{"id":1,"username":"account1","name":"張三","age":20,"balance":100.00}
多次訪問http://localhost:8010/log-instance 控制台會輸出以下信息
可以看到請求會均勻的分佈到兩個用戶微服務上
2017-12-17 20:47:53.975 INFO 12313 --- [nio-8010-exec-2] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 20:47:54.215 INFO 12313 --- [nio-8010-exec-1] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 20:47:54.445 INFO 12313 --- [nio-8010-exec-3] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 20:47:54.690 INFO 12313 --- [nio-8010-exec-4] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 20:47:54.935 INFO 12313 --- [nio-8010-exec-5] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
注意:不能將restTemplate.getForObject(...) 與loadBalancerClient.choose(...) 寫在同一方法中,因為rest-Template 實際上就是一個Ribbon 客戶端,本身已經包含“choose”行為
代碼方式配置Ribbon
可以使用Java代碼或屬性自定義Ribbon 的配置,Ribbon 默認配置類是RibbonClientConfiguration,也可以使用一個POJO 自定義Ribbon 配置,這種配置是細粒度的,不同的Ribbon 客戶端可以使用不同的配置
創建Ribbon 配置類
/** * 該類為配置類* 不應該被ComponentScan掃描*/@Configurationpublic class RibbonConfiguration { @Bean public IRule ribbonRule(){ //配置負載均衡的規則,更改為隨機return new RandomRule(); }}使用@RibbonClient 或@RibbonClients 註解為服務提供者指定配置類
@SpringBootApplication@EnableDiscoveryClient@RibbonClient(name = "flim-user",configuration = RibbonConfiguration.class)public class FlimConsumerApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(FlimConsumerApplication.class, args); }}訪問測試地址http://localhost:8010/log-instance 可看見請求會隨機分佈到兩微服務上
2017-12-17 21:08:52.769 INFO 12524 --- [nio-8010-exec-7] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:52.946 INFO 12524 --- [nio-8010-exec-8] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:53.138 INFO 12524 --- [nio-8010-exec-9] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:53.319 INFO 12524 --- [io-8010-exec-10] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 21:08:53.511 INFO 12524 --- [nio-8010-exec-1] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
注意:RibbonConfiguration 類不能被@ComponentScan 掃描到,否則配置信息就會被所有@RibbonClient 共享,因此如果只想自定義某個Ribbon 客戶端的配置,必須防止被@ComponentScan 掃描
配置文件方式配置Ribbon
通過配置文件方式自定義Ribbon 屬性更加方便,配置的前綴是<clientName>.ribbon.
通過配置文件定義Ribbon配置
flim-user: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
常用的Ribbon 全局配置
ribbon: ConnectionTimeout: #連接超時時間ReadTimeout: #讀取超時時間OkToRetryOnAllOperatotions: #對所有操作請求都進行重試MaxAutoRetriesNextServer: #切換服務器實例的重試次數MaxAutoRetries: #對當前實例的重試次數ServerListRefreshInterval: #刷新服務列表源的間隔時間
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。