Springcloud学习笔记(四)

Springcloud学习笔记(四)

八月 17, 2019

三、Ribbon负载均衡

1、概述

基于Netflix ribbon实现的一套 ==客户端、负载均衡的工具==

重要功能是提供==客户端的软件负载均衡算法==,Ribbon客户端组件提供一系列的配置项如链接超时、重试等

官网资料:github:Netfix/Ribbon

常见的负载均衡:软件Nginx、LVS 硬件F5

2、Ribbon初步配置

1、修改consumer-80的配置

  • 修改pom配置,增加相关引用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!--Ribbon相关引用,与eureka有关-->
    <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.yml ,追加Eureka的注册服务地址

    1
    2
    3
    4
    5
    eureka:
    client:
    service-url:
    defaultZone: eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
    register-with-eureka: false
  • 主启动类中增加注解@EnableEurekaClient,

    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @EnableEurekaClient
    public class DeptConsumer80App {
    public static void main(String[] args) {
    SpringApplication.run(DeptConsumer80App.class,args);
    }
    }
  • ConfigBean配置中增加@LoadBalance注解,开启客户端负载均衡

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Configuration
    public class ConfigBean {
    /**
    * 配置RestTemplate
    * 通过RestTemplate调用提供者服务 ,发送rest请求
    * 提供了多种访问http服务的方法,
    * 针对于访问rest服务<strong>客户端</strong>的调用的模板类
    */
    @Bean
    @LoadBalanced //ribbon实现的一套 ==客户端、负载均衡的工具
    public RestTemplate getRestTemplate(){
    return new RestTemplate();
    }
    }
  • 修改客户端访问类80的controller,将地址改为微服务名称STUDY-SPRINGCLOUD-DEPT

    1
    2
    3
    4
    /**
    * 注册再EurekaServer中的微服务名称
    */
    private static final String REST_URL_PREFIX="http://STUDY-SPRINGCLOUD-DEPT";
  • 启动

    先启动Eureka集群,然后启动8001服务注册进eureka,再启动80客户端

3、Ribbon负载均衡

1、架构说明

2、新建8002、8003服务提供者

复制8001的配置和类

yml配置中的实例名称application name不能改

3、总结

Ribbon其实就是一个软辅在均衡的客户端组件,他和其他所有需要请求的客户端结合使用,和Eureka结合只是其中的一个实例。默认采用轮询算法。

4、Ribbon核心组件IRule

IRule:根据特定算法中从服务列表中选取一个要访问的服务

Ribbon采用的负载均衡算法:

  • com.netflix.loadbalancer.RoundRobinRule

    轮询:默认

  • com.netflix.loadbalancer.RandomRule

    随机

  • com.netflix.loadbalancer.AvailabilityFilteringRule

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

  • com.netflix.loadbalancer.WeightedResponseTimeRule

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

  • com.netflix.loadbalancer.RetryRule

    先按RoundRobinRule轮询算法获取服务,如果失败则在指定时间内进行重试

  • com.netflix.loadbalancer.BestAvailableRule

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

  • com.netflix.loadbalancer.ZoneAvoidanceRule

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

配置负载均衡算法

在ConfigBean中显示声明算法,增加bean

1
2
3
4
5
@Bean
public IRule myRule(){
//用我们选择的随机算法
return new RandomRule();
}

5、Ribbon自定义

1、主启动类上添加注解@RibbonClient

1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
@EnableEurekaClient
/**
* 在启动该微服务式是能去加载我们定义的Ribbon配置类
*/
@RibbonClient(name="STUDY-SPRINGCLOUD-DEPT",configuration = MySelfRule.class)
public class DeptConsumer80App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer80App.class,args);
}
}

2、配置注意细节

  • 自定义配置类不能放在@ComponentScan所扫描的当前包以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端锁共享,达不到特殊定制化的目的

3、自定义规则深度解析

1
2
3
4
5
6
7
/**
继承AbstractLoadBalancerRule
实现
**/
public class MyRandomRule extends AbstractLoadBalancerRule {
//实现代码
}