1.2 ribbon-客户端负载均衡

Posted itpower

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.2 ribbon-客户端负载均衡相关的知识,希望对你有一定的参考价值。

一. 客户端负载均衡器Ribbon

1. 什么是服务端负载均衡

之前研究nacos的时候也说过服务端负载均衡和客户端负载均衡. 其实我们常用的服务端负载均衡就是nginx

 

在负载均衡中维护一个可用的服务实例清单, 当客户端请求来临时, 负载均衡服务器按照某种配置好的规则(负载均衡算法), 从可用服务实例清单中, 选取其一去处理客户端请求, 这就是服务端负载均衡, 例如Nginx. 通过nginx进行负载均衡, 客户端发送请求值Nginx, nginx通过负载均衡算法, 在多个服务器之间选择一个进行访问. 

技术图片

 

 

2. 什么是客户端负载均衡

接下来, 我们要讲的ribbon, 就属于客户端负载均衡, 在ribbon客户端会有一个服务实例地址列表, 在发送请求前, 通过负载均衡算法, 选择一个服务实例, 然后进行访问, 这是客户端负载均衡. 即在客户端进行负载均衡算法分配.

技术图片

3. 客户端负载均衡的用法

先面我们先来看看ribbon负载均衡的效果 

第一步: 添加依赖

我么拷贝了一个order项目, 为其添加ribbon依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>           
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

技术图片

第二步: 增加注解: @LoadBalance

技术图片

 这里在实例化RestTemplate的时候, 增加一个注解@LoadBalanced. 

我们之前在研究zuul的时候, 好像没有配置过这个注解呀, 为什么呢?因为在zuul里调用的时候使用feign, feign里面实现了这个负载均衡.

第三步: 在order服务中调用product服务, 使用的是restTemplate方式调用

package com.lxl.www.gateway.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@Slf4j
@RestController
public class UserController {
    
    @Autowired
    private DiscoveryClient discoveryClient;
    
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("get/user")
    public String getUser() {
        String forObject = restTemplate.getForObject("http://product/config", String.class);
        System.out.println(forObject);
        return forObject;
    }
}

第四步: 验证效果

启动order服务1台-里面添加了ribbon依赖配置, 端口号是8080

启动product服务3台, 端口号分别是8081, 8082, 8083

技术图片

 

 product的详情信息

技术图片

 

 请求服务

http://localhost:8080/get/order

技术图片

我们看到调用了3次, 每个实例被调用1次

二. 配置ribbon负载均衡策略

我们看到了ribbon的基本用法, 知道他的一个基本的实现原理, 下面来看看ribbon的基本配置

 

1. ribbon默认的负载均衡策略

技术图片

 

  ribbon自带的负债均衡策略一共有6中

  • RandomRule: 是随机策略
  • RoundRobinRule: 轮询策略
  • RetryRule: 重试策略
  • ZoneAvoidanceRule: 地域内轮询策略(默认策略). 这里zone在亚马逊服务器上有,在阿里云上没有这个概念, 所以可以不考虑zone, 那么这个策略相当于轮询.
  • PredicateBaseRule: 
  • WeightedResponseTimeRule: 权重响应策略

最后我们来看看这些策略的具体实现

2. ribbon的细粒度自定义配置 --- 36

在配置文件中设置使用的负载均衡策略

# 所有实例公用
ribbon:
  NFLoadBalanceRuleClassName: com.netflex.loadbalance.RandomRule

#指定服务实例使用
product:
  ribbon:
    NFLoadBalanceRuleClassName: com.netflex.loadbalance.RandomRule

user:
  ribbon:
    NFLoadBalanceRuleClassName: com.netflex.loadbalance.RandomRobinRule

 

2. ribbon配置

技术图片

 

 

ribbon:
ReadTimeout: 1000
ConnectTimeout: 1000
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
OkToRetryOnAllOperations: false
http:
client:
enabled: true

这里面MaxAutoRetries参数是什么意思呢? 

每一台服务器重试的次数, 不包含首次调用的按一次

ribbon.MaxAutoRetries=1
含义是如果调用服务失败了, 那么重试1次

这里的MaxAutoRetriesNextServer是什么意思呢?

重试服务器的个数, 不包含首次调用的那一台实例

ribbon.MaxAutoRetriesNextServer=2
含义是是: 如果负载均衡选择了服务器1, 结果调用失败, 重试还是失败了. 那么这是可以选择重试除了这台服务器的其他服务器. 可以重试几台呢? 可以重试两台

 这里的OkToRetryOnAllOperations是什么意思呢?

这里是对http方法进行重试设置, 可以设置成true或者false

如果设置为true: 则表示post,put等方法也会进行重试. 这样会导致的问题是, 重复提交. 要避免这个事情的发生, 要保证服务的幂等性

什么是服务的幂等性呢? 

看一下这篇文章就明白了: https://www.cnblogs.com/QG-whz/p/10372458.html

 

3. 自定义Ribbon负载均衡

3.1 按照权重实现负载均衡--66分

在nacos中可以配置服务器的权重

 技术图片

 

 技术图片

 

技术图片

 

 

启动服务 

配合nacos服务实例设置服务器的权重 

测试

 技术图片

 

技术图片

3.2 实现同集群优先调用的原则--76

 尽量避免跨集群调用

比如, 南京集群的product优先调用南京集群的order . 北京集群的product优先调用北京集群的order.

技术图片

 

 实现如上图所示的功能

 

技术图片

 

首先确定集群名称

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 3.3金丝雀发布

 技术图片

 

金丝雀发布, 也称为灰度发布, 是什么意思呢?

首先, 我们的product服务实例有100台, order服务实例有100台.

现在都是在v1 版本上

然后新开发了一个变化很大的功能, 要进行灰度测试

在product-center上发布了5台, 在order-center上发布了5台

那么现在用户的流量过来了, 如果请求的是product-center的v1版本的流量, 那么就要全部都走v1版本, 请求的order-center也要是v1版本

如果过来的用户, 请求的v2版本的流量, 那么product和order都走v2版本.

下面我们要实现的功能描述如下:

 

技术图片

 

1. 同集群,同版本优先调用

2. 没有同集群的服务提供者, 进行跨集群,同版本调用

3. 不可以进行不同版本间的调用

 

技术图片

 

 技术图片

 

技术图片

 技术图片

 

 技术图片

 

 

 

 技术图片

 

技术图片

 

技术图片

 

 技术图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

as

 

以上是关于1.2 ribbon-客户端负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud微服务负载均衡器Ribbon

SpringCloud微服务负载均衡器Ribbon

springCloud:Ribbon实现客户端侧负载均衡-自定义Ribbon配置

ribbon负载均衡详解

05.负载均衡之Ribbon

Ribbon-负载均衡策略