当前位置:   article > 正文

dubbo(4)-负载均衡_dubbo.consumer.loadbalance

dubbo.consumer.loadbalance

dubbo的负载均衡,在集群负载均衡时,Dubbo 提供了多种均衡策略,默认为 random 随机调用。

负载均衡介绍:

负载均衡(Load Balance),是指将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。

最常见的负载均衡
这一种古老的方式,通过入口提供不同线路、不同服务器链接的方式,来实现负载均衡,一般在提供下载业务的网站比较常见。

负载均衡分类:

  • 集中式负载均衡

即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如 nginx),
由该设施负责把访问请求通过某种策略转发至服务端。 常见的集中式的方式

  1. DNS轮训 大多域名注册商都支持 DNS 轮询,DNS 服务器将解析请求按照配置顺序,逐一分配到不同的 IP 上,这样就完成了简单的负载均衡。
  2. 反向代理负载均衡 使用代理服务器,可以将请求转发给内部的服务器。Nginx 是比较常见的服务反向代理技术。在 Nginx 中是支持对代理的服务的负载均衡处理的。
  3. 基于硬件的负载均衡 硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备我们通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。
    常见的主流产品: F5 BIG-IP 负载均衡器(LTM) 思科 IOS 路由器 Radware 的 AppDirector 系列
  • 进程内负载均衡
    将负载均衡逻辑集成到服务组件中,服务组件从服务注册中心获知有哪些地址可用,然后根据指定的负载均衡策略选择出一个合适的服务来调用。软件进行的负载均衡。dubbo的负载均衡。

1. 随机负载均衡Random LoadBalance

随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

2. 轮训负载均衡RoundRobin LoadBalance

轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

3. 最少活跃调用数LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

4. 一致性hashConsistentHash LoadBalance

一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

5. dubbo的负载均衡配置

通过weight属性指定服务的权重,默认的每个服务都是权重都是100.

  1. 可以配置到接口,也可以配置到具体方法
  2. 可以配置到消费端,也可以配置到服务端

但是经过测试服务端配置的负载均衡不起作用

5.1 xml配置(可以精确到方法)

  • 客户端接口
<dubbo:reference id="demoService" interface="com.hww.api.IDemoService" loadbalance="random">
        <dubbo:method name="sayHello"/>
        <dubbo:method name="sayHi"/>
</dubbo:reference>
  • 1
  • 2
  • 3
  • 4
  • 客户端方法
<dubbo:reference id="demoService" interface="com.hww.api.IDemoService" >
        <dubbo:method name="sayHello" loadbalance="random"/>
        <dubbo:method name="sayHi" loadbalance="roundrobin"/>
</dubbo:reference>
  • 1
  • 2
  • 3
  • 4
  • 服务端接口
<dubbo:service interface="com.hww.api.IDemoService"
                   ref="demoService" registry="myRegistry"
                   protocol="dubbo" provider="myProvider" loadbalance="random">
        <dubbo:method name="sayHello" timeout="3000"/>
        <dubbo:method name="sayHi" timeout="3000"/>
</dubbo:service>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 服务端方法
<dubbo:service interface="com.hww.api.IDemoService"
                   ref="demoService" registry="myRegistry"
                   protocol="dubbo" provider="myProvider" >
        <dubbo:method name="sayHello" timeout="3000" loadbalance="random"/>
        <dubbo:method name="sayHi" timeout="3000" loadbalance="random"/>
</dubbo:service>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5.2 注解配置(接口配置)

服务端接口
@Service(interfaceClass = IDemoService.class,loadbalance = “random”,weight = 100)

package com.hww.service;

import com.hww.api.IDemoService;
import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.config.annotation.Service;

@Service(interfaceClass = IDemoService.class,weight = 100)
public class HelloService implements IDemoService {

    public String sayHello(String s) {

        System.out.println("负载-------");
        return "boot实现Dubbo";
    }

    @Override
    public String sayHi(String s) {
        return "boot实现Dubbo";
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

客户端接口
@Reference(loadbalance = “roundrobin”)

package com.example.dubboconsumerboot;

import com.hww.api.IDemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DubboConsumerBootApplicationTests {

    @Reference(loadbalance = "roundrobin")
    private IDemoService demoService;

    @Test
    void contextLoads() {

        for (int i = 0; i < 10; i++) {
            System.out.println(demoService.sayHello("aaaa"));
        }

    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

5.3 属性配置(全局配置)

客户端属性配置

dubbo.consumer.loadbalance=random
  • 1

服务端属性配置

dubbo.provider.loadbalance=random
  • 1

6. 总结说明

  1. 在在负载均衡时可以使用weight属性进行权重的设置。默认情况下权重时100.
  2. 既然负载均衡配置可以配置多种级别,多个配置是有覆盖关系的:

方法级优先,接口级次之,全局配置再次之。
如果级别一样,则消费方优先,提供方次之。
3. 负载均衡

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号