• SpringCloud:Ribbon(负载均衡、负载均衡的策略)


    1、概念

    LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。Ribbon是客户端的负载均衡算法。

    2、Ribbon负载均衡的使用

    (1)配置

    • 在消费者模块添加依赖:
    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    • 配置application.xml:添加Eureka的服务注册地址
    eureka:
      client:
        register-with-eureka: false
        service-url: 
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    • 在配置类添加注解:该注解能够实现在客户端的负载均衡
    @Configuration
    public class ConfigBean {
        @Bean
        @LoadBalanced
        public RestTemplate template(){
            return  new RestTemplate();
        }
    }
    • 在主启动类添加EnableEurekaClient注解

    通过微服务的名称访问已经注册进Eureka的微服务:直接通过微服务的名称访问,前提是该服务已经注册进了Eureka

    @RestController
    public class DeptConsumerController {
        private static final String REST_URL_PREFIX = "PROVIDER";
    
        @Autowired
        private RestTemplate restTemplate;

    (2)负载均衡

    • 新建与提供者(8001)相同的两个模块,配置pom.xml、核心配置文件中要保证三个提供者对外暴露的名字相同
    spring:
      application:
        name: provider
    • 新建数据库,每一个服务的提供者都连接到不同的数据库
    • 测试

      先启动80端口(消费者)的服务,消费者通过服务的名称来获取服务,因为8001、8002、8003配置中的服务的名称是相同的,将三个服务的提供者注册进Eureka,Eureka是一个集群,消费者可以从集群中获取提供者提供的服务。

      在消费中配置Ribbon的负载均衡以后,消费者获取到的服务是按顺序获取的,并不是每次获取到同一个服务(轮询算法,默认)。

    3、Ribbon的组件IRule

    (1)分类

    RoundRobinRule:轮询,默认

    RandomRule:随机

    AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问

    WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到

    RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务

    BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务

    ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器

    (2)使用

    @Configuration
    public class ConfigBean {
        @Bean
        @LoadBalanced
        public RestTemplate template(){
            return  new RestTemplate();
        }
    
        @Bean
        public IRule myRule(){
            return new RandomRule();
        }
    }

    在消费者的配置类中配置即可

     (3)自定义负载均衡策略

    在启动类上面添加注解:

    @RibbonClient(name="PROVIDER",configuration=MySelfRule.class)

    定义配置类,配置类中的方法返回的是自定义策略类的对象:

    @Configuration
    public class MySelfRule
    {
      @Bean
      public IRule myRule()
      {
       return new RandomRule_ZY();
      }
    }



  • 相关阅读:
    线程间的通信 与 线程池
    线程同步
    静态代理模式
    多线程状态
    线程、进程、多线程
    Java面向对象之泛型
    ConstraintLayout 用法
    搞NDK开发
    Linux基础命令【记录】
    c# 的一些基本操作或属性
  • 原文地址:https://www.cnblogs.com/zhai1997/p/14222702.html
Copyright © 2020-2023  润新知