SpringBoot整合Dubbo的快速使用教程
目录
一、什么是Dubbo?
二、SpringBoot整合Dubbo
1、父工程引入依赖
2、各个Dubbo服务子模块引入依赖
3、服务提供者
(1)启动类添加注解@EnableDubbo
(2)服务类添加注解@DubboService
(3)配置文件配置dubbo的信息
4、服务的消费者
(1)启动类添加注解@EnableDubbo
(2)接口层通过注解@DubboReference将远程服务注入
(3)配置文件配置dubbo的信息
Spring Boot是一款用于简化Java应用程序开发的框架,它提供了快速构建、易于配置和扩展的特性。Dubbo是一个高性能、轻量级的开源RPC框架,它支持多种传输协议和序列化方式,并可以实现服务之间的远程调用。本文将介绍如何使用Spring Boot整合Dubbo,快速搭建一个简单的分布式应用。
一、什么是Dubbo?
Apache Dubbo是一款RPC服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用Dubbo提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。
二、SpringBoot整合Dubbo
1、父工程引入依赖
<!-- 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>
2、各个Dubbo服务子模块引入依赖
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.9</version>
</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>
<version>3.0.9</version>
</dependency>
3、服务提供者
(1)启动类添加注解@EnableDubbo
@EnableDubbo是Dubbo框架中的一个重要注解,主要用于激活Dubbo的自动配置和启动类上,开启Dubbo的支持。
@SpringBootApplication
@EnableDubbo
public class ProviderApp {public static void main(String[] args) {SpringApplication.run(ProviderApp.class, args);System.out.println("Hello World!");}
}
(2)服务类添加注解@DubboService
@DubboService是Dubbo框架中用于服务提供方的一个重要注解。它的主要作用是将服务接口的实现类注册到注册中心,使其能够被服务消费方发现和调用。@DubboService支持设置当前服务的版本号、重试次数、超时时间、负载均衡策略等信息。如下,就是设置了该服务的版本为1.0.0,负载均衡策略为轮询,重试次数为3,服务调用的超时时间为3000毫秒。Dubbo的负载均衡除了内置了轮询策略之外,还内置了如下一些常用的负载均衡策略:
- 加权随机(random)
默认算法,默认权重相同。所以,在权重相同的情况下,会在在服务提供者中随机选择一个来处理请求。该策略的优点是实现简单,能够较好地平均分配请求。缺点是在服务提供者数量较多时,可能无法保证每个提供者分配到的请求量完全均匀。
- 最少活跃优先 + 加权随机(leastactive)
活跃数是指每个服务提供者都有一个“活跃数”,表示当前正在处理的请求数量。当一个请求到达时,活跃数加一,请求处理完毕时,活跃数减一。最少活跃优先便是指在分配新请求时,优先选择活跃数最小的服务提供者。这样,性能较好的服务提供者(处理速度快,活跃数下降快)可以处理更多请求,而性能较差的提供者则自然接收较少请求。而当在选出活跃数最少的提供者后,如果存在多个活跃数相同的提供者,则根据它们的权重进行随机选择。权重越大,被选中的概率就越高。该策略的核心思想其实就是能者多劳的思想。该策略的优点是能够有效避免将请求发送到负载较高或响应较慢的服务提供者上。缺点是需要实时监控每个提供者的活跃请求数,增加了一定的系统开销。
- 最短响应优先 + 加权随机(shortestresponse)
该策略从多个服务提供者中选择出响应时间最短的一个或多个来处理请求。当存在多个响应时间相同的服务提供者时,根据它们的权重进行加权随机选择。该策略的优点是能够灵活地应对服务提供者的性能变化,并优化请求处理速度。缺点是实现较为复杂,需要实时监控服务提供者的响应时间和计算权重。
- 一致性哈希(consistenthash)
根据某个一致性哈希算法,确定请求应该发送到哪个服务提供者。该策略的优点是能够在服务提供者动态变更时,最大限度地减少对已分配请求的影响。缺点是算法较为复杂,实现和维护成本较高。
@DubboService(version = "1.0.0", loadbalance = "roundrobin", retries = 3, timeout = 3000)
public class TestDubboServiceImpl implements TestDubboService {@Overridepublic String sayHello(String name) {return "hello," + name;}@Overridepublic ZhuoYe getZuoYe() {ZhuoYe zuoYe = new ZhuoYe();zuoYe.setName("zhuoye-1").setDescription("帅呆了!!!");return zuoYe;}
}
(3)配置文件配置dubbo的信息
dubbo:
application:
name: dubbo-springboot-demo-provider #当前应用名称
protocol:
name: dubbo #协议名称
port: -1 #配置为-1,则会分配一个没有被占用的端口
registry:
address: zookeeper://192.168.190.129:2181 #注册中心地址,这里选择zookeeper作为注册中心,也是官方推荐的
timeout: 10000 #连接到注册中心的超时时间10S,时间太多可能很容易注册失败,默认5s
更多的配置可以参考官方文档 。
4、服务的消费者
(1)启动类添加注解@EnableDubbo
@SpringBootApplication
@EnableDubbo
public class ProviderApp {public static void main(String[] args) {SpringApplication.run(ProviderApp.class, args);System.out.println("Hello World!");}
}
(2)接口层通过注解@DubboReference将远程服务注入
@DubboReference 是 Dubbo 提供的一个用于引用远程服务的注解,它通常用在服务消费者的实现类中,用于标记一个远程服务的引用。这个注解会将指定的远程服务连接到本地的某个接口上,使得你可以像调用本地接口一样调用远程服务。@DubboReferencee也支持设置当前服务的版本号、重试次数、超时时间、负载均衡策略等信息。而且@DubboReference注解中设置的属性会覆盖 @DubboService注解中的相应属性。也就是说当我们在@DubboReference和@DubboService中都设置了相同的属性,那么@DubboReference中的属性值将优先生效。通过覆盖属性,可以根据不同的场景或需求灵活地调整服务引用的配置。例如,在开发环境中可能需要较短的超时时间以快速检测问题,而在生产环境中可能需要更长的超时时间以确保稳定性。
@RestController
@RequestMapping("dubbo")
public class TestDubboController {@DubboReference(version = "1.0.0",timeout = 1000,loadbalance="leastactive",retries = 2)private TestDubboService testDubboService;@GetMapping("hello")public String hello(String name) {return testDubboService.sayHello(name);}@GetMapping("getZhuoye")public ZhuoYe getZhuoye() {return testDubboService.getZuoYe();}
}
(3)配置文件配置dubbo的信息
dubbo:application:name: dubbo-springboot-demo-comsumerprotocol:name: dubboport: -1registry:address: zookeeper://192.168.190.129:2181timeout: 10000
相关文章:
SpringBoot整合Dubbo的快速使用教程
目录 一、什么是Dubbo? 二、SpringBoot整合Dubbo 1、父工程引入依赖 2、各个Dubbo服务子模块引入依赖 3、服务提供者 (1)启动类添加注解EnableDubbo (2)服务类添加注解DubboService (3)配置文件…...
昇思25天学习打卡营第12天| 基于MindNLP+MusicGen生成自己的个性化音乐
之前都是看图文类的东西,今天体验一点不一样的。来点听力的内容。 mindspore有音乐生成模型MusicGen,MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。在实际执行过程中,采…...
代理设计模式和装饰器设计模式的区别
代理设计模式: 作用:为目标(原始对象)增加功能(额外功能,拓展功能) 三种经典应用场景: 1:给原始对象增加额外功能(spring添加事务,Mybatis通过代理实现缓存功能等等) 2:远程代理(网络通信,输出传输(RPC,D…...
[Microsoft Office]Word设置页码从第二页开始为1
目录 第一步:设置页码格式 第二步:设置“起始页码”为0 第三步:双击页码,出现“页脚”提示 第四步:选中“首页不同” 第一步:设置页码格式 第二步:设置“起始页码”为0 第三步:双…...
【C++】日期类
鼠鼠实现了一个日期类,用来练习印证前几篇博客介绍的内容!! 目录 1.日期类的定义 2.得到某年某月的天数 3.检查日期是否合法 4.(全缺省)构造函数 5.拷贝构造函数 6.析构函数 7.赋值运算符重载 8.>运算符重…...
力扣热100 滑动窗口
这里写目录标题 3. 无重复字符的最长子串438. 找到字符串中所有字母异位词 3. 无重复字符的最长子串 左右指针left和right里面的字符串一直是没有重复的 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 左右指针leftright0ans0#初始化结果tablecolle…...
三万字带你一遍跑通uer
三万字带你一遍跑通uer 参考文档 今天给大家介绍个非常强大的项目uer,集成了许多可以做自然语言的东西,效果的话也非常好,很适合企业级的应用! 1. 先将项目uer从github拉取下来(zip或git都ok) 2. 用pycha…...
Ubuntu24.04LTS基础软件下载
librewolf: deb文件link 作用:访问github,无痕浏览,这个速度,不指望了 vscodium: 从deb安装,ubuntu sudo dpkg -i xxx.debpaste-image 插件替代 markdown wps: libreoffice: 替换USTC源 sudo nano /etc/apt/sourc…...
SQLAlchemy配置连接多个数据库
1.定义配置项 首先定义两个数据库的配置信息 # PostgreSQL database configuration DB_USERNAMEpostgres DB_PASSWORDpassord DB_HOST127.0.0.1 DB_PORT5432 DB_DATABASEtest# mysql database configuration DB_USERNAME_MYSQLroot DB_PASSWORD_MYSQLpassword DB_HOST_MYSQL127…...
NLP+LLM从入门到精通系列
NLPLLM从入门到精通系列 前言:笔者从事于NLPLLM的对话智能机器人的相关行业,现在的大模型的技术日新月异,传统的NLP业务显然是要被淘汰的,那么这也是我着笔写这一系列文章的初衷。本系列将由浅到深,结合实际代码案例&…...
用数组手搓一个小顶堆
堆默认从数组下标为1开始存储。 const int N201000; int heap[N]; int len; 插入操作: 将元素插入到堆的末尾位置向上调整。 void up(int k){while(k>1&&heap[k/2]>heap[k]){swap(heap[k],heap[k/2]);k/2;} } //len为当前存在元素长度 void Inser…...
【Linux开发】基于ALSA库实现音量调节
基于ALSA库实现音量调节 ALSA库实现音量调节1、使用alsamixer工具查看音频接口2、完整代码2.1、snd_mixer_open2.2、snd_mixer_attach、2.3、snd_mixer_selem_register2.4、snd_mixer_load2.5、snd_mixer_first_elem/snd_mixer_elem_next2.6、snd_mixer_selem_get_playback_vol…...
代理IP在未来将面临哪些挑战?
今天我们来聊聊代理IP在未来可能会面临的挑战。虽然代理IP技术目前应用广泛,但随着科技的发展和网络环境的变化,代理IP也将面临一些新的挑战。让我们一起来看看这些挑战是什么吧! 1. 更严格的网络封锁和检测 现代社会各行各业都在飞速发展&…...
FineBI在线学习资源-数据处理
FineBI在线学习资源汇总: 学习资源 视频课程 帮助文档 问答 数据处理学习文档: 相关资料: 故事背景概述-https://help.fanruan.com/finebi6.0/doc-view-1789.html 基础表处理-https://help.fanruan.com/finebi6.0/doc-view-1791.html …...
【代码随想录算法训练营第37期 第四十五天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III】
代码随想录算法训练营第37期 第四十五天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III 一、198.打家劫舍 解题代码C: class Solution { public:int rob(vector<int>& nums) {if (nums.size() 0) return 0;if (nums.size() 1) return num…...
Elasticsearch查询上下文和_source
查询上下文 {"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation"…...
golang实现网卡流量监控
获取当前时刻一分钟前的网卡流量排序 package mainimport ("fmt""github.com/mackerelio/go-osstat/network""log""net/http""sort""strconv""time" )var arr []map[string]int var arr2 []map[string]…...
技术分享:直播平台如何开发并接入美颜SDK
本篇文章,笔者将分享直播平台如何开发并接入美颜SDK的技术细节与步骤。 一、选择合适的美颜SDK 首先,选择一款适合的美颜SDK非常重要。市面上有很多优秀的美颜SDK供应商,选择时应考虑以下因素: 功能丰富性:支持美白…...
左耳听风_114_113_Go编程模式修饰器
你好,我是陈浩,我名多尔多house.之前呢我写过一篇文章叫做python修饰器的函数式编程。 那这种模式呢可以很轻松的把一些函数啊装配到另外一些函数上。 让你的代码呢更加简单,也可以让一些小功能性的代码复用性更高。 让代码中的函数呢可以…...
Java实习手册(小白也看得懂)
秃狼说 距离俺发布的学习路线已经六个月了,那我给小伙伴的学习周期是四五个月左右,我相信大多的小伙伴已经学习的差不多了。正好赶上暑期实习的阶段,在暑期找到实习就成为暑期的头等大事。 实习经验在校招的起到决定性的作用,所…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
