zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
    整合SPRING CLOUD云服务架构
    java虚拟机
    test面板1
    gulp的使用
    拖拽js
    dependencies与devDependencies的区别
    获取随机颜色js
    nodejs创建ejs工程
    css图片垂直居中
  • 原文地址:https://www.cnblogs.com/64Byte/p/13281166.html
Copyright © 2011-2022 走看看