Dubbo负载均衡策略

这篇具有很好参考价值的文章主要介绍了Dubbo负载均衡策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 {
    @Override
    public 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";

    @Override
    protected <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负载均衡策略的介绍与实践。文章来源地址https://www.toymoban.com/news/detail-408300.html

到了这里,关于Dubbo负载均衡策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Dubbo 路由及负载均衡性能优化

    作者:vivo 互联网中间件团队- Wang Xiaochuang 本文主要介绍在vivo内部针对Dubbo路由模块及负载均衡的一些优化手段,主要是异步化+缓存,可减少在RPC调用过程中路由及负载均衡的CPU消耗,极大提升调用效率。 vivo内部Java技术栈业务使用的是Apache Dubbo框架,基于开源社区2.7.x版本

    2024年02月08日
    浏览(39)
  • 中间件(二)dubbo负载均衡介绍

    支持轮询、随机、一致性hash和最小活跃数等。 ① sequences:内部的序列计数器 ② 服务器接口方法权重一样:(sequences+1)%服务器的数量=(决定调用)哪个服务器的服务。 ③ 服务器接口方法权重不一样:找到最大权重(权重数)%(sequences+1),然后找出权重比该取模后的值

    2024年02月12日
    浏览(32)
  • Dubbo的几个负载均衡类--最短响应时间

    -----------------看过之前一致性哈希和最少活跃书的可以跳过-----------------  链接在此:Dubbo的几个负载均衡类--一致性哈希 Dubbo的几个负载均衡类--最少活跃数 Dubbo的几个负载均衡类--轮询 Dubbo的几个负载均衡类--随机 消费者发起调用过程中涉及如下几步 1:接口调用,比如Demo

    2024年01月23日
    浏览(40)
  • 2.1: Dubbo的基本应用-负载均衡,集群容错,服务降级

    官网地址:  http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略,   以消费端为准。 这其中比较难理解的就是最少活跃调用数是如何进行统计的? 讲道理 ,   最少活跃数应该是在 服务提供者端 进行统计的,   服务提供者统计有

    2024年02月10日
    浏览(27)
  • nginx的各种负载均衡策略与各种负载均衡策略如何配置

    Nginx支持多种负载均衡策略,每种策略都有其特定的适用场景和配置方式。以下是一些常见的Nginx负载均衡策略及其配置方法: 这是Nginx的默认策略,每个请求按顺序依次分发到不同的服务器上。 配置示例: 在轮询的基础上,为后端服务器分配不同的权重,权重越高,接收的

    2024年04月09日
    浏览(46)
  • dubbo源码中设计模式——负载均衡中模版模式的应用

    在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 使用场景:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板

    2024年02月19日
    浏览(44)
  • SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡

    假设我们有一台 order-service 订单服务,两台 user-service 用户服务,当订单服务需要调用用户服务获取用户信息的时候,应该怎么分配调用哪台服务呢? 这时候就需要用到 Ribbon 组件了。 首先,我们发起远程调用的时候,指定的是需要调用的服务名称,然后我们会调用 Ribbon 组

    2024年02月11日
    浏览(46)
  • 负载均衡策略 LVS

    (1) 概念: LB:负载均衡 (Load Balancing) 是一种分发网络流量的技术,LB 负载均衡的基本原理是将传入的网络流量分发到多个后端服务器,以确保这些服务器都承担相似的工作负载,从而避免某一台服务器过载而其他服务器处于空闲状态。 (2) 负载均衡产品分类: ① 软件负载均

    2024年02月08日
    浏览(44)
  • gateway网关负载均衡策略

    前言  之前作业是使用 nacos注册中心来搭建有一个微服务,消费者必然要用到gateway网关来操作路由,并且配置负载均衡策略。 搭建微服务-文章链接:快速搭建微服务-Nacos_一码超人的博客-CSDN博客_微服务搭建nacos  添加一个gateway模块  配置文件application.yml  访问服务:http:

    2024年02月12日
    浏览(41)
  • nginx负载均衡的策略

    本文同步发布于 http://laowubiji.com/index.php/2023/02/01/nginx_config/ nginx的负载均衡策略有六种: 1、轮询(默认策略,nginx自带策略):我上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。会将每个请求按时间顺序分配到不同的后端服务器。 2、weight(权重,n

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包