SpringCloud之Ribbon使用示例解析
正文
Ribbon 是一個獨立的組件,是用來進行遠程接口調用的,代碼如下
通過 getForObject 方法可以掉到用 micro-order 服務的,order/list 接口。
然后在調用期間會存在負載均衡,micro-order 服務對應有幾個服務實例就會根據負載均衡算法選擇某一個去調用。
1. 測試代碼
1.1. 啟動兩個訂單服務
端口號分別為9011,9012
1.2. 改造獲取訂單接口
返回當前服務實例的占用的端口號,用來判斷當前服務是哪個實例
@RequestMapping("/order") @RestController public class OrderController { @Value("${server.port}") String port; @GetMapping("/list") public String getOrderList(String username) { return "該服務端口號:" + port + ",這是用戶 :" + username + " 所有的訂單信息"; } }
1.3. 調用用戶服務的獲取訂單接口,
@RequestMapping("/user") @RestController public class UserController { @Autowired private RestTemplate restTemplate; @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } @GetMapping("/orderList") public String getOrderList(String username) { return restTemplate.getForObject("http://" + "micro-order" + "/order/list?username=" + username, String.class); } }
會發(fā)現,對訂單服務的調用會存在負載均衡,在兩個訂單服務之間 切來切去。
2. Ribbon 配置
2.1. Application.properties 配置
# 關閉 ribbon 訪問注冊中心 Eureka Server 發(fā)現服務,但是服務依舊會注冊。 #true 使用 eureka false 不使用。如果是false,那么表示要調用的服務列表從下面這個參數中獲取,不然就從eureka-server中獲取,這樣擴容服務提供方的話,需要改配置文件與動態(tài)擴容的理念相悖,不建議大家使用 ribbon.eureka.enabled=true spring.cloud.loadbalancer.retry.enabled=true ###指定調用的節(jié)點 ###ribbon.eureka.enabled=false ##micro-order.ribbon.listOfServers=localhost:8001 ##單位 ms ,請求連接超時時間 #micro-order.ribbon.ConnectTimeout=1000 ##單位 ms ,請求處理的超時時間 #micro-order.ribbon.ReadTimeout=2000 #micro-order.ribbon.OkToRetryOnAllOperations=true ##切換實例的重試次數 #micro-order.ribbon.MaxAutoRetriesNextServer=2 ##對當前實例的重試次數 當 Eureka 中可以找到服務,但是服務連不上時將會重試 #micro-order.ribbon.MaxAutoRetries=2 ##配置負載均衡 #micro.order.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule #micro-order.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl
2.2 代碼配置
2.2.1. 使用@RibbonClients 加載針對某一個服務的ribbon配置
這個配置類只針對 micro-order 服務,微服務系統(tǒng)里面有很多服務,這就可以區(qū)別化配置。
/* * 這個是針對 micro-order服務的 ribbon配置 * */ @Configuration @RibbonClients(value = { @RibbonClient(name = "micro-order",configuration = RibbonLoadBalanceMicroOrderConfig.class) }) // 也可以這樣,只加載一個針對某個服務的ribbon配置 //@RibbonClient(name = "micro-order",configuration = RibbonLoadBalanceMicroOrderConfig.class public class LoadBalanceConfig { }
2.2.2. 配置 configuration
配置類的時候,一定要注意,配置類不能陪@ComponentScan 注解掃描到,如果被掃描到了則該配置類就是所有服務共用的配置了。
/* * 這個類最好不要出現在啟動類的@ComponentScan掃描范圍 * 如果出現在@ComponentScan掃描訪問,那么這個配置類就是每個服務共用的配置了 * */ @Configuration public class RibbonLoadBalanceMicroOrderConfig { // @RibbonClientName private String name = "micro-order"; @Bean @ConditionalOnClass public IClientConfig defaultClientConfigImpl() { DefaultClientConfigImpl config = new DefaultClientConfigImpl(); config.loadProperties(name); config.set(CommonClientConfigKey.MaxAutoRetries,2); config.set(CommonClientConfigKey.MaxAutoRetriesNextServer,2); config.set(CommonClientConfigKey.ConnectTimeout,2000); config.set(CommonClientConfigKey.ReadTimeout,4000); config.set(CommonClientConfigKey.OkToRetryOnAllOperations,true); return config; } /* * 判斷服務是否存活 * 不建議使用 * */ // @Bean // public IPing iPing() { // //這個實現類會去調用服務來判斷服務是否存活 // return new PingUrl(); // } // 配置負載均衡,默認是輪訓 @Bean public IRule ribbonRule() { //線性輪訓 new RoundRobinRule(); //可以重試的輪訓 new RetryRule(); //根據運行情況來計算權重 new WeightedResponseTimeRule(); //過濾掉故障實例,選擇請求數最小的實例 new BestAvailableRule(); return new RandomRule(); } }
3.Ribbon 單獨使用
Ribbon 是一個獨立組件,可以脫離 springcloud 使用的.
有這兩個jar包就可以
以上就是SpringCloud之Ribbon使用示例解析的詳細內容,更多關于SpringCloud Ribbon使用的資料請關注腳本之家其它相關文章!