Dubbo负载均衡策略

news/2024/12/2 21:36:40/

文章目录

  • Dubbo负载均衡策略
    • Dubbo负载均衡策略
    • 操作步骤
      • 1. 环境准备
      • 2. 配置提供者
      • 3. 编写服务提供者接口与实现类
      • 4. 配置消费者
      • 5. 编写服务消费者代码
      • 6. 运行项目
      • 7. 扩展Dubbo负载均衡策略
      • 8. 配置扩展负载均衡策略
      • 9. 运行项目

Dubbo负载均衡策略

在Dubbo中,负载均衡是实现高可用和高性能的重要手段之一。Dubbo支持多种负载均衡策略,可以根据业务场景进行选择。本文将详细介绍Dubbo支持的负载均衡策略,并结合代码实践给出操作步骤。

Dubbo负载均衡策略

Dubbo支持以下负载均衡策略:

  • 随机(Random):随机选择一个可用的服务提供者。
  • 最少活跃数(LeastActive):选择活跃数最少的服务提供者,即处理请求最少的服务提供者。
  • 一致性哈希(ConsistentHash):根据请求参数的hash值,按照顺时针方向路由到相邻节点。
  • 轮询(RoundRobin):按公平轮询的方式选择服务提供者。
  • 加权轮询(WeightedRoundRobin):按照服务提供者的权重进行轮询,权重越大被选中的概率越高。
  • 加权随机(WeightedRandom):根据权重随机选择服务提供者。

其中,随机、最少活跃数、一致性哈希、轮询是Dubbo自带的负载均衡策略,加权轮询和加权随机是Dubbo的扩展负载均衡策略。

操作步骤

1. 环境准备

本文以Spring Boot为例,首先需要新建一个Spring Boot项目。在pom.xml文件中添加以下依赖:

<dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>x.x.x</version>
</dependency>

其中,x.x.x为Dubbo的版本号。本文以2.7.6为例。

2. 配置提供者

在application.properties文件中配置服务提供者信息:

# 服务端口号
server.port=8080# Dubbo应用名
dubbo.application.name=demo-provider# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181# 服务提供者协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880# 服务提供者接口类全限定名
dubbo.scan.base-packages=com.example.demo.service# 服务提供者负载均衡策略
# 随机(Random)、最少活跃数(LeastActive)、一致性哈希(ConsistentHash)、轮询(RoundRobin)
# 加权轮询(WeightedRoundRobin)、加权随机(WeightedRandom)
dubbo.loadbalance=leastactive

其中,dubbo.loadbalance配置了服务提供者使用的负载均衡策略,本文以最少活跃数为例。

3. 编写服务提供者接口与实现类

在com.example.demo.service包中新建一个DemoService接口和DemoServiceImpl实现类:

// DemoService.java
public interface DemoService {String sayHello(String name);
}// DemoServiceImpl.java
@Service
public class DemoServiceImpl implements DemoService {@Overridepublic String sayHello(String name) {return "Hello, " + name;}
}

4. 配置消费者

在application.properties文件中配置服务消费者信息:

# Dubbo应用名
dubbo.application.name=demo-consumer# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181# 服务消费者负载均衡策略
# 随机(Random)、最少活跃数(LeastActive)、一致性哈希(ConsistentHash)、轮询(RoundRobin)
# 加权轮询(WeightedRoundRobin)、加权随机(WeightedRandom)
dubbo.loadbalance=random

其中,dubbo.loadbalance配置了服务消费者使用的负载均衡策略,本文以随机为例。

5. 编写服务消费者代码

在com.example.demo.controller包中新建一个DemoController控制器类:

@RestController
public class DemoController {@Reference(version = "1.0.0")private DemoService demoService;@GetMapping("/hello/{name}")public String sayHello(@PathVariable String name) {return demoService.sayHello(name);}
}

其中,@Reference注解用于引用Dubbo提供的服务,version参数指定服务版本号。

6. 运行项目

启动Zookeeper服务器,并运行服务提供者和服务消费者。访问http://localhost:8080/hello/world,可以看到服务消费者随机选择了一个服务提供者进行调用。如果将服务消费者的负载均衡策略改为leastactive,再次访问http://localhost:8080/hello/world,可以发现服务消费者选择了最少活跃数的服务提供者进行调用。其他负载均衡策略同理。

7. 扩展Dubbo负载均衡策略

除了Dubbo自带的负载均衡策略之外,也可以扩展自定义的负载均衡策略。以加权随机为例,我们在com.example.demo.loadbalance包中新建一个WeightedRandomLoadBalance类:

public class WeightedRandomLoadBalance extends RandomLoadBalance {public static final String NAME = "weightedrandom";@Overrideprotected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {int totalWeight = 0;boolean sameWeight = true;for (int i = 0; i < invokers.size(); i++) {int weight = invokers.get(i).getUrl().getMethodParameter(invocation.getMethodName(), "weight", 100);if (i == 0) {totalWeight = weight;} else {totalWeight += weight;sameWeight = sameWeight && (weight == invokers.get(i - 1).getUrl().getMethodParameter(invocation.getMethodName(), "weight", 100));}}if (totalWeight > 0 && !sameWeight) {int offset = ThreadLocalRandom.current().nextInt(totalWeight);for (Invoker<T> invoker : invokers) {int weight = invoker.getUrl().getMethodParameter(invocation.getMethodName(), "weight", 100);offset -= weight;if (offset < 0) {return invoker;}}}return super.doSelect(invokers, url, invocation);}
}

该类继承自RandomLoadBalance类,使用加权随机的方式选择服务提供者。其中,为了支持加权随机,我们需要在服务提供者URL中添加weight参数,表示该服务提供者的权重。

8. 配置扩展负载均衡策略

在application.properties文件中配置服务提供者和服务消费者使用的负载均衡策略:

# 服务提供者负载均衡策略
# 随机(Random)、最少活跃数(LeastActive)、一致性哈希(ConsistentHash)、轮询(RoundRobin)
# 加权轮询(WeightedRoundRobin)、加权随机(WeightedRandom)
dubbo.loadbalance=weightedrandom# 服务消费者负载均衡策略
# 随机(Random)、最少活跃数(LeastActive)、一致性哈希(ConsistentHash)、轮询(RoundRobin)
# 加权轮询(WeightedRoundRobin)、加权随机(WeightedRandom)
dubbo.consumer.loadbalance=random

其中,dubbo.loadbalance配置了服务提供者使用的负载均衡策略,本文以加权随机为例。dubbo.consumer.loadbalance配置了服务消费者使用的负载均衡策略,本文以随机为例。

9. 运行项目

启动Zookeeper服务器,并运行服务提供者和服务消费者。访问http://localhost:8080/hello/world,可以看到服务消费者使用了加权随机的方式选择了一个服务提供者进行调用。

至此,我们完成了Dubbo负载均衡策略的介绍与实践。


http://www.ppmy.cn/news/38892.html

相关文章

STM-32:TIM输出比较—PWM驱动LED呼吸灯/PWM驱动舵机/PWM驱动直流电机

目录一、输出比较二、PWM三、定时器结构3.1输出比较通道&#xff08;通用&#xff09;3.2输出比较通道&#xff08;高级&#xff09;3.3输出模式控制器模式3.4PWM基本结构3.5PWM参数值计算四、外设4.1舵机4.2直流电机五、程序代码5.1PWM驱动LED呼吸灯5.2PWM驱动舵机5.3PWM驱动直…

学会吊打面试官之underedmap

小白&#xff1a;大牛你好&#xff01;我最近学习了STL容器&#xff0c;看到有个叫做unordered_map的容器&#xff0c;这是什么&#xff1f; 大牛&#xff1a;unordered_map是一个无序的关联式容器&#xff0c;也就是一种键值对的存储结构&#xff0c;其中的元素没有固定的顺序…

[linux kernel]slub内存管理分析(0) 导读

文章目录简介整体目录SLUB中的结构体关系图kmalloc 申请逻辑逻辑图逻辑简述kfree 释放逻辑逻辑图逻辑简述slab page状态转换关系图简介 linux 内核内存管理算法有管理页面分配的伙伴算法&#xff0c;和对于小块内存的slab、slob、slub算法。其中slab是slob和slub的基础&#x…

开心档之开发入门网-C++ 有用的资源

C 有用的资源 目录 C 有用的资源 C 有用的网站 C 有用的书籍 以下资源包含了 C 有关的网站、书籍和文章。请使用它们来进一步学习 C 的知识。 C 有用的网站 C Standard Library headers − C 标准库。C Programming − 这本书涵盖了 C 语言编程、软件交互设计、C 语言的现…

CMake入门教程【基础篇】4.target_include_directories包含指定文件夹头文件

target_include_directories包含指定文件夹头文件 文章目录 知识点实例代码目录代码实现编译知识点 target_include_directories() 指定目标包含的头文件路径 实例 代码目录 |-📁prj3   |-- 🎴CMakeLists.txt   |-📁include    |-- 📄Hello.h   |-📁src…

java面试准备17

事务的四大特性 &#xff08;1&#xff09;原子性&#xff1a;事务执行的最小单位&#xff0c;不可被分割&#xff0c;事务的原子性保证事务中的一连串动作要么都执行&#xff0c;要么都不执行。 &#xff08;2&#xff09;一致性&#xff1a;执行事务前后的数据保持一致&…

Linux-Git

一、总论 1.1 写在前面的话 ​ 这已经是我第三遍学Git相关操作了&#xff0c;可以说这个玩意是真的狗&#xff0c;因为确实用不到&#xff0c;不知道下个学期会不会用到&#xff0c;直到现在我刚刚学完&#xff0c;处于知识水平的巅峰&#xff0c;知道Git的具体功能&#xff…

Linux系统,centos7系统安装以及使用教程

CentOS 7是一种基于Linux的操作系统&#xff0c;是红帽(Red Hat)企业版操作系统代码的开源再编译版本&#xff0c;是一种稳定、可靠、高性能的服务器操作系统。下面是一份CentOS 7系统的教程。 1.安装CentOS 7 下面介绍通过 DVD 安装 CentOS 7 的步骤&#xff1a; 1) 首先你…