Dubbo的使用和相关概念

参考官网

  • 大致流程图
    在这里插入图片描述

1. 初始化项目

参考官网进行项目的初始化即可。

2. 相关配置

主要参考官网:这里仅给出提示

  • application.yml
dubbo:
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://${zookeeper.address:127.0.0.1}:2181
    #address: nacos://${nacos.address:127.0.0.1}:8848 # 也可以缓存nacos配置

  • 服务端配置: @DubboService
@DubboService
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}
  • 启动类配置:@EnableDubbo
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

3. 公共实体类的序列化

在公共模块中记得将实体类进行序列化,因为网络传输会进行序列化和反序列化

public class ABS implements Serializable {
    private static final long serialVersionUID = 3193869407076435938L;
}

4. 地址缓存

Dubbo的地址缓存(Address Cache)是用于缓存服务提供者的网络地址的机制,旨在提高服务调用的性能和稳定性。地址缓存由服务消费者端维护,在调用远程服务时,Dubbo会从缓存中选择一个地址进行调用,而不是每次都从注册中心重新获取地址列表。

Dubbo的地址缓存更新策略包括两种:

  1. 定时更新:Dubbo会定期(周期性地)从注册中心获取服务提供者的地址列表,并更新到地址缓存中。这样做可以保证地址缓存中的地址与注册中心中的地址保持同步,确保服务调用的准确性和稳定性。定时更新的频率可以通过Dubbo的配置进行调整。
  2. 事件驱动更新:Dubbo还支持通过注册中心的事件通知机制来实现地址缓存的更新。当注册中心中的服务提供者地址发生变化时,注册中心会向Dubbo发送事件通知,Dubbo会接收并处理这些事件通知,从而及时更新地址缓存中的地址。这样做可以减少不必要的定时更新操作,提高系统的性能和效率。

Dubbo默认情况下会采用定时更新的方式来更新地址缓存,但也支持事件驱动的方式。开发者可以根据实际情况选择合适的更新策略,以满足应用场景的需求。Dubbo提供了灵活的配置选项,允许开发者自定义地址缓存的更新策略和更新频率,以便更好地适应不同的应用场景。

5. 超时与重试

Dubbo中的超时和重试问题可能由多种原因造成,常见的包括网络延迟、服务提供者负载过高、服务调用失败等。

例如:服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。

超时问题:

dubbo 利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。

  • 可以通过配置 timeout 参数来设置服务调用的超时时间。
  • 建议在服务端注解上设置:如下:设置3000ms自动超时断开
@DubboService(timeout = 3000, retries = 2) // 超时时间,和重试次数
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "娃哈哈";
    }
}

重试机制:

重试问题通常是由于服务调用失败或者服务提供者不可用导致的。Dubbo提供了重试机制,可以在服务调用失败时自动进行重试。

  • 可以通过配置 retries 参数来设置重试次数。

  • 建议在服务端注解上设置:如下:设置服务调用失败时自动重试2次

@DubboService(timeout = 3000, retries = 2) // 超时时间,和重试次数
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "娃哈哈";
    }
}

6. 多版本控制

Dubbo的多版本控制功能允许服务消费者在调用远程服务时指定所需的服务版本,以便灵活地管理服务的升级和兼容性。

下面介绍一些使用场景和实现方式:

  1. 平滑升级:当服务提供者发布新版本时,可以通过多版本控制实现平滑升级,避免影响到已有的服务消费者。
  2. A/B测试:在进行新功能的试验或测试时,可以将部分流量引流到新版本的服务上,通过多版本控制实现A/B测试。
  3. 兼容旧版本:为了保持与老版本的兼容性,可以在新版本发布时通过多版本控制指定特定的服务版本。
  4. 灰度发布:在新版本发布前,先将少量流量引流到新版本服务上进行测试和验证,然后逐步扩大范围,通过多版本控制实现灰度发布。

dubbo 中使用version 属性来设置和调用同一个接口的不同版本:

如下:

服务端

  • DemoServiceImpl
@DubboService(version = "v1.0", timeout = 3000, retries = 0) //  超时时间,和重试次数
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "娃哈哈";
    }
}
  • DemoServiceImpl2
@DubboService(version = "v2.0", timeout = 3000, retries = 0) //  超时时间,和重试次数
public class DemoServiceImpl2 implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "娃哈哈";
    }
}

消费端(调用端):

  • 这里使用version 指定 v2.0版本。
@Component
public class Task implements CommandLineRunner {

    @DubboReference(version = "v2.0") // 配置版本控制,对应调用不同版本的服务,达到灰度发布的效果
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result);
    }
}

7. 负载均衡

说到负载均衡,就表明有多个服务的提供者

Dubbo可以在每个服务提供者上配置权重,使用weight参数实现,如下:

  • 这里配置100的权重
@DubboService(weight = 100, version = "v1.0", timeout = 3000, retries = 0) // 设置版本控制, 超时时间,和重试次数
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "娃哈哈";
    }
}

图示:
在这里插入图片描述

Dubbo提供了多种负载均衡策略:

负载均衡策略:

  1. 随机负载均衡(Random Load Balance)
    • 使用场景:适用于服务提供者数量较多、服务实例性能相近的场景。随机负载均衡策略可以均匀地分配请求到各个服务提供者上,从而实现负载均衡。
  2. 轮询负载均衡(Round Robin Load Balance)
    • 使用场景:适用于服务提供者数量较多、服务实例性能相近的场景。轮询负载均衡策略按照固定顺序依次选择服务提供者,将请求依次分配给每个服务提供者,从而实现负载均衡。
  3. 加权轮询负载均衡(Weighted Round Robin Load Balance)
    • 使用场景:适用于服务提供者数量较多、服务实例性能不均匀的场景。加权轮询负载均衡策略根据服务提供者的权重值来动态调整分配请求的比例,将更多的请求分配给性能更好的服务提供者。
  4. 一致性哈希负载均衡(Consistent Hash Load Balance)
    • 使用场景:适用于需要保持请求与服务提供者之间的一致性映射关系的场景,如分布式缓存等。一致性哈希负载均衡策略通过哈希算法将请求分配给服务提供者,保持了请求与服务提供者之间的一致性映射关系。

如下案例:调用端配置

@Component
public class Task implements CommandLineRunner {

    // 配置负载均衡(4种策略):
    // - Random: 表示随机访问,默认
    // - RoundRobin: 表示按权重轮询访问
    // - LeastActive: 表示最小活跃调用
    // - ConsistentHash: 表示一致性Hash,相同参数的请求总是发到同一提供者
  	@DubboReference(loadbalance = "random")
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result);
    }
}

8. 集群容错

Dubbo的集群容错指的是在分布式系统中,当服务调用失败或者服务提供者出现故障时,Dubbo能够采取一定的容错机制来保证系统的可用性和稳定性。

Dubbo提供了多种集群容错解决方案,以应对不同的故障情况,以下是常见的集群容错解决方案:

  1. 失败自动切换(Failover)
    • 当服务调用失败时,Dubbo会自动切换到其他可用的服务提供者进行重试。这种策略适用于需要保证服务调用的可用性,对于服务调用失败时能够自动切换到其他可用服务提供者的情况。
  2. 失败快速(Failfast)
    • 当服务调用失败时,Dubbo会立即返回失败结果,不进行重试。这种策略适用于对于服务调用的实时性要求较高,对于失败情况不进行重试,快速返回失败结果。
  3. 失败安全(Failsafe)
    • 当服务调用失败时,Dubbo会忽略失败的调用结果,直接返回空结果。这种策略适用于对于服务调用的结果不敏感,可以容忍部分调用失败的情况。
  4. 失败忽略(Failover)
    • 当服务调用失败时,Dubbo会忽略失败的调用结果,继续进行后续调用。这种策略适用于对于部分调用失败的情况不做处理,继续进行后续调用。
  5. 失败重试(Failback)
    • 当服务调用失败时,Dubbo会记录失败的调用结果,并在服务提供者恢复之后进行重试。这种策略适用于服务提供者出现故障时,等待服务提供者恢复后进行重试。

Dubbo默认采用的集群容错解决方案是失败自动切换(Failover),即在服务调用失败时会自动切换到其他可用的服务提供者进行重试。开发者可以根据实际情况选择合适的集群容错解决方案,以确保系统的可用性和稳定性。Dubbo提供了灵活的配置选项,允许开发者根据需求自定义集群容错策略。

如下案例:

@Component
public class Task implements CommandLineRunner {

    // 容错机制
    // - Failover Cluster: 默认,失败自动切换,当出现失败,重试其它服务器,通常用于读操作,但重试会带来更长延迟。可通过retries="2"来设置重试次数(不含第一次)。
    // - Failfast Cluster: 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
    // - Failsafe Cluster: 失败安全,出现异常时,直接忽略,返回一个空结果。通常用于写入审计日志等操作。
    // - Failback Cluster: 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
    // - Forking Cluster: 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks="2"来设置最大并行数。
    // - Broadcast Cluster: 广播调用所有提供者,逐个调用,任意一台报错则报错。(1.0.12版本开始支持)
    @DubboReference(cluster =  "failover")
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result); 
    }
}

9. 服务降级

Dubbo的服务降级指的是在服务调用失败或者服务提供者出现故障时,为了保证系统的稳定性和可用性,通过一定的手段来保障核心功能的正常运行。

以下是常见的服务降级解决方案:

  1. 返回默认值
    • 当服务调用失败时,返回一个默认值或者空值作为结果,保证服务调用的正常返回。这种解决方案适用于对于服务调用的结果不敏感,可以容忍部分调用失败的情况。
  2. 返回缓存数据
    • 当服务调用失败时,返回缓存中的数据作为结果,避免因服务调用失败而导致整个系统的不可用。这种解决方案适用于对于服务调用的实时性要求不高,可以容忍部分数据的延迟和不一致性。
  3. 返回降级页面
    • 当服务调用失败时,返回一个友好的降级页面,提示用户服务暂时不可用,引导用户使用其他功能或者稍后重试。这种解决方案适用于对于服务调用的实时性要求较低,可以通过降级页面来保护核心功能的正常运行。
  4. 返回错误码
    • 当服务调用失败时,返回一个错误码或者错误信息作为结果,告知调用方服务调用失败的原因,让调用方根据错误码来进行处理。这种解决方案适用于需要明确告知调用方服务调用失败原因的情况。

Dubbo并未提供原生的服务降级解决方案,但可以通过结合其他组件或者自定义代码来实现服务降级功能。例如,可以结合Hystrix等熔断器来实现服务降级,或者在服务消费者端自定义代码来处理服务调用失败时的降级逻辑。总的来说,服务降级是分布式系统中保证系统稳定性和可用性的重要手段,需要根据实际情况选择合适的解决方案来应对服务调用失败的情况。

如下案例:

@Component
public class Task implements CommandLineRunner {

    // 服务降级:
    // -  fore:return null: 表示对该服务的方法调用都直接返回null值,不发起远程调用。通常用于测试时对某些服务进行禁用。
    // -  fail:return exception: 表示对该服务方法调用失败后抛出MockException异常。
		@DubboReference(mock = "fore:return null")
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/533147.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

考研数学|武忠祥各阶段用书搭配及分享

看到有人问武忠祥老师,不请自来 武忠祥老师,绝对的宝藏老师,我在考研强化阶段的时候听过他的强化课程,听完之后,很多问题都想通了,所以,如果有人想问武忠祥老师行不行,那我就一个字…

基于FPGA的以太网相关文章导航

首先需要了解以太网的一些接口协议标准,常见的MII、GMII、RGMII时序,便于后续开发。 【必读】从MII到RGMII,一文了解以太网PHY芯片不同传输接口信号时序! 介绍一款比较老的以太网PHY芯片88E1518,具有RGMII接口&#xf…

代码学习记录40---动态规划

随想录日记part40 t i m e : time: time: 2024.04.10 主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及: 买卖股票的最佳时机加强版。 123.买卖股票的最佳时机III 188.买卖股票的最佳时机…

李廉洋:4.11黄金原油早盘#行情走势#分析及策略。

美国通胀数据超出预期,抑制了对美联储降息的押注。Coex Partners有限公司宏观经济学家Henrik Gullberg表示:“对新兴市场和风险资产来说,(通胀)高企持续时间更长是个坏消息,还因为它增加了美国和全球经济更明显下滑的风险。CPI数据…

代码随想录--数组--二分查找

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 举一个字符数组的例子,如图所示: 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的。 正是因为数…

lv逻辑卷(虚拟磁盘)及配额实操

、LVM 1.LVM概念 LVM逻辑卷管理(Logical Volume Manager):LVM 适合于管理大存储设备,并允许用户动态调整磁盘容量大小,提高磁盘管理的灵活性。LVM的快照功能可以帮助我们快速备份数据。 2.LVM对比磁盘分区的优点 1…

IP查询在追踪网络攻击源头中的应用

随着网络攻击事件的不断增加,追踪攻击源头成为网络安全领域的重要任务之一。IP查询技术通过分析网络流量中的IP地址,可以帮助确定攻击的来源。本文将探讨IP查询在追踪网络攻击源头中的应用,包括其原理、方法以及实际案例分析。 IP地址查询&a…

git学习 1

打开自己想要存放git仓库的文件夹,右键打开git bush,用git init命令建立仓库 用 ls -a(表示全都要看,包括隐藏的)可以看到git仓库 也可以用 git clone 接github链接(点code选项里面会给链接,结尾是git的那个&#xf…

LeetCode - 1702. 修改后的最大二进制字符串

文章目录 解析AC CODE 题目链接:LeetCode - 1702. 修改后的最大二进制字符串 解析 详细题解:贪心,简洁写法(Python/Java/C/Go/JS/Rust) 思路很牛b。 简单来说我们需要想办法将0配对,将其变为10&#xff0…

AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南,每天我们为你呈现AI领域的热点内容,聚焦开发者,助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解:AIbase - 智能匹配最适合您的AI产品和网站 &#x1f4f…

机器人路径规划:基于Q-learning算法的移动机器人路径规划(可以更改地图,起点,终点),MATLAB代码

一、Q-learning算法 Q-learning算法是强化学习算法中的一种,该算法主要包含:Agent、状态、动作、环境、回报和惩罚。Q-learning算法通过机器人与环境不断地交换信息,来实现自我学习。Q-learning算法中的Q表是机器人与环境交互后的结果&#…

Redis中的集群(五)

集群 在集群中执行命令 MOVED错误。 当节点发现键所在的槽并非由自己负责处理的时候&#xff0c;节点就会向客户端返回一个MOVED错误&#xff0c;指引客户端转向至正在负责槽的节点&#xff0c;MOVED错误的格式为: MOVED <slot> <ip>:<port>其中slot为键…

EEG Conformer:Convolutional Transformer for EEG Decoding and Visualization

原文链接&#xff1a;EEG Conformer 代码链接&#xff1a;EEG Conformer 背景 当前已经开发了各种模式识别方法来解码来自嘈杂的脑电图信号的有用信息。这些方法提取特征并针对不同的任务执行分类。例如&#xff1a;通用空间模式 &#xff08;CSP&#xff09; 用于增强运动图…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day10

Day 10 Genaral GUidance training Loss 不够的case Loss on Testing data over fitting 为什么over fitting 留到下下周哦~~ 期待 solve CNN卷积神经网络 Bias-Conplexiy Trade off cross Validation how to split? N-fold Cross Validation mismatch 这节课总体听下来比较…

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

力扣19. 删除链表的倒数第 N 个结点

Problem: 19. 删除链表的倒数第 N 个结点 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建虚拟头节点dummy指向并将其next指向head&#xff1b;指针fast、slow指向dummy&#xff1b; 2.遍历链表获取其长度len&#xff1b; 3.先使fast走n 1步&#xff0c;再…

Mac安装配置ElasticSearch和Kibana 8.13.2

系统环境&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) 一、准备 从Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic上下载ElasticSearch和Kibana 笔者下载的是 elasticsearch-8.13.2-darwin-aarch64.tar.gz kibana-8.13.2-darwin-aarch64.tar.gz 并放置到个人…

图像生成:Pytorch实现一个简单的对抗生成网络模型

图像生成&#xff1a;Pytorch实现一个简单的对抗生成网络模型 前言相关介绍具体步骤准备并读取数据集定义生成器定义判别器定义损失函数定义优化器开始训练完整代码 训练生成的图片 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&…

【网站项目】校园失物招领小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

java数据结构与算法刷题-----LeetCode210. 课程表 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先遍历但不进行逆拓扑排序&#xff08;不用栈&#xff09;…