SpringCloudAlibaba隨筆目錄
一、SpringCloudAlibaba專案之父工程搭建
二、SpringCloudAlibaba專案之Nacos搭建及服務注冊
三、SpringCloudAlibaba專案之生產者與消費者
四、SpringCloudAlibaba專案之Ribbon負載均衡
五、SpringCloudAlibaba專案之OpenFeign遠程呼叫
六、SpringCloudAlibaba專案之Nacos-config配置中心
七、SpringCloudAlibaba專案之Sentinel流量控制
八、SpringCloudAlibaba專案之Seata分布式事務
九、SpringCloudAlibaba專案之GateWay網關
十、SpringCloudAlibaba專案之SkyWalking鏈路跟蹤
SpringCloudAlibaba專案之Ribbon負載均衡
1、Ribbon簡介
Spring Cloud Ribbon是Netflix開源的一款用于客戶端負載均衡的軟體工具,它在集群中為各個客戶端的通信提供了支持,有助于控制HTTP和TCP客戶端的行為,提供了很多負載均衡的演算法,例如輪詢,隨機等,同時也可以實作自定義的演算法,在Spring Cloud 構建的微服務中,Ribbon作為服務消費者的負載均衡器,有兩種使用方式,一種是與RestTemplate相結合,另一種是與Feign(現已閉源不更新了,由SpringCloud官方提供的OpenFeign代替,Feign的強化版)相結合,Feign已經默認集成了Ribbon,
Ribbon 是 Netflix 發布的開源專案,主要功能是提供 客戶端的復雜均衡演算法和服務呼叫,
Ribbon 客戶端組件提供一系列完善的配置項如超時、重試等,
Ribbon 會自動的幫助你基于某種規則(如簡單輪詢,隨機鏈接等)去鏈接這些機器,
2、Ribbon 本地負載均衡客戶端 VS Nginx 服務端負載均衡區別Nginx 是服務器負載均衡,客戶端所有請求都會交給nginx, 然后 nginx 實作轉發請求,即負載均衡是由服務端實作的,
Ribbon 本地負載均衡(或服務消費端),在呼叫微服務介面的時候,會在注冊中心上獲取注冊資訊服務串列后快取到JVM 本地,從而在本地實作RPC遠程 服務呼叫技術,
3、ribbon與LoadBalance
ribbon狀態:停更進維
替代方案 -Spring Cloud Loadbalancer
a、ribbon和loadbalancer都是springcloud的負載均衡組件b、ribbon是Netflix開源的基于HTTP和TCP等協議負載均衡組件,loadBalancer是SpringCloud自己寫的,根據服務id獲取負載均衡器rpc地址,
c、Ribbon的使用需要代碼里手動呼叫目標服務,loadBalancer底層原理是默認呼叫ribbon的實作客戶端負載均衡 Ribbon從2019年5月份后就不維護了,后期loadbalancer會成為主流,目前還是ribbon用的多,Loadbalancer支持ribbon,
LoadBalance和ribbon 比較:
負載均衡比較
ribbon 提供7中默認的負載均衡策略,常見的常見都有覆寫,一般我們都是使用 ZoneAvoidanceRule 復合判斷server所在區域的性能和server的可用性選擇server
配置方面豐富性
-
目前
spring-cloud-loadbalancer僅支持 重試操作的配置 -
ribbon 支持超時、懶加載處理、重試及其和 hystrix整合高級屬性等
4、修改默認負載均衡
方式1:配置類
RibbonRuleConfig,負載均衡配置類
/** * 方式1:配置負載均衡策略 * RibbonRuleConfig不能被@SpringBootApplication的@ComponentScan掃描到,否則就是全域配置的效果 */ @Configuration public class RibbonRuleConfig { /** * 全域配置,指定負載均衡策略 * @return */ @Bean public IRule iRule(){//方法名一定叫iRule,遵循約定大于配置 return new RandomRule();//使用隨機負載均衡策略 //return new NacosRule();//指定使用Nacos提供的負載均衡策略(優先呼叫統一集群的實體,基于隨機權重) } }
啟動類:
@SpringBootApplication @EnableDiscoveryClient//可加可不加,依版本而定,從Spring Cloud Edgware開始,@EnableDiscoveryClient可省略,只需加上相關依賴,并進行相應配置,即可將微服務注冊到服務發現組件上, //可配置多個 RibbonRuleConfig不能被@SpringBootApplication的@ComponentScan掃描到,所以把它放到上一層,否則就是全域配置的效果 @RibbonClients(value =https://www.cnblogs.com/qiantao/archive/2021/12/27/ { @RibbonClient(name = "service-stock",configuration = RibbonRuleConfig.class) }) public class ServiceOrderApplication { public static void main(String[] args) { SpringApplication.run(ServiceOrderApplication.class, args); } }
方式2:組態檔
application.properties
# 應用名稱 spring.application.name=service-order # 應用服務 WEB 訪問埠 server.port=8040 # Nacos幫助檔案: https://nacos.io/zh-cn/docs/concepts.html # Nacos認證資訊 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和埠 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # 注冊到 nacos 的指定 namespace,默認為 public spring.cloud.nacos.discovery.namespace=public #方式2:負載均衡組態檔 #指定使用Nacos提供的負載均衡策略(優先呼叫同一集群實體,基于隨機和權重) service-stock.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule
5、自定義負載均衡策略
修改方式2,不使用官方提供的負載均衡策略,自定義負載均衡組態檔

自定義負載均衡策略規則CustomRule類:
/** * 方式2:自定義負載均衡策略規則 */ public class CustomRule extends AbstractLoadBalancerRule { /** * 初始化配置資訊 * @param iClientConfig */ @Override public void initWithNiwsConfig(IClientConfig iClientConfig) { } /** * 負載均衡策略規則,此處以亂數為例,可以寫其他的規則或者自己創造的新規則 * @param o * @return */ @Override public Server choose(Object o) { ILoadBalancer iLoadBalancer = this.getLoadBalancer(); //獲取當前請求的服務實體 List<Server> reachableServers = iLoadBalancer.getReachableServers(); //根據服務實體產生亂數 int random = ThreadLocalRandom.current().nextInt(reachableServers.size()); //獲取此亂數下的服務 Server server = reachableServers.get(random); return server; } }
application.properties
# 應用名稱 spring.application.name=service-order # 應用服務 WEB 訪問埠 server.port=8040 # Nacos幫助檔案: https://nacos.io/zh-cn/docs/concepts.html # Nacos認證資訊 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和埠 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # 注冊到 nacos 的指定 namespace,默認為 public spring.cloud.nacos.discovery.namespace=public #方式2:負載均衡組態檔 #指定使用Nacos提供的負載均衡策略(優先呼叫同一集群實體,基于隨機和權重) #service-stock.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule #指定自定義負載均衡策略規則CustomRule類,使用自己定義的規則 service-stock.ribbon.NFLoadBalancerRuleClassName=com.qt.ribbon.rule.CustomRule
6、使用LoadBalancer替換Ribbon
目前LoadBalancer只提供了輪詢負載策略,

移除nacos中的ribbon
方法1,修改pom.xml(推薦使用,防止一些類重名等):
<!-- nacos 服務注冊發現(客戶端)依賴 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!--移除ribbon支持--> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency>
方法2,修改組態檔application.properties:
# 應用名稱
spring.application.name=service-order
# 應用服務 WEB 訪問埠
server.port=8040
# Nacos幫助檔案: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證資訊
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和埠
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public
#不使用ribbon
spring.cloud.loadbalancer.ribbon.enabled=false
添加loadbalancer依賴
<!-- 添加 loadbalancer 依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
RestTemplateConfig類
/** * SpringBoot-RestTemplate實作呼叫第三方API */ @Configuration @Component public class RestTemplateConfig { @Bean @LoadBalanced //啟用負載均衡,使RestTemplate請求支持負載均衡 public RestTemplate restTemplate(RestTemplateBuilder builder){ RestTemplate restTemplate = builder.build(); return restTemplate; } }
訪問地址:http://localhost:8040/order/addOrder

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394929.html
標籤:其他
