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整合進階屬性等
負載均衡政策就那麼幾種,Ribbon已經相當豐富了,即使閉源不更新了也沒關系,這些已經夠用了,目前老老實實用 ribbon,後面等LoadBalance真正強大起來再考慮替換它。
4、修改預設負載均衡
方式1:配置類
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYTN1ADNxcTM20SNxYDO1IDNwEDNyITMxIDMy0SNxcTNwQTMvwlMxEjMwIzLcVTM3UDM0EzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
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 = {
@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;
}
}
# 應用名稱
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