SpringCloud之Ribbon(客户端负载均衡工具)

  Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具 ,Ribbon主要 解决集群服务中,多个服务高效率访问的问题。

负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。

目标

  • 理解Ribbon的负载均衡应用场景
  • 能实现Ribbon的轮询、随机算法配置
  • 理解源码对负载均衡的切换

客户端与服务端级别的负载均衡

  服务器端负载均衡:例如Nginx:先发送请求给nginx服务器,然后通过负载均衡算法,

在多个业务服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。

  客户端负载均衡:客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,

然后进行访问,即在客户端就进行负载均衡算法分配。

客户端:服务消费方

服务器端: 服务提供方

Ribbon的使用

1、在服务的消费方导入Ribbon的依赖:

<!--ribbon负载均衡依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

 2、在启动类中的RestTemplate 方法上加@LoadBalanced注解,即可开启 Ribbon 负载均衡

@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudUserApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudUserApplication.class, args);
    }

    // 创建RestTemplate、添加负载均衡的注解
    @Bean
    @LoadBalanced 
    public RestTemplate restTemplate(){
         return new RestTemplate();
    }    

3、application.yml中添加服务提供方的url接口

#master接口的url
master: 
  service:
    master:
      url: http://springCould-master/master/sayHello/ //服务提供方项目名+窄化请求+接口名

4、在controller中向Http中植入Ribbon

@RestController
@RequestMapping(path = "user",produces = "application/json;charset=utf-8")
public class helloController {
    @Autowired
    private RestTemplate restTemplate;
    @Value("${server.port}")
    private int port;
    
    //获取配置文件中服务提供方的url
  @Value("${master.service.master.url}") 
  private String getMasterSayHelloUrl;

    @GetMapping("hello/{word}")
    public String sayHello(@PathVariable("word")String word)  throws  Exception{ //服务消费方与服务提供方的传值
        String rs = restTemplate.getForObject(getMasterSayHelloUrl + word, String.class);//返回值url为string类型
        return rs;
    }

服务提供方中编写controller接口供消费方调用数据

@RestController
@RequestMapping(path = "master",produces = "application/json;charset=utf-8")
public class helloController {

    @Value("${server.port}")
    private int port;
    
    @GetMapping("sayHello/{word}")
    public String sayHello(@PathVariable("word")String word)  throws  Exception{
        System.out.println("master"+port);
        return "hello:"+word;
    }

测试是否实现客户端的负载均衡

① 启动注册中心

② 服务提供方需要关闭热部署

启动一个8081端口的服务,不要关闭(修改端口号)再启动一个8082端口的服务

③ 启动服务消费方

④ 执行服务消费方的接口,查看后台打印的端口,发现有时执行的是8081服务器有时执行的是8082

 Ribbon的实现原理

 指定 Ribbon 的负载均衡策略

Ribbon 自带的负载均衡策略有如下几个:

1.RoundRibbonRule:轮询。人人有份,一个个来!
2.RandomRule:随机。拼人品了!
3.AvailabilityFilteringRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,
以及并发连接数超过阈值的服务,剩下的服务,使用轮询策略。
4.WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应越快的服务权重越高,
越容易被选中。一开始启动时,统计信息不足的情况下,使用轮询。
5.RetryRule:先轮询,如果获取失败则在指定时间内重试,重新轮询可用的服务。 6.BestAvailableRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。 7.ZoneAvoidanceRule:复合判断 server 所在区域的性能和 server 的可用性选择服务器

指定 Ribbon 自带的负载均衡策略在服务消费方启动配置类中添加配置

//修改ribbon的策略
@Bean
public IRule myRule() {
    // 指定重试策略:随机策略
    return new RandomRule();
}

 

posted @ 2020-07-11 10:50  64Byte  阅读(179)  评论(0编辑  收藏  举报