11. Springboot集成Dubbo3(二)示例demo

目录

1、前言

2、注册中心

3、快速开始

3.1、添加dubbo3依赖

3.2、dubbo3-api

​编辑

3.3、dubbo3-server

3.3.1、添加依赖

3.3.2、实现IUserService

3.3.3、添加配置文件application.properties

3.3.4、修改Application启动类

3.3.5、出错解决

3.4、dubbo3-portal

3.4.1、添加依赖

3.4.2、定义Controller

3.4.3、添加配置文件application.properties

3.4.4、修改启动类

3.4.5、启动成功,访问测试

4、小结


1、前言

Dubbo3从Dubbo2演进过来之后,已经从单纯的RPC框架改进成为了一个微服务框架,具备RPC框架能力的同时,还兼备服务治理能力。今天简单介绍下Dubbo3和Springboot的集成过程。

2、注册中心

官方仍然推荐zookeeper作为注册中心。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

先下载Zookeeper:Apache ZooKeeper

下载最新版本后解压。

接着,打开conf文件夹,把zoo_sample.cfg文件复制一份为zoo.cfg。以为zookeeper默认会读取zoo.cfg,zookeeper刚解压出来的版本仅仅提供了一个最简配置文件zoo_sample.cfg,需要我们自行修订。我们不做任何修订,直接复制一份出来。

我们可以观察一下zoo.cfg中的一些简单配置,我们删除一下注释内容,只剩下以下配置:

# 时间配置最小但域,其他时间配置以整数倍tickTime计算
tickTime=2000
#Leader允许Follower启动时在initLimit时间内完成数据同步,单位:tickTime
initLimit=10
# Leader发送心跳包给集群中所有Follower,若Follower在syncLimit时间内没有响应,那么Leader就认为该follower已经挂掉了,单位:tickTime
syncLimit=5
# 配置zookeeper的数据目录
dataDir=/tmp/zookeeper
# 用于接收客户端请求的端口
clientPort=2181

最后,我们直接双击binzkServer.cmd,看下以下内容,就说明启动成功了。

3、快速开始

简单示例场景:项目分Server服务层和Portal消费层。Portal调用Server提供的sayHello方法,输出相应内容,使用dubbo3进行Portal和Server的RPC通信。

3.1、添加dubbo3依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.10</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>3.2.10</version><type>pom</type></dependency>
</dependencies>

3.2、dubbo3-api

这一层我们定义一个公用的接口类和实体类。我们定义了IUserService。

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

3.3、dubbo3-server

3.3.1、添加依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.10</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>3.2.10</version><type>pom</type></dependency><dependency><groupId>com.example</groupId><artifactId>dubbo3-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>

3.3.2、实现IUserService

定义service实现类,实现IUserService接口。这里的Service需要加上@DubboService,声明自己托管给dubbo进行管理。

import com.example.dubbo3api.service.IUserService;
import org.apache.dubbo.config.annotation.DubboService;@DubboService
public class UserServiceImpl implements IUserService {@Overridepublic String sayHello(String name){return name + "say hello, my bro.";}
}

3.3.3、添加配置文件application.properties

server.port=7010# 该服务注册到dubbo中暴露的协议端口
dubbo.protocol.port=20080
# 该服务注册到dubbo中暴露的协议
dubbo.protocol.name=dubbo
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.application.name=dubbo3-server

3.3.4、修改Application启动类

启动类需要加上EnableDubbo注解,表示开启dubbo。

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

接着就可以直接启动server层了。直接启动,发现一直卡在连接zookeeper上,过了一会直接报错了。

3.3.5、出错解决

由于我使用的是JDK17,当Zookeeper对象实例化时,会调用InetSocketAddress的toString方法;而在jdk17中,该方法解析空字符串会拼装/。所以要么降回去使用JDK8,要么修改这个问题。降是不可能降的,一辈子都不可能降的。所以我们开始升级zookeeper版本,由于自带的zookeeper版本为3.4.14,太低了,我们排除后,升级zookeeper版本,问题即可解决。

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>3.2.10</version><type>pom</type><exclusions><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.9.1</version>
</dependency>

继续启动,看到如下输出,启动成功。

3.4、dubbo3-portal

3.4.1、添加依赖

同样需要排除zookeeper版本,自己引入高版本的zookeeper。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.10</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>3.2.10</version><type>pom</type><exclusions><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.9.1</version></dependency><dependency><groupId>com.example</groupId><artifactId>dubbo3-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
</dependencies>

3.4.2、定义Controller

定义controller,调用userService的sayHello()。引用IUserService时,需要使用@DubboReference注入。

@RestController
public class UserController {@DubboReferenceprivate IUserService userService;@GetMapping("sayHello/{name}")public String sayHello(@PathVariable String name){return userService.sayHello(name);}}

3.4.3、添加配置文件application.properties

server.port=8010# 连接注册中心,需要与dubbo3-server的注册中心一致
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.application.name=dubbo3-portal

3.4.4、修改启动类

启动类需要加上EnableDubbo注解,表示开启dubbo。

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

3.4.5、启动成功,访问测试

4、小结

Dubbo3与Springboot的简单集成几步就可以了,集成还是相当容易的。目前为止Dubbo3和Dubbo2在集成上发现还是有一些区别的。如:

  1. Server注册到Zookeeper中,Dubbo2的注解为@Service,Dubbo3使用@DubboService。而@Service已经被标注为删除。相比Dubbo2来讲更加有辨识度,相信不少因为@Service用成了Spring的注解,而导致service一致注册失败问题而抓狂的朋友吧。
  2. Portal注入Service时,Dubbo2注解为@Reference,Dubbo3使用@DubboReference,命名上更加有辨识度。
  3. 配置上,同样Dubbo2和Dubbo3提供了XML配置方式和注解方式,但是Dubbo3相比Dubbo2,配置起来更加简单
  4. 依赖不同,Dubbo3特地提供了Springboot集成模块依赖,而不是独立的apache依赖。

简单使用下来发现目前有这几点不同,其他的功能还有待继续深入研究。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【零基础学习CAPL】——CAN报文的发送(面板中直接修改信号值进行发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.系统变量与Panel值绑定4.CAPL实现5.效果6.全量脚本1.概述 在前面文章”【零基础学习CAPL】——CAN报文的发送(按下按钮同时周期性发送)“中对于发送报文中的信号是在脚本中固…

Nodejs 第三十八章(mysql2)

在之前的篇章中&#xff0c;已经补充完成mysql的基本知识&#xff0c;那么现在开始&#xff0c;我们需要把mysql和express,nodejs连接起来。 安装依赖 npm install mysql2 express js-yamlmysql2 用来连接mysql和编写sq语句express 用来提供接口 增删改差js-yaml 用来编写配置…

PyCharm 取消所有断点

PyCharm 取消所有断点 1. Run -> View Breakpoints...2. Python Line Breakpoint3. Remove - DoneReferences 1. Run -> View Breakpoints… 2. Python Line Breakpoint ​​​ 3. Remove - Done References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【day01】每天三道 java后端面试题:JDK、JRE和JVM | 字节码 | ACID

文章目录 1. JDK, JRE, JVM分别是什么&#xff1f;有什么区别&#xff1f;2. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f;3. 什么是数据库事务&#xff1f;讲一下事务的ACID特性。 1. JDK, JRE, JVM分别是什么&#xff1f;有什么区别&#xff1f; 答题思路…

linux安装mysql8且初始化表名忽略大小写

mysql8下载地址 MySQL8.0安装步骤 1、把安装包上传到linux系统&#xff0c;解压、重命名并移动到/usr/local/目录&#xff1a; cd ~ tar -xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.32-linux-glibc2.12-x86_64/ mysql80/ mv mysql80/ /usr/local/2、在M…

C/C++内存管理详解

目录 一、C内存分布 二、C语言与C内存管理方式 1、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 2、C中的内存管理方式&#xff1a;new/delete 三、operator new与operator delete函数 1、函数概念&#xff1a; 2、函数使用&#xff1a; 3、底层原理…

【plt.pie绘制饼图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.pie绘制饼图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib可视化】&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f3a8; 一、饼图初探&#xff1a;基本概念与用途&#x1f4a…

anomalib1.0学习纪实-续1:增加新算法

0、基本信息 现在我要增加一个新算法&#xff1a;DDAD 他的代码&#xff0c;可以在github中找到&#xff1a;GitHub - arimousa/DDAD 一、基础操作&#xff1a; 1、修改anomalib\src\anomalib\models\__init__.py 我增加的第33行和61行&#xff0c; 2、 增加ddad文件夹和文…

趣学贝叶斯统计:概率密度分布(probability density function)

目录 1. 分布:PDF与PMFPDFPMF 2. 将概率密度函数应用于我们的问题用积分量化连续分布积分度量变化率&#xff1a;导数 3. R语言实践4. 小结 1. 分布:PDF与PMF PDF PDF定义在连续值上。在连续型随机变量的情况下&#xff0c;具体取某个数值的概率是0&#xff0c;因此PDF并不直…

idea将springboot打包成jar包

打开idea->view->Tool Windows->Terminal 在控制台输入&#xff1a; mvn clean package

HarmonyOS 通过getInspectorByKey获取指定元素高宽等属性

例如 这里 我们有这样一个组件 Entry Component struct Dom {build() {Column() {Row() {Circle({ width: 200, height: 200 }).fill(#20101010)}.id(ES)}.width(100%).height(100%)} }这里 我们就写了个很基本的组件结构 然后 我们写了个 Circle 组件 定义了宽高 然后 如果我…

设计模式七大原则

七大原则有&#xff1a; 单一原则原则接口隔离原则依赖倒转原则里氏替换原则开闭原则迪米特法则合成复用原则 1 单一职责原则 1.1 基本介绍 ​ 对类来说的&#xff0c;即一个类应该只负责一项职责。 如类A负责两个不同的职责&#xff1a;职责1&#xff0c;职责2。当职责1需…

MATLAB实现朴素贝叶斯分类

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一种基于贝叶斯定理的分类算法&#xff0c;它假设特征之间相互独立&#xff0c;从而简化了计算复杂性。该算法常用于文本分类、垃圾邮件过滤、情感分析等应用场景。 MATLAB实现鸢尾花数据集分类代码如下&#xff1a; clear lo…

【C语言】通讯录(静态版本+动态版本)思路解析+完整源代码

通讯录 由于代码比较长&#xff0c;为了增加可读性&#xff0c;分成了contact.h&#xff0c;contact.c&#xff0c;test.c&#xff0c;分别用来声明函数或者类型&#xff0c;实现函数功能&#xff0c;测试代码 contact.h 我们希望通讯录具有增加联系人&#xff0c;删除联系人…

Eclipse 创建 Hello World 工程

Eclipse 创建 Hello World 工程 1. Hello WorldReferences Download and install the Eclipse IDE. 1. Hello World Eclipse -> double click -> Launch 单击蓝色方框 (右上角) 最大化 IDE File -> New -> C Project -> Finish Project name&#xff1a;工程名…

【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

Redis篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、缓存雪崩**二、缓存穿透三、缓存预热四、缓存更新五、缓存降级 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女…

【Jvm】性能调优(拓展)Jprofiler如何监控和解决死锁、内存泄露问题

文章目录 Jprofiler简介1.安装及IDEA集成Jprofiler2.如何监控并解决死锁3.如何监控及解决内存泄露(重点)4.总结5.后话 Jprofiler简介 Jprofilers是针对Java开发的性能分析工具(免费试用10天), 可以对Java程序的内存,CPU,线程,GC,锁等进行监控和分析, 1.安装及IDEA集成Jprofil…

【AIGC】Stable Diffusion的生成参数入门

Stable Diffusion 的生成参数是用来控制图像生成过程的重要设置&#xff0c;下面是一些常见的生成参数及其详解 1、采样器&#xff0c;关于采样器的选择参照作者的上一篇文章 2、采样步数&#xff08;Sampling Steps&#xff09;是指在生成图像时模型执行的总步数&#xff0c…

计算机网络——18无连接传输UDP

无连接传输UDP UDP “尽力而为的”服务&#xff0c;报文段可能 丢失送到应用进程的报文段乱序 无连接 UDP发送端和接收端之间没有握手每个UDP报文段都被独立的处理 UDP被用于 流媒体DNSSNMP 在UDP上实现可靠传输 在应用层增加可靠性应用特定的差错格式 UDP&#xff1a;用户…