05、Dubbo 中服务的负载均衡

Dubbo 中服务的负载均衡

  • 1.什么是服务集群
  • 1.1 服务集群优点
  • 1.2 集群模式
  • 1.2.1 真实集群
  • 1.2.2 伪集群
  • 2.什么是负载均衡
  • 3.负载均衡解决方案分类及特征
  • 3.1 集中式负载均衡
  • 3.1.1常见的集中式负载均衡方式
  • 3.1.1.1 DNS 轮询
  • 3.1.1.2 反向代理负载均衡
  • 3.1.1.3 基于硬件的负载均衡
  • 3.2 进程内负载均衡
  • 4.Dubbo 的内置负载均衡策略
  • 4.1 Random
  • 4.2 RoundRobin
  • 4.3 LeastActive
  • 4.4 ConsistentHash
  • 5.Dubbo 负载均衡的使用
  • 5.1 在 Consumer 中配置负载均衡
  • 5.1.1 启动 Provider 集群
  • 5.1.1.1 通过创建多个启动类启动
  • 5.1.1.2 通过一个启动类启动多次
  • 5.1.2 通过注解配置负载均衡
  • 5.1.2.1 指定负载均衡策略
  • 5.1.2.2 随机策略配置权重
  • 5.1.2.3 通过 Provider 的@Service 注解配置权重
  • 5.1.2.4 配置轮询策略
  • 5.1.2.5 轮询策略加权
  • 5.1.3 通过配置文件配置配置负载均衡
  • 5.2 在 Provider中配置负载均衡
  • 5.2.1 在 Dubbo 的@Service 注解中配置负载均衡以及权重
  • 5.2.2 通过配置文件配置负载均衡

1.什么是服务集群

  • 一个服务,部署多次,形成的整体称为服务集群。

1.1 服务集群优点

  • 避免出现单点故障:如果集群中有某个服务宕机,其他服务可继续运行。
  • 提高效率:在集群模式下有多个服务处理业务,相比非集群模式下可分担单个服务的压力,提高服务效率。

1.2 集群模式

1.2.1 真实集群
  • 真实集群是指在集群中,每一个节点在一个独立的物理机中运行,当某个物理机出现设备故障并不会影响其他节点的运行。建议在生产环境中使用。
  • 优点:单个硬件出现故障并不会影响集群中其他节点的运行。
  • 缺点:加大硬件成本的开销。
1.2.2 伪集群
  • 集群中所有的服务都部署到同一台设备上,通过不同端口区分不同个体。当设备出现问题会导致整个集群不可用。学习阶段可以使用,但不建议在生产环境中使用
  • 优点:可节省硬件成本开销。
  • 缺点:硬件出现故障会影响正个集群的使用

2.什么是负载均衡

  • 负载均衡(Load Balance),是指将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行
  • 最常见的负载均衡
     
  • 这一种古老的方式,通过入口提供不同线路、不同服务器链接的方式,来实现负载均衡,一般在提供下载业务的网站比较常见。

3.负载均衡解决方案分类及特征

3.1 集中式负载均衡

  • 即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如 nginx), 由该设施负责把访问请求通过某种策略转发至服务端
3.1.1常见的集中式负载均衡方式
3.1.1.1 DNS 轮询
  • 大多域名注册商都支持 DNS 轮询,DNS 服务器将解析请求按照配置顺序,逐一分配到不同的 IP 上,这样就完成了简单的负载均衡。
3.1.1.2 反向代理负载均衡

 

  • 使用代理服务器,可以将请求转发给内部的服务器。Nginx 是比较常见的服务反向代理技术。在 Nginx 中是支持对代理的服务的负载均衡处理的。
3.1.1.3 基于硬件的负载均衡

 

  • 硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备我们通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求
  • 常见的主流产品:
  • F5 BIG-IP 负载均衡器(LTM)
     
  • 思科 IOS 路由器
     
  • Radware 的 AppDirector 系列
     

3.2 进程内负载均衡

  • 将负载均衡逻辑集成到服务组件中,服务组件从服务注册中心获知有哪些地址可用,然后根据指定的负载均衡策略选择出一个合适的服务来调用。
     

4.Dubbo 的内置负载均衡策略

4.1 Random

  • 随机访问集群中节点。访问概率和权重有关。是 Dubbo 的默认负载均衡策略。
  • 权重(weight):占有比例。集群中每个项目部署的服务器的性能可能是不同,性能好的服务器权重应该高一些。

4.2 RoundRobin

  • 轮询。访问频率和权重有关。

4.3 LeastActive

  • 最少活跃调用数,相同活跃数的随机。
  • 如果某个机器性能越差,那么接收的请求越少,越不活跃,此时就会给不活跃的性能差的机器分配更少的请求

4.4 ConsistentHash

  • 一致性 Hash 算法,相同参数的请求一定分发到同一个 Provider 如果需要某一类请求都到一个节点,那么可以使用一致性 Hash 策略。

5.Dubbo 负载均衡的使用

  • Dubbo 的负载均衡可以在 Consumer 或者 Provider 中通过配置文件或者注解来配置。

5.1 在 Consumer 中配置负载均衡

  • 将 Provider 启动三次,在启动时注意修改 dubbo.protocol.port 的值。
5.1.1 启动 Provider 集群
5.1.1.1 通过创建多个启动类启动
  • 可以为 Provider 创建多个启动类来启动,通过不同的启动类来启动集群中不同的节点。
5.1.1.2 通过一个启动类启动多次
  • 打开配置启动项
     
  • 选择需要多次运行的启动类,将 Allow parallel run 选中,开启允许并行运行
     
5.1.2 通过注解配置负载均衡
  • 在 Dubbo 中,如果没有指定负载均衡策略,那么 Dubbo 默认的使用随机策略调用 Provider。
5.1.2.1 指定负载均衡策略
  • 修改@Refrence 注解添加 loadbalance 属性指定负载均衡策略。
@Reference(loadbalance ="负载均衡策略")
5.1.2.2 随机策略配置权重
  • 随机获取一个[0, totalWeight)之间的数,offset = offset - weight,如果 offset 小于 0,则选中,很明显 weight 大的更容易让 offset 的值小于 0。
  • 举个例子有4权重分别为(1,2, 3, 4),totalWeight = 10, 假如 offset = 6, 6 - 1 = 5, 5 大于 0,继续 5 - 2 = 3 大于 0,3 - 3 = 0, 0 - 4 小于 0 ,所以选择权重为 4 的 invoker, 这里可以发现只要 offset >= 6 则选择权重为 4 的 invoker, 正好是 40%。
5.1.2.3 通过 Provider 的@Service 注解配置权重
@Service(weight = 权重数)
5.1.2.4 配置轮询策略
  • 所谓轮询是指将请求轮流分配给每台服务器。举个例子,我们有三台服务器 A、B、C。我们将第一个请求分配给服务器 A,第二个请求分配给服务器 B,第三个请求分配给服务器 C,第四个请求再次分配给服务器 A。这个过程就叫做轮询
@Reference(loadbalance = "roundrobin")
5.1.2.5 轮询策略加权
  • 如果我们将等量的请求分配给性能较差的服务器,这显然是不合理的。因此,这个时候我们需要对轮询过程进行加权,以调控每台服务器的负载。经过加权后,每台服务器能够得到的请求数比例,接近或等于他们的权重比。
@Service(weight = 权重数)
5.1.3 通过配置文件配置配置负载均衡
  • 在 SpringBoot 的配置文件中可以配置全局的负载均衡。Consumer 中所有调用 Provider 集群的业务层都会使用该负载均衡策略。
  • 与注解配置方式区别:
    注解配置方式:局部,只针对当前业务层生效。
    配置文件方式:全局,对所有业务层生效。
dubbo: 
    consumer: 
        loadbalance: random

5.2 在 Provider中配置负载均衡

5.2.1 在 Dubbo 的@Service 注解中配置负载均衡以及权重
@Service(loadbalance = "roundrobin",weight = 3)
5.2.2 通过配置文件配置负载均衡
dubbo: 
    provider: 
        loadbalance: aoundrobin