【微服务生态】Dubbo

news2025/1/17 23:16:11

文章目录

  • 一、概述
  • 二、Dubbo环境搭建-docker版
  • 三、Dubbo配置
  • 四、高可用
    • 4.1 zookeeper宕机与dubbo直连
    • 4.2 负载均衡
  • 五、服务限流、服务降级、服务容错
  • 六、Dubbo 对比 OpenFeign

一、概述

Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。对标Spring Cloud 中的 OpenFeign但功能更丰富,含限流、降级、熔断,另外可搭配 Hystrix 使用。一般搭配注册中心 ZooKeeper 使用。Dubbo底层通信使用的是netty。介于目前Dubbo发展及使用情况,本章内容仅蜻蜓点水般介绍Dubbo及使用,并不深入研究,如需深入学习,请参考官网。

官网:http://dubbo.apache.org/

在这里插入图片描述

服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

二、Dubbo环境搭建-docker版

  1. 注册中心 ZooKeeper,docker启动:docker run zookeeper
  2. 编写 dubbo-admin配置文件 application.properties ,后续需使用,本人放在 /root/dockerData/dubbo/dubbo-admin/properties 目录
in.registry.address=zookeeper://192.168.115.129:2181
admin.config-center=zookeeper://192.168.115.129:2181
admin.root.user.name=root
admin.root.user.password=root
admin.check.signSecret=86295dd0c4ef69a1036b0b0c15158d77
  1. 启动 dubbo-admin:docker run -itd --net=host --name dubbo-admin -v /root/dockerData/dubbo/dubbo-admin/properties:/config apache/dubbo-admin 。官网:https://github.com/apache/dubbo-admin
  2. 参考官网搭建 dubbo 示例项目:https://cn.dubbo.apache.org/zh-cn/overview/quickstart/java/spring-boot/ ,动手实践(从零代码开发版)

这里提供一下 dubbo-spring-boot-demo 各工程代码:

父工程pom文件关键部分

<properties>
    <dubbo.version>3.2.0-beta.4</dubbo.version>
    <spring-boot.version>2.7.8</spring-boot.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
    <dependencies>
        <!-- Spring Boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-bom</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

dubbo-spring-boot-demo-interface

public interface DemoService {
	String sayHello(String name);
}

dubbo-spring-boot-demo-provider

pom文件关键部分

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-demo-interface</artifactId>
        <version>${project.parent.version}</version>
    </dependency>
    <!-- dubbo -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-reload4j</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- spring boot starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

业务类

@DubboService
public class DemoServiceImpl implements DemoService {
	@Override
	public String sayHello(String name) {
		return "Hello " + name;
	}
}

主启动类

@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
	public static void main(String[] args) {
		SpringApplication.run(ProviderApplication.class, args);
	}
}

配置文件:

dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://${zookeeper.address:192.168.115.129}:2181

dubbo-spring-boot-demo-consumer

pom文件关键部分:同 dubbo-spring-boot-demo-provider

主启动类

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConsumerApplication.class, args);
	}
}

配置文件

dubbo:
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://${zookeeper.address:192.168.115.129}:2181

业务类

@Component
public class Task implements CommandLineRunner {
	@DubboReference
	private DemoService demoService;
	@Override
	public void run(String... args) throws Exception {
		String result = demoService.sayHello("world");
		System.out.println("Receive result ======> " + result);
		new Thread(()-> {
			while (true) {
				try {
					Thread.sleep(1000);
					System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
				} catch (InterruptedException e) {
					e.printStackTrace();
					Thread.currentThread().interrupt();
				}
			}
		}).start();
	}
}

三、Dubbo配置

可参考配置手册:https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/properties/

这里仅提供部分常用配置:

  1. 重试次数:用于幂等接口(查询、修改、删除,重复调用不影响的接口),不能用于非幂等接口(新增)
  2. 超时时间:由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。为避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间

上面设置分别可通过 @DubboReference 注解的 retriestimeout 属性进行设置,如果需要进行全局配置,可参考配置手册

四、高可用

4.1 zookeeper宕机与dubbo直连

现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务

原因:

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

dubbo直连:通过 @DubboReferenceurl 属性可以设置直接调用服务接口的访问url,无需通过注册中心访问服务

4.2 负载均衡

可通过 @DubboReferenceloadbalance 属性设置负载均衡策略,可选值

  • random:随机,默认
  • roundrobin:轮询;
  • leastactive:最少活跃调用;
  • consistenthash:哈希一致 (2.1.0以上版本);
  • shortestresponse:最短响应 (2.7.7以上版本);

多个注解的 stub 属性:缺省代理类,设为true,表示使用缺省代理类名,即:接口名 + Stub后缀,服务接口客户端本地代理类名,用于在客户端执行本地逻辑,如本地缓存等,该本地代理类的构造函数必须允许传入远程代理对象,构造函数如:public XxxServiceStub(XxxService xxxService)

五、服务限流、服务降级、服务容错

@DubboReferencemock 属性设置,当 mock="return null" 时,即当服务提供者出现异常(宕机或者业务异常),则返回null给服务消费者

另外 @DubboReference 中提供了一些限流,集群容错的配置,可直接看下面官网,这里不再详述

https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/properties/#reference

另外,Dubbo 还可结合其他如 Hystrix 框架,进行服务服务治理。

六、Dubbo 对比 OpenFeign

  • 通信协议:Dubbo使用自定义的RPC协议进行通信,而Feign使用HTTP协议进行通信

    Dubbo提供了更多的协议支持,包括Dubbo协议、HTTP协议、Hessian协议、Thrift协议等,而OpenFeign仅支持HTTP协议

  • 服务调用方式:Dubbo采用的是服务间直接的点对点调用方式,而Feign则是通过服务提供方的统一API网关进行服务调用

  • 服务治理:Dubbo提供了更多的负载均衡策略、容错策略和注册中心支持,而OpenFeign则需要依赖于其他组件来实现这些功能

  • 同步/异步调用:Dubbo支持同步和异步调用,而Feign主要支持同步调用

  • Dubbo的性能更高,但使用起来相对复杂,需要进行一定的配置和学习,而OpenFeign则更加简单易用

总的来说,Dubbo适用于复杂的分布式系统,提供了更多的功能和灵活性,但使用和配置相对较为复杂。而Feign更适合轻量级的微服务架构,使用简单且易于上手。选择使用哪种框架需要考虑具体的项目需求和实际情况。

Spring Cloud Alibaba 2022版本取消了对 Dubbo 的集成,这是因为 Spring Cloud Alibaba 团队认为 Dubbo 和 Spring Cloud 的设计理念有所不同,无法完全融合。同时,Dubbo 作为一个独立的 RPC 框架,已经有了很成熟的技术和社区,可以独立地和 Spring Cloud 集成使用。因此,取消了对 Dubbo 的集成,也可以让 Spring Cloud Alibaba 团队更加专注于自己的设计和实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…

2024年5月软考考试时间及考试安排

2024年5月软考考试时间&#xff1a;为5月25日到28日 考试采取科目连考、分批次考试的方式,连考的第一个科目作答结束交卷完成后自动进入第二个科目&#xff0c;第一个科目节余的时长可为第二个科目使用。 高级资格&#xff1a;综合知识科目考试时长150分钟&#xff0c;最短作…

代码随想录第41天|● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

文章目录 背包问题背包题目解法一 ● 01背包问题-二维数组五部曲1.确定dp数组2、确定递推公式3、初始化dp数组4、循环代码&#xff1a; 解法二-01背包问题-滚动数组五部曲1&#xff1a;定义dp二、递推公式三、初始化四、循环顺序代码&#xff1a; 698. 划分为k个相等的子集题解…

Mysql5.7主从复制搭建

注意不适用Mysql8 Docker搭建Mysql主从复制 docker run -p 3307:3306 --name mysql-master \ -v /usr/local/develop/mysql-master/log:/var/log/mysql \ -v /usr/local/develop/mysql-master/data:/var/lib/mysql \ -v /usr/local/develop/mysql-master/conf:/etc/mysql/con…

开源工具和框架

目录 开源工具和框架 一、 开源工具和框架 二、开源工具和框架在现代软件开发中的角色 1、基础设施建设&#xff1a; 2、开发效率提升&#xff1a; 3、代码质量保障&#xff1a; 4、技术创新&#xff1a; 三、广泛使用的开源项目分析 3.1、Linux 3.2、Git 3.3、Docke…

高等数学(无穷小与无穷大)

目录 一、无穷小 二、无穷大 三、无穷小与无穷大的关系 四、无穷小量的阶的比较 一、无穷小 二、无穷大 三、无穷小与无穷大的关系 四、无穷小量的阶的比较

女生常用的社交app软件有哪些?分享女生用的最多的社交软件

随着科技的迅猛发展&#xff0c;社交软件也日益多样化。除了常见的社交平台&#xff0c;一些全新的社交软件如雨后春笋般涌现&#xff0c;为用户带来了更多元、更有趣的社交体验。这里为大家介绍 5 款女生用的最多的社交软件&#xff0c;它们分别是丛丛、青藤之恋、meetu、小奢…

12. Springboot集成Dubbo3(三)Dubbo-Admin

目录 1、前言 2、安装 2.1、下载Dubbo-admin 2.2、修改配置 2.3、编译前端 2.4、访问 2.5、加载自己的服务 2.6、服务测试 2.7、其他 3、小结 1、前言 Dubbo Admin是用于管理Dubbo服务的基于Web的管理工具。Dubbo Admin提供了一个用户友好的界面&#xff0c;用于在分…

进程 2月24日学习笔记

1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&#xff09; PID:唯一识…

番外篇 | YOLOv5+DeepSort实现行人目标跟踪检测

前言:Hello大家好,我是小哥谈。DeepSort是一种用于目标跟踪的深度学习算法。它结合了目标检测和目标跟踪的技术,能够在视频中准确地跟踪多个目标,并为每个目标分配一个唯一的ID。DeepSort的核心思想是将目标检测和目标跟踪两个任务进行联合训练,以提高跟踪的准确性和稳定性…

(详细使用指南)Linux下交叉编译带ffmpeg的opencv并移植到RK3588等ARM端

一 问题背景 瑞芯微RK3588等嵌入式板作为边缘端设备为算法模型的部署提供了便利&#xff0c;目前很多分类或好检测模型针对边缘端做了优化或量化&#xff0c;使得在边缘端也能达到实时稳定的识别和检测效果。 但嵌入式设备普遍的flash emmc不大&#xff0c;一般在32G左…

【Flink精讲】Flink任务调度机制

Graph 的概念 Flink 中的执行图可以分成四层&#xff1a; StreamGraph -> JobGraph -> ExecutionGraph -> 物理执 行图。 StreamGraph&#xff1a;是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。JobGraph&#xff1a; StreamGraph …

科学高效备考2024年AMC10:2000-2023年1250道AMC10真题练一练

我整理了2000-2023年的全部AMC10的AB卷真题共1250题&#xff0c;并且独家制作了多种在线练习&#xff0c;利用碎片化时间&#xff0c;一年足以通过自学在2024年AMC10竞赛中取得好成绩。 我们今天继续来随机看五道题目和解析。 2000-2023年AMC10真题练一练&#xff1a;2013年第…

项目打包提示一堆 ts 类型错误问题解决

问题 vue3 ts 项目在打包的过程中报了一大堆 ts 类型错误提示&#xff0c;如下图所示&#xff1a; 报错&#xff1a;Could not find a declaration file for module … implicitly has an ‘any’ type. 解决方法 查看 package.json 文件&#xff0c;可以看到&#xff0c;默…

UE蓝图 序列(Sequence)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 UE蓝图 函数调用(CallFunction)…

three.js第一个3D案例

在正式学习Three.js之前&#xff0c;先做一些必要的准备工作&#xff0c;具体说就是下载threejs官方文件包&#xff0c;threejs官方文件包提供了很多有用的学习资源。 threejs官方文件包所有版本&#xff1a;https://github.com/mrdoob/three.js/releases threejs文件资源目录…

Go 利用上下文进行并发计算

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在Go编程中&#xff0c;上下文&#xff08;context&#xff09;是一个非常重要的概念&#xff0c;它包含了与请求相关的信息&…

【嵌入式移植】7、U-Boot源码分析4—链接脚本分析

U-Boot源码分析4—链接脚本分析 1 u-boot-spl.lds1.1 链接脚本的生成1.2 u-boot-spl.lds内容分析1.3 text - 程序代码段1.4 sram其它段定义1.4.1 .rodata只读数据段1.4.2 .data数据段1.4.3 .u_boot_list段 1.5 BSS段1.6 /DISCARD/ 从上一篇文章【嵌入式移植】6、U-Boot源码分析…

130 如何通过vs2017开发linux c++程序

使用VS2017开发linux下的应用程序&#xff08;C/C&#xff09;_vc_linux.exe vs2017-CSDN博客 参考上面这哥们的&#xff0c;写的很详细 前言 本文章记录如何使用VS2017进行linux应用程序的开发&#xff08;针对新手小白&#xff09;&#xff0c;VS2017能较为方便的通过SSH编辑…

电脑蓝牙在哪里打开?1分钟轻松打开蓝牙!

“我在操作电脑的时候想将电脑的蓝牙打开来连接音响和键盘&#xff0c;但是不知道电脑蓝牙应该如何打开&#xff0c;有什么比较简单的方法吗&#xff1f;” 随着无线技术的日益发展&#xff0c;蓝牙已成为连接各种设备的重要桥梁。无论是传输文件、音频还是与外部设备进行通信&…