柚子快報(bào)激活碼778899分享:Ribbon實(shí)戰(zhàn)
柚子快報(bào)激活碼778899分享:Ribbon實(shí)戰(zhàn)
一、ribbon概述 1、ribbon簡(jiǎn)介 目前主流的負(fù)載方案分為以下兩種:
集中式負(fù)載均衡,在消費(fèi)者和服務(wù)提供方中間使用獨(dú)立的代理方式進(jìn)行負(fù)載,有硬件的(比如 F5),也有軟件的(比如 Nginx)。 客戶端根據(jù)自己的請(qǐng)求情況做負(fù)載均衡,Ribbon 就屬于客戶端自己做負(fù)載均衡。 Spring Cloud Ribbon是基于Netflix Ribbon 實(shí)現(xiàn)的一套客戶端的負(fù)載均衡工具,Ribbon客戶端組件提供一系列的完善的配置,如超時(shí),重試等。通過(guò)Load Balancer獲取到服務(wù)提供的所有機(jī)器實(shí)例,Ribbon會(huì)自動(dòng)基于某種規(guī)則(輪詢,隨機(jī))去調(diào)用這些服務(wù)。Ribbon也可以實(shí)現(xiàn)我們自己的負(fù)載均衡算法。
2、常見(jiàn)負(fù)載均衡算法 隨機(jī),通過(guò)隨機(jī)選擇服務(wù)進(jìn)行執(zhí)行,一般這種方式使用較少; 輪訓(xùn),負(fù)載均衡默認(rèn)實(shí)現(xiàn)方式,請(qǐng)求來(lái)之后排隊(duì)處理; 加權(quán)輪訓(xùn),通過(guò)對(duì)服務(wù)器性能的分型,給高配置,低負(fù)載的服務(wù)器分配更高的權(quán)重,均衡各個(gè)服務(wù)器的壓力; 地址Hash,通過(guò)客戶端請(qǐng)求的地址的HASH值取模映射進(jìn)行服務(wù)器調(diào)度。 ip hash 最小連接數(shù),即使請(qǐng)求均衡了,壓力不一定會(huì)均衡,最小連接數(shù)法就是根據(jù)服務(wù)器的情況,比如請(qǐng)求積壓數(shù)等參數(shù),將請(qǐng)求分配到當(dāng)前壓力最小的服務(wù)器上。 最小活躍數(shù) 3、Ribbon模塊
名稱說(shuō)明ribbon-loadbalancer負(fù)載均衡模塊,可獨(dú)立使用,也可以和別的模塊一起使用。Ribbon內(nèi)置的負(fù)載均衡算法都實(shí)現(xiàn)在其中。ribbon-eureka ?基于Eureka封裝的模塊,能夠快速、方便地集成Eureka。ribbon-transport基于Netty實(shí)現(xiàn)多協(xié)議的支持,比如HTTP、Tcp、Udp等。ribbon-httpclient基于Apache HttpClient封裝的REST客戶端,集成了負(fù)載均衡模塊,可以直接在項(xiàng)目中使用來(lái)調(diào)用接口。ribbon-exampleRibbon使用代碼示例,通過(guò)這些示例能夠讓你的學(xué)習(xí)事半功倍。ribbon-core—些比較核心且具有通用性的代碼,客戶端API的一些配置和其他API的定義
二、Spring Cloud快速整合Ribbon 1、引入依賴
? ?
? ?
2、添加@LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
3、 修改controller
@Autowired
private RestTemplate restTemplate;
// version2
@GetMapping("/findOrderByUserId/{userId}")
public R findOrderByUserId(@PathVariable("userId") Integer userId) {
String url = "http://mall-order/order/findOrderByUserId/" + userId;
// import com.baomidou.mybatisplus.extension.api.R;
R result = restTemplate.getForObject(url, R.class);
return result;
}
此時(shí)的restTemplate已經(jīng)具備了自動(dòng)獲取服務(wù)列表并根據(jù)負(fù)載均衡算法確定出要調(diào)用服務(wù)的能力。我們只需要根據(jù)服務(wù)名稱調(diào)用服務(wù)即可,不再需要關(guān)心服務(wù)具體的url以及調(diào)用哪個(gè)服務(wù)。
三、修改負(fù)載均衡策略 1、常用的負(fù)載均衡策略類 RandomRule: 隨機(jī)選擇一個(gè)Server。 RetryRule:對(duì)選定的負(fù)載均衡策略機(jī)上重試機(jī)制,在一個(gè)配置時(shí)間段內(nèi)當(dāng)選擇Server不成功,則一直嘗試使用subRule的方式選擇一個(gè)可用的server。 RoundRobinRule: 輪詢選擇, 輪詢index,選擇index對(duì)應(yīng)位置的Server。 AvailabilityFilteringRule: 過(guò)濾掉一直連接失敗的被標(biāo)記為circuit tripped的后端Server,并過(guò)濾掉那些高并發(fā)的后端Server或者使用一個(gè)AvailabilityPredicate來(lái)包含過(guò)濾server的邏輯,其實(shí)就是檢查status里記錄的各個(gè)Server的運(yùn)行狀態(tài)。 BestAvailableRule:選擇一個(gè)最小的并發(fā)請(qǐng)求的Server,逐個(gè)考察Server,如果Server被tripped了,則跳過(guò)。 WeightedResponseTimeRule: 根據(jù)響應(yīng)時(shí)間加權(quán),響應(yīng)時(shí)間越長(zhǎng),權(quán)重越小,被選中的可能性越低。 ZoneAvoidanceRule:默認(rèn)的負(fù)載均衡策略,即復(fù)合判斷Server所在區(qū)域的性能和Server的可用性選擇Server,在沒(méi)有區(qū)域的環(huán)境下,類似于輪詢(RandomRule) NacosRule: 同集群優(yōu)先調(diào)用 2、修改默認(rèn)負(fù)載均衡策略 2.1、修改全局配置:調(diào)用其他微服務(wù),一律使用指定的負(fù)載均衡算法
@Configuration
public class RibbonConfig {
? /**
? ? * 全局配置
? ? * 指定負(fù)載均衡策略
? ? * @return
? ? */
? ?@Bean
? ?public IRule() {
? ? ? ?// 指定使用Nacos提供的負(fù)載均衡策略(優(yōu)先調(diào)用同一集群的實(shí)例,基于隨機(jī)權(quán)重)
? ? ? ?return new NacosRule();
? ?}
} ?
2.2、修改局部配置:調(diào)用指定微服務(wù)提供的服務(wù)時(shí),使用對(duì)應(yīng)的負(fù)載均衡算法 修改application.yml:
# 被調(diào)用的微服務(wù)名
mall-order:
? ribbon:
? ? # 指定使用Nacos提供的負(fù)載均衡策略(優(yōu)先調(diào)用同一集群的實(shí)例,基于隨機(jī)&權(quán)重)
? ? NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
2.3、局部配置的第二種方式 可以利用@RibbonClient指定微服務(wù)及其負(fù)載均衡策略。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
//@RibbonClient(name = "mall-order", configuration = RibbonConfig.class)
//配置多個(gè) ? RibbonConfig不能被@SpringbootApplication的@CompentScan掃描到,否則就是全局配置的效果
@RibbonClients(value = {
? ? // 在SpringBoot主程序掃描的包外定義配置類
? ? @RibbonClient(name = "mall-order", configuration = RibbonConfig.class),
? ? @RibbonClient(name = "mall-account", configuration = RibbonConfig.class) ? ?
})
public class MallUserRibbonDemoApplication {
? ? public static void main(String[] args) {
? ? ? ? SpringApplication.run(MallUserRibbonDemoApplication.class, args);
? ? }
}
注意:此處有坑。不能寫(xiě)在@SpringbootApplication注解的@CompentScan掃描得到的地方,否則自定義的配置類就會(huì)被所有的RibbonClients共享。不建議這么使用,推薦yml方式。
3、自定義負(fù)載均衡策略 通過(guò)實(shí)現(xiàn)IRule接口可以自定義負(fù)載策略,主要的選擇服務(wù)邏輯在 choose 方法中。3.1、實(shí)現(xiàn)基于權(quán)重的負(fù)載均衡策略
@Slf4j
public class NacosRandomWithWeightRule extends AbstractLoadBalancerRule {
? ? @Autowired
? ? private NacosDiscoveryProperties nacosDiscoveryProperties;
? ? @Override
? ? public Server choose(Object key) {
? ? ? ? DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
? ? ? ? String serviceName = loadBalancer.getName();
? ? ? ? NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
? ? ? ? try {
? ? ? ? ? ? //nacos基于權(quán)重的算法
? ? ? ? ? ? Instance instance = namingService.selectOneHealthyInstance(serviceName);
? ? ? ? ? ? return new NacosServer(instance);
? ? ? ? } catch (NacosException e) {
? ? ? ? ? ? log.error("獲取服務(wù)實(shí)例異常:{}", e.getMessage());
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return null;
? ? }
? ? @Override
? ? public void initWithNiwsConfig(IClientConfig clientConfig) {
? ? }
} ? ?
3.2、配置自定義的策略 1)全局配置
@Bean
public IRule ribbonRule() {
? ? return new NacosRandomWithWeightRule();
}
2)局部配置 修改application.yml:
# 被調(diào)用的微服務(wù)名
mall-order:
? ribbon:
? ? # 自定義的負(fù)載均衡策略(基于隨機(jī)&權(quán)重)
? ? NFLoadBalancerRuleClassName: com.tuling.mall.ribbondemo.rule.NacosRandomWithWeightRule
五、饑餓加載 Ribbon默認(rèn)懶加載,意味著只有在發(fā)起調(diào)用的時(shí)候才會(huì)創(chuàng)建客戶端。在進(jìn)行服務(wù)調(diào)用的時(shí)候,如果網(wǎng)絡(luò)情況不好,第一次調(diào)用會(huì)超時(shí)。
開(kāi)啟饑餓加載,解決第一次調(diào)用慢的問(wèn)題:
ribbon:
? eager-load:
? ? # 開(kāi)啟ribbon饑餓加載
? ? enabled: true
? ? # 配置mall-user使用ribbon饑餓加載,多個(gè)使用逗號(hào)分隔
? ? clients: mall-order
柚子快報(bào)激活碼778899分享:Ribbon實(shí)戰(zhàn)
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。