SpringCloudAlibaba項目之Ribbon負載均衡


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:配置類
 
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;
    }
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM