• Spring Cloud Alibaba Ribbon负载均衡器


    Ribbon 负载均衡器

    背景
    Ribbon 是一个用于客户端负载均衡的开源库,它是 Netflix 开源的一部分,目前由 Spring Cloud 托管和维护。Ribbon 的主要作用是在微服务架构中管理客户端之间的负载均衡。
    作用
    作为一个负载均衡器,Ribbon 可以将客户端发起的请求分发到多个服务提供者实例中,以实现负载均衡和高可用性。它可以根据配置的负载均衡策略,在请求发起时选择一个合适的服务提供者实例,使请求能够均匀地分布到不同的实例上,从而提高系统的性能和可扩展性。

    负载均衡策略

    RoundRobinRule:轮询策略,依次选择每个服务提供者实例。
    RandomRule:随机策略,随机选择一个服务提供者实例。
    WeightedResponseTimeRule:根据平均响应时间和实例权重进行选择。
    BestAvailableRule:优先选择可用性最好的实例。
    ZoneAvoidanceRule:避免选择故障区域的实例。
    此外,Ribbon 还支持自定义负载均衡策略,通过实现 IRule 接口可以编写自定义的负载均衡规则。
    拓展
    在 Spring Cloud 中,通过引入 spring-cloud-starter-netflix-ribbon 依赖,可以方便地使用 Ribbon 进行客户端负载均衡。
    需要注意的是,从 Spring Cloud 2020 年版本开始,官方推荐使用 Spring Cloud LoadBalancer 替代 Ribbon 进行客户端负载均衡。因此,在最新的项目中,建议使用 Spring Cloud LoadBalancer 来实现负载均衡的功能。

    环境搭建

    (上一篇采用的搭建环境的方法)传送至上一篇
    在之前的基础上需要加入一行新的配置即可
    如果新建一个项目加入下方依赖即可

    spring boot 版本 2.3.11.RELEASE
    对应采用的springcloud

     <properties>
            <java.version>1.8</java.version>
            <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
            <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
        </properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.依赖

    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4

    2.配置

    配置 application.properties

    spring.application.name=ribbon-a
    server.port = 3030
    #Nacos服务发现注册中心
    spring.cloud.nacos.discovery.server-addr=192.168.14.3:8848
    
    logging.level.com.hb = debug
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.修改其默认的负载均衡策略

    轮询 ——> 随机 【ps:其他的也可自行设置】
    配置config文件修改默认 策略

    @Configuration
    public class MyRuleConfig {
        @Bean
        public IRule rule(){
            return new RandomRule();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.1 验证

    开启两个nacos,都在统一命名空间下,一个打包以cmd 运行,一个idea运行
    1.打包文件
    在这里插入图片描述

    2.进入该文件夹中#
    在这里插入图片描述
    3.,记得打开的时候进入 target目录下
    在这里插入图片描述

    在这里插入图片描述
    在启动类上加入@EnableDiscoveryClient,即可在服务中查看到对应的服务

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    4.创建自定义的Rule

    4.1 MyRule()

    @Component
    @Slf4j
    public class MyRule extends AbstractLoadBalancerRule {
        @Autowired
        private NacosDiscoveryProperties nacosDiscoveryProperties;
        @Autowired
        private NacosServiceManager nacosServiceManager;
    
        private static AtomicInteger count = new AtomicInteger(0);
    
    
        @Override
        @SneakyThrows
        public Server choose(Object key) {
    
            String group = this.nacosDiscoveryProperties.getGroup();
            DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer)getLoadBalancer();
            String name = loadBalancer.getName();
            NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());
            List<Instance> instances = null;
            instances = namingService.selectInstances(name, group, true);
            if (CollectionUtils.isEmpty(instances)) {
                log.warn("no instance in service {}", name);
                return null;
            }
            Instance maxInstance = instances.stream().max(Comparator.comparing(Instance::getWeight)).get();
            Instance minInstance = instances.stream().min(Comparator.comparing(Instance::getWeight)).get();
            int count2 = count.addAndGet(1);
            int mod = count2 % 4; //取模运算  5,10,15,20,25 ...
            if (mod == 0) {
                log.debug("count={},mod={},使用min",count2, mod);
                return new NacosServer(minInstance);
            } else {
                log.debug("count={},mod={},使用max",count2, mod);
    
                return new NacosServer(maxInstance);
            }
        }
    
    
        @Override
        public void initWithNiwsConfig(IClientConfig iClientConfig) {
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    4.2 在配置config类中配置

    下方是访问4次三次调用权重最大的,一次访问权重最小的
    在这里插入图片描述
    结果
    在这里插入图片描述
    也可以在peroperties文件中配置还可以配置全局的但是在我这个版本不行 ,这里只配置啦命名空间为nacos-a的

     nacos-a.ribbon.NFLoadBalancerRuleClassName=com.hb.rule.MyRule
    
    • 1

    5.饥饿加载

    在进行服务调用的时候,如果网络情况不好,第一次调用会超时。
    Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。
    开启饥饿加载,解决第一次调用慢的问题:

    ribbon:
    eager-load:
    # 开启ribbon饥饿加载
    enabled: true
    # 配置order-service使用ribbon饥饿加载,多个使用逗号分隔
    clients: order-service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    开启饥饿加载会在系统加载类的过程中,与连接池进行链接

    6.我只想访问不想被别的访问

    application.properties 配置文件中加入这个即可
    spring.cloud.nacos.discovery.register-enabled=true

  • 相关阅读:
    msvc C++编译链接
    【Unity】Unity插件:地形编辑器MTE(Mesh Terrain Editor)
    技能篇:linux服务性能问题排查及jvm调优思路
    element-ui 组件库 button 源码分析
    只想做个一门心思只赚钱的打工人?这4种收入你都有吗?
    论文笔记(二十二):GRiD: GPU-Accelerated Rigid Body Dynamics with Analytical Gradients
    java-net-php-python-jsp刺绣作品展示网站计算机毕业设计程序
    2022软考高项十大管理知识领域论文骨架
    12.1 Go 测试的概念
    SHA256WithRSA签名算法⽀付⽹关回调签名⽅案
  • 原文地址:https://blog.csdn.net/weixin_63558979/article/details/133027066