SpringCloud组件之Ribbon

作者: 阿靖哦 | 来源:发表于2019-07-05 10:28 被阅读4次

    Spring Cloud Ribbon 是一个基于 Http 和 TCP 的客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。客户端负载均衡即是当浏览器向后台发出请求的时候,客户端会向 Eureka Server 读取注册到服务器的可用服务信息列表,根据设定的负载均衡策略(没有设置即用默认的),选择向哪台服务器发送请求

    本文将介绍Ribbon的工作原理以及如何在项目中使用

    一、Ribbon简介

    1、Ribbon工作原理

    ribbon实现的关键点是为ribbon定制的RestTemplate,ribbon利用了RestTemplate的拦截器机制,在拦截器中实现ribbon的负载均衡。负载均衡的基本实现就是利用applicationName从服务注册中心获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行http调用

    info.png

    2、Ribbon的常用负载策略

    • RandomRule:随机选取负载均衡策略。

    随机选择状态为UP的Server

    • RoundRobinRule:简单轮询负载均衡,默认选择

    以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器

    • WeightedResponseTimeRule:加权响应时间负载均衡

    根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低

    • ZoneAvoidanceRule:区域感知轮询负载均衡

    复合判断server所在区域的性能和server的可用性选择server

    二、搭建Eureka服务

    由于有专门一章介绍Eureka,对Eureka不熟悉的可以前往阅读这篇文章:SpringCloud组件之Eureka
    ,这里不在讲解如何搭建啦。

    三、搭建web服务,用于ribbon调用

    1、导入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

    2、配置文件

    • bootstrap.yml
    spring:
      profiles:
        active: demo1
    
    • application-demo1.yml
    server:
      port: 8090
    spring:
      application:
        name: demo
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
    • application-demo2.yml
    server:
      port: 8091
    spring:
      application:
        name: demo
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    

    由于要测试负载,因此创建两个配置文件,bootstrap为引导文件,较application先执行

    3、启动类

    /**
     * @author Gjing
     */
    @SpringBootApplication
    @EnableEurekaClient
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    4、提供接口

    /**
     * @author Gjing
     **/
    @RestController
    public class TestController {
    
        @GetMapping("/test-ribbon")
        public String testRibbon() {
            System.out.println("有新的请求");
            return "success";
        }
    
    }
    

    分别启动两个不同的端口服务

    四、搭建发起Ribbon调用的服务

    1、导入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    2、配置文件

    server:
      port: 8084
    spring:
      application:
        name: ribbon-demo
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    

    3、启动类

    /**
     * @author Gjing
     */
    @SpringBootApplication
    @EnableEurekaClient
    public class RibbonApplication {
        public static void main(String[] args) {
            SpringApplication.run(RibbonApplication.class, args);
        }
    }
    

    4、配置类

    向容器中注入 restTemplate,同时通过 @LoadBalanced 开启 restTemplate 负载均衡功能

    /**
     * @author Gjing
     **/
    @Configuration
    public class RibbonConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    

    5、接口调用

    /**
     * @author Gjing
     **/
    @RestController
    public class TestRibbonController {
    
        @Resource
        private RestTemplate restTemplate;
    
        @PostMapping("/test")
        public String test() {
            return restTemplate.getForObject("http://demo/test-ribbon", String.class);
        }
    }
    

    启动后测试,会发现轮询调用我们之前启动的两个不同端口的服务

    • 服务1
      1.jpg
    • 服务2
      2.jpg

    6、负载策略很多,本文举例随机策略来实现负载

    修改配置类,增加策略规则

    /**
     * @author Gjing
     **/
    @Configuration
    public class RibbonConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        // 配置随机策略
        @Bean
        public IRule ribbonRandomRule() {
            return new RandomRule();
        }
    }
    

    接下来启动就是随机向某个服务发起请求了,以下是两个服务的响应情况

    • 服务1


      3.jpg
    • 服务2


      4.jpg

    好了,本文到此就结束啦,如果发现有误,可以评论留言哦,希望大家可以关注我哦,我会经常分享技术文章,本文Demo地址:SpringCloud-Demo

    相关文章

      网友评论

        本文标题:SpringCloud组件之Ribbon

        本文链接:https://www.haomeiwen.com/subject/qclshctx.html