# 负载均衡

本文介绍如何使用负载均衡插件 (opens new window)

# 功能介绍

负载均衡插件主要用于非侵入地动态修改宿主应用的负载均衡策略。

# 参数配置

# 插件配置

负载均衡插件需要配置默认的负载均衡策略、是否强制使用插件的负载均衡等信息。可在${path}/sermant-agent-x.x.x/agent/pluginPackage/loadbalancer/config/config.yaml找到该插件的配置文件,配置如下所示:

loadbalancer.plugin:
  defaultRule:        # 默认的负载均衡策略。没有配置负载均衡策略时,使用默认的负载均衡策略。
  forceUseSermantLb:  # 是否强制使用插件的负载均衡。负载均衡插件通过该配置决定是否强制修改用户的负载均衡策略。当前配置仅对ribbon生效。ribbon可能存在用户自身的负载均衡配置, 若用户不想影响自身的负载均衡配置, 则可将之设置为false。
  useCseRule:         # 是否使用CSE规则。负载均衡插件根据是否使用CSE规则订阅不同的动态配置路径。
参数键 说明 默认值 是否必须
loadbalancer.plugin.defaultRule 默认的负载均衡策略
loadbalancer.plugin.forceUseSermantLb 是否强制使用插件的负载均衡 true
loadbalancer.plugin.useCseRule 是否使用cse规则 true

# 详细治理规则

负载均衡插件基于动态配置中心进行配置发布,配置发布可以参考动态配置中心使用手册

负载均衡插件需要配置的动态配置信息如下:

  • servicecomb.matchGroup.xxx: 流量标记(动态配置的key值)。用于标记当前业务场景针对那些服务生效。其对应的content为
alias: loadbalancer-rule
matches:
- serviceName: zk-rest-provider  # 目标服务名

serviceName为下游服务名,若配置项serviceName未配置,则应用于所有微服务。需要注意的是,该配置仅需配置serviceName配置项,其他的格式需保持不变。

  • servicecomb.loadbalance.xxx: 负载均衡规则(动态配置的key值)。用于配置具体业务场景下生效的负载均衡规则。其对应的content为
rule: Random

说明: xxx为具体的业务场景名称, 流量标记和负载均衡策略的场景一致时负载均衡策略生效

配置值的范围见表支持版本和限制配置值

负载均衡插件默认支持两种级别的group配置:

  • 微服务级别:即group的值为app=default&environment=&service=${yourServiceName},其中${yourServiceName}为动态获取的微服务名称,environment默认为空。可以参考参数配置方式appenvrionment进行变更。

  • 应用级别:即group的值为 app=default&environment=, environment默认为空, 环境变量配置方式同微服务级别

# 支持版本与限制

框架类型 策略名 配置值 / 负载均衡策略 版本支持
dubbo 随机(dubbo默认) Random / RANDOM 2.6.x, 2.7.x
dubbo 轮询 RoundRobin / ROUNDROBIN 2.6.x, 2.7.x
dubbo 最少活跃 leastActive / LEASTACTIVE 2.6.x, 2.7.x
dubbo 一致性HASH consistentHash / CONSISTENTHASH 2.6.x, 2.7.x
dubbo 最短响应时间 shortestResponse / SHORTESTRESPONSE 2.7.7+
spring-cloud-netflix-ribbon 区域权重(ribbon默认) zoneAvoidance / ZONE_AVOIDANCE ZONE_AVOIDANCEspring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-netflix-ribbon 随机 Random / RANDOM spring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-netflix-ribbon 轮询 RoundRobin / ROUND_ROBIN spring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-netflix-ribbon 重试 retry / RETRY spring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-netflix-ribbon 最低并发 bestAvailable / BEST_AVAILABLE spring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-netflix-ribbon 筛选过滤轮询 availabilityFiltering / AVAILABILITY_FILTERING spring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-netflix-ribbon 响应时间加权重(Deprecated) ResponseTimeWeighted / RESPONSE_TIME_WEIGHTED spring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-netflix-ribbon 响应时间加权重 weightedResponseTime / WEIGHTED_RESPONSE_TIME spring cloud Edgware.x, spring cloud Finchley.x, spring cloud Greenwich.x, spring cloud Hoxton.x
spring-cloud-loadbalancer 轮询(loadbalancer默认) RoundRobin / ROUND_ROBIN spring cloud Hoxton.SR10+, spring cloud 2020.0.x, spring cloud 2021.0.x
spring-cloud-loadbalancer 随机 Random / RANDOM spring cloud Hoxton.SR10+, spring cloud 2020.0.x, spring cloud 2021.0.x

# 操作和结果验证

下面将演示如何使用负载均衡插件,验证SpringBoot应用采用ZooKeeper配置中心,动态更新宿主应用的负载均衡策略场景。

# 准备工作

# 步骤一:获取Demo二进制产物

解压Demo二进制产物压缩包,即可得到resttemplate-consumer.jarresttemplate-provider.jar

# 步骤二:发布流量标记

参考使用动态配置中心使用手册进行配置发布,发布如下配置

{
    "content": "alias: loadbalancer-rule\n matches:\n- serviceName: zk-rest-provider", 
    "group": "app=default&environment=&service=zk-rest-consumer", 
    "key": "servicecomb.matchGroup.testLb"
}

以ZooKeeper为例,利用ZooKeeper提供的命令行工具进行配置发布。

1、在${path}/bin/目录执行以下命令创建节点/app=default&environment=&service=zk-rest-consumer

# linux mac
./zkCli.sh -server localhost:2181 create /app=default&environment=&service=zk-rest-consumer

# windows
zkCli.cmd -server localhost:2181 create /app=default&environment=&service=zk-rest-consumer

说明:${path}为zookeeper的安装目录

2、在${path}/bin/目录执行以下命令创建节点/app=default&environment=&service=zk-rest-consumer/servicecomb.matchGroup.testLb和数据alias: loadbalancer-rule\n matches:\n- serviceName: zk-rest-provider

# linux mac
./zkCli.sh -server localhost:2181 create /app=default&environment=&service=zk-rest-consumer/servicecomb.matchGroup.testLb "alias: loadbalancer-rule
matches:
- serviceName: zk-rest-provider"

# windows
zkCli.cmd -server localhost:2181 create /app=default&environment=&service=zk-rest-consumer/servicecomb.matchGroup.testLb "alias: loadbalancer-rule
matches:
- serviceName: zk-rest-provider"

# 步骤三:发布匹配的负载均衡规则(以Random为例)

参考使用动态配置中心使用手册进行配置发布, 发布如下配置

{
    "content": "rule: Random", 
    "group": "app=default&environment=&service=zk-rest-consumer", 
    "key": "servicecomb.loadbalance.testLb"
}

以ZooKeeper为例,利用ZooKeeper提供的命令行工具进行配置发布。

1、在${path}/bin/目录执行以下命令创建节点/app=default&environment=&service=zk-rest-consumer/servicecomb.loadbalance.testLb和数据rule: Random

# linux mac
./zkCli.sh -server localhost:2181 create /app=default&environment=&service=zk-rest-consumer/servicecomb.loadbalance.testLb "rule: Random"

# windows
zkCli.cmd -server localhost:2181 create /app=default&environment=&service=zk-rest-consumer/servicecomb.loadbalance.testLb "rule: Random"

# 步骤四:启动Demo应用

参考如下命令启动两个生产者

  • 参考如下命令启动服务提供者,端口为8006
# Run under Linux
java -javaagent:${path}/sermant-agent-x.x.x/agent/sermant-agent.jar=appName=default -Dserver.port=8006 -jar resttemplate-provider.jar
# Run under Windows
java -javaagent:${path}\sermant-agent-x.x.x\agent\sermant-agent.jar=appName=default -Dserver.port=8006 -jar resttemplate-provider.jar
  • 参考如下命令启动服务提供者,端口为8007
# Run under Linux
java -javaagent:${path}/sermant-agent-x.x.x/agent/sermant-agent.jar=appName=default -Dserver.port=8007 -jar resttemplate-provider.jar
# Run under Windows
java -javaagent:${path}\sermant-agent-x.x.x\agent\sermant-agent.jar=appName=default -Dserver.port=8007 -jar resttemplate-provider.jar
  • 参考如下命令启动消费者(一个实例即可),端口为8005
# Run under Linux
java -javaagent:${path}/sermant-agent-x.x.x/agent/sermant-agent.jar=appName=default -Dserver.port=8005 -jar resttemplate-consumer.jar
# Run under Windows
java -javaagent:${path}\sermant-agent-x.x.x\agent\sermant-agent.jar=appName=default -Dserver.port=8005 -jar resttemplate-consumer.jar

说明: ${path}为sermant实际安装路径,x.x.x代表sermant某个版本号。

# 验证

上面步骤全部完成后,访问接口 http://localhost:8005/hello, 多次调用,如果返回的端口信息中8006、8007随机展示则表示随机负载均衡规则(默认为轮询)已生效。

效果图如下所示:

上次更新: 2024/5/16 02:26:27