SpringCloud之Ribbon使用示例解析
正文

Ribbon 是一個(gè)獨(dú)立的組件,是用來(lái)進(jìn)行遠(yuǎn)程接口調(diào)用的,代碼如下
通過(guò) getForObject 方法可以掉到用 micro-order 服務(wù)的,order/list 接口。
然后在調(diào)用期間會(huì)存在負(fù)載均衡,micro-order 服務(wù)對(duì)應(yīng)有幾個(gè)服務(wù)實(shí)例就會(huì)根據(jù)負(fù)載均衡算法選擇某一個(gè)去調(diào)用。
1. 測(cè)試代碼
1.1. 啟動(dòng)兩個(gè)訂單服務(wù)
端口號(hào)分別為9011,9012

1.2. 改造獲取訂單接口
返回當(dāng)前服務(wù)實(shí)例的占用的端口號(hào),用來(lái)判斷當(dāng)前服務(wù)是哪個(gè)實(shí)例
@RequestMapping("/order")
@RestController
public class OrderController {
@Value("${server.port}")
String port;
@GetMapping("/list")
public String getOrderList(String username) {
return "該服務(wù)端口號(hào):" + port + ",這是用戶 :" + username + " 所有的訂單信息";
}
}1.3. 調(diào)用用戶服務(wù)的獲取訂單接口,
@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);
}
}會(huì)發(fā)現(xiàn),對(duì)訂單服務(wù)的調(diào)用會(huì)存在負(fù)載均衡,在兩個(gè)訂單服務(wù)之間 切來(lái)切去。

2. Ribbon 配置
2.1. Application.properties 配置
# 關(guān)閉 ribbon 訪問(wèn)注冊(cè)中心 Eureka Server 發(fā)現(xiàn)服務(wù),但是服務(wù)依舊會(huì)注冊(cè)。 #true 使用 eureka false 不使用。如果是false,那么表示要調(diào)用的服務(wù)列表從下面這個(gè)參數(shù)中獲取,不然就從eureka-server中獲取,這樣擴(kuò)容服務(wù)提供方的話,需要改配置文件與動(dòng)態(tài)擴(kuò)容的理念相悖,不建議大家使用 ribbon.eureka.enabled=true spring.cloud.loadbalancer.retry.enabled=true ###指定調(diào)用的節(jié)點(diǎn) ###ribbon.eureka.enabled=false ##micro-order.ribbon.listOfServers=localhost:8001 ##單位 ms ,請(qǐng)求連接超時(shí)時(shí)間 #micro-order.ribbon.ConnectTimeout=1000 ##單位 ms ,請(qǐng)求處理的超時(shí)時(shí)間 #micro-order.ribbon.ReadTimeout=2000 #micro-order.ribbon.OkToRetryOnAllOperations=true ##切換實(shí)例的重試次數(shù) #micro-order.ribbon.MaxAutoRetriesNextServer=2 ##對(duì)當(dāng)前實(shí)例的重試次數(shù) 當(dāng) Eureka 中可以找到服務(wù),但是服務(wù)連不上時(shí)將會(huì)重試 #micro-order.ribbon.MaxAutoRetries=2 ##配置負(fù)載均衡 #micro.order.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule #micro-order.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl
2.2 代碼配置
2.2.1. 使用@RibbonClients 加載針對(duì)某一個(gè)服務(wù)的ribbon配置
這個(gè)配置類只針對(duì) micro-order 服務(wù),微服務(wù)系統(tǒng)里面有很多服務(wù),這就可以區(qū)別化配置。
/*
* 這個(gè)是針對(duì) micro-order服務(wù)的 ribbon配置
* */
@Configuration
@RibbonClients(value = {
@RibbonClient(name = "micro-order",configuration = RibbonLoadBalanceMicroOrderConfig.class)
})
// 也可以這樣,只加載一個(gè)針對(duì)某個(gè)服務(wù)的ribbon配置
//@RibbonClient(name = "micro-order",configuration = RibbonLoadBalanceMicroOrderConfig.class
public class LoadBalanceConfig {
}2.2.2. 配置 configuration
配置類的時(shí)候,一定要注意,配置類不能陪@ComponentScan 注解掃描到,如果被掃描到了則該配置類就是所有服務(wù)共用的配置了。
/*
* 這個(gè)類最好不要出現(xiàn)在啟動(dòng)類的@ComponentScan掃描范圍
* 如果出現(xiàn)在@ComponentScan掃描訪問(wèn),那么這個(gè)配置類就是每個(gè)服務(wù)共用的配置了
* */
@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;
}
/*
* 判斷服務(wù)是否存活
* 不建議使用
* */
// @Bean
// public IPing iPing() {
// //這個(gè)實(shí)現(xiàn)類會(huì)去調(diào)用服務(wù)來(lái)判斷服務(wù)是否存活
// return new PingUrl();
// }
// 配置負(fù)載均衡,默認(rèn)是輪訓(xùn)
@Bean
public IRule ribbonRule() {
//線性輪訓(xùn)
new RoundRobinRule();
//可以重試的輪訓(xùn)
new RetryRule();
//根據(jù)運(yùn)行情況來(lái)計(jì)算權(quán)重
new WeightedResponseTimeRule();
//過(guò)濾掉故障實(shí)例,選擇請(qǐng)求數(shù)最小的實(shí)例
new BestAvailableRule();
return new RandomRule();
}
}3.Ribbon 單獨(dú)使用
Ribbon 是一個(gè)獨(dú)立組件,可以脫離 springcloud 使用的.
有這兩個(gè)jar包就可以

以上就是SpringCloud之Ribbon使用示例解析的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud Ribbon使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringCloud Ribbon負(fù)載均衡工具使用
- SpringCloud Netfilx Ribbon負(fù)載均衡工具使用方法介紹
- SpringCloud 中使用 Ribbon的方法詳解
- SpringCloud OpenFeign與Ribbon客戶端配置詳解
- SpringCloud?Nacos?+?Ribbon?調(diào)用服務(wù)的實(shí)現(xiàn)方式(兩種)
- 聊聊SpringCloud中的Ribbon進(jìn)行服務(wù)調(diào)用的問(wèn)題
- springcloud之Feign、ribbon如何設(shè)置超時(shí)時(shí)間和重試機(jī)制
相關(guān)文章
Java實(shí)現(xiàn)用Mysql存取圖片操作實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)用Mysql存取圖片操作實(shí)例,本文講解了使用BLOB類型保存和讀取圖片的代碼實(shí)例,需要的朋友可以參考下2015-06-06
SpringBoot獲取客戶端的IP地址的實(shí)現(xiàn)示例
在Web應(yīng)用程序中,獲取客戶端的IP地址是一項(xiàng)非常常見的需求,本文主要介紹了SpringBoot獲取客戶端的IP地址的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法
今天小編就為大家分享一篇Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
springboot中如何實(shí)現(xiàn)kafa指定offset消費(fèi)
這篇文章主要介紹了springboot中如何實(shí)現(xiàn)kafa指定offset消費(fèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Mybatis-Plus的應(yīng)用場(chǎng)景描述及注入SQL原理分析
MyBatis-Plus是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,本文重點(diǎn)給大家介紹Mybatis-Plus的應(yīng)用場(chǎng)景及注入SQL原理分析,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2021-05-05
關(guān)于注解式的分布式Elasticsearch的封裝案例
這篇文章主要介紹了關(guān)于注解式的分布式Elasticsearch的封裝案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

