微服务之Ribbon

Ribbon

  • 1 简介
    • 1.1 基本情况
    • 1.2 Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
    • 1.3 Load Balance负载均衡分类
    • 1.4 工作原理
  • 2 Ribbon实现
    • 2.1 pom.xml
    • 2.2 RestTemplate的使用
  • 3 Ribbon负载规则
    • 3.1 默认的负载规则
    • 3.2 替换负载规则


Ribbon 中文官方文档→官方文档

1 简介

1.1 基本情况

  1. Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
  2. 功能:提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
  3. 优点:在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
  4. 现状:Ribbon目前也进入维护模式,Ribbon未来可能被Spring Cloud LoadBalacer替代。

1.2 Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别

  • Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
  • Ribbon本地负载均衡在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

1.3 Load Balance负载均衡分类

集中式LB:即在服务的消费方和提供方之间使用独立的LB设施(如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;
进程内LB:将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用(如Ribbon),然后自己再从这些地址中选择出一个合适的服务器。

1.4 工作原理

原理:Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和Eureka结合只是其中的一个实例。

微服务之Ribbon_第1张图片

步骤

  1. 先选择EurekaServer ,它优先选择在同一个区域内负载较少的server。

  2. 再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。

2 Ribbon实现

2.1 pom.xml

  1. 引入spring-cloud-starter-netflix-eureka-client,因为spring-cloud-starter-netflix-eureka-client自带了spring-cloud-starter-ribbon引用。
  2. 引入spring-cloud-starter-ribbon也可以使用ribbon。
<dependency>
    <groupld>org.springframework.cloudgroupld>
    <artifactld>spring-cloud-starter-netflix-ribbonartifactid>
dependency>

2.2 RestTemplate的使用

方法名
说明
读操作 getForObject():返回对象为响应体中数据转化成的对象,基本上可以理解为Json。
getForEntity():返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。
写操作 postForObject():返回对象为响应体中数据转化成的对象,基本上可以理解为Json。
postForEntity():返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。
    @GetMapping("/consumer/cluster/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
    @GetMapping("/consumer/cluster/getForEntity/{id}")
    public CommonResult<Payment> getForEntity(@PathVariable("id") Long id) {
        ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id,CommonResult.class);
        boolean successful = entity.getStatusCode().is2xxSuccessful();
        if (successful)
            return new CommonResult(entity.getStatusCodeValue(),entity.getStatusCode().name(),entity.getBody().getData());

        return new CommonResult<>(entity.getStatusCodeValue(),"返回失败");
    }

运行结果

微服务之Ribbon_第2张图片
    @PostMapping("/consumer/cluster/create")
    public CommonResult<Payment> create(Payment payment) {
        /**
         * restTemplate三个参数分别为URL、传入的参数、返回的结果类型
         */
        CommonResult commonResult = restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
        return commonResult;
    }

    @PostMapping("/consumer/cluster/postForEntity")
    public CommonResult<Payment> postForEntity(Payment payment) {
        // restTemplate三个参数分别为URL、传入的参数、返回的结果类型
        ResponseEntity<CommonResult> entity = restTemplate.postForEntity(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
        //状态码、状态码名称,返回的结果
        return new CommonResult(entity.getStatusCodeValue(),entity.getStatusCode().name(),entity.getBody().getData());
    }

运行结果

微服务之Ribbon_第3张图片

3 Ribbon负载规则

微服务之Ribbon_第4张图片

3.1 默认的负载规则

微服务之Ribbon_第5张图片

3.2 替换负载规则

警告:FooConfiguration 不能被@ComponentScan 在main application context。这样的话,它将被所有@RibbonClients共享。如果你使用 @ComponentScan (or @SpringBootApplication) ,你需要避免它被包括其中。(例如:放它到一个独立的,无重叠的包里,或者指明不被@ComponentScan扫描)。

1. 新建package包com.tl.rule

微服务之Ribbon_第6张图片

2. 在新包新建BalanceRule规则类

@Configuration
public class BalanceRule {

    @Bean
    public IRule balanceRule(){
        return new RandomRule();
    }
}

3. 主启动类下添加@RibbonClient注解

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = BalanceRule.class)
public class OrderMain {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain.class,args);
    }
}

4. 测试

你可能感兴趣的:(Spring,ribbon,spring,cloud,spring,boot,eureka)