• 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

  • 相关阅读:
    mysql常用语法
    Java虚拟机(JVM)内存区域
    Java基础之this和super关键字用法
    Java基础之instanceof和transient关键字用法
    排序算法之快速排序
    Java基础之final和abstract关键字
    排序算法之归并排序
    Java基础之static关键字的用法
    剑指offer题目系列三(链表相关题目)
    数据结构之栈和队列及其Java实现
  • 原文地址:https://www.cnblogs.com/qiantao/p/15724152.html
Copyright © 2020-2023  润新知