dubbo3.0整合SpringBoot例子

dubbo新版本(3.0以上)在相对于 dubbo 旧版本(2.5、2.6、2.7),有很多的不相同的地方。

官方文档也说了新版本的特性:

https://dubbo.apache.org/zh/docs/v3.0/new-in-dubbo3

本文就来使用dubbo3.0新版本 搭建一个dubbo+SpringBoot 项目,项目结构:

源码已上传到github:https://github.com/DogerRain/dubbo-samples-test

(项目名字是带springCloud的,因为本来还想整合SpringCloud的,还没来得及整合.....先不改了)

下面是十分详细的过程。

环境要求:

  • jdk1.8
  • zookeeper

项目会创建三个modul:

dubbo-samples-springcloud-api
dubbo-samples-springcloud-consumer
dubbo-samples-springcloud-provider

先来创建一个父项目,定义好一些 依赖包和项目结构:

	<modules>
<module>dubbo-samples-springcloud-api</module>
<module>dubbo-samples-springcloud-consumer</module>
<module>dubbo-samples-springcloud-provider</module>
</modules>
<properties>
<java.version>1.8</java.version>
<source.level>1.8</source.level>
<target.level>1.8</target.level>
<skip_maven_deploy>true</skip_maven_deploy>
<spring-boot-dependencies.version>2.4.1</spring-boot-dependencies.version>
<spring-cloud-dependencies.version>Dalston.SR4</spring-cloud-dependencies.version>
<junit.version>4.12</junit.version>
<dubbo.version>3.0.2.1</dubbo.version>
</properties> <dependencyManagement>
<dependencies>
<!-- 统一jar版本管理,避免使用 spring-boot-parent -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--dubbo 和 springboot 整合的包-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>

项目的依赖结构为:

dubbo-samples-springcloud-consumer
--dubbo-samples-springcloud-api dubbo-samples-springcloud-provider
--dubbo-samples-springcloud-api dubbo-samples-springcloud-api

但如果是旧项目不想改动了,可能会不需要API项目那么你的依赖结构就是这样的:

dubbo-samples-springcloud-consumer
--dubbo-samples-springcloud-provider dubbo-samples-springcloud-provider

1、创建 API 项目——dubbo-samples-springcloud-api

创建一个 dubbo-samples-springcloud-api 项目,创建该项目是为了解耦,这样 provider定义好接口,打成一个SDK,丢给消费者引入就行了。

1.1、pom文件:

	<parent>
<groupId>com.dubbo</groupId>
<artifactId>dubbo-samples-springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent> <artifactId>dubbo-samples-springcloud-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-samples-springcloud-api</name>
<description>dubbo stress test - api</description> <dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>

1.2、定义接口

废话少说,先来定义一个接口:

UserService.java 接口:

public interface UserService {
User getUserInfo(long userId);
}

User.java 实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = -4294369157631410325L;
Long userId;
String userName;
String responseInfo;
}

2、创建provider——dubbo-samples-springcloud-provider

创建一个dubbo-samples-springcloud-provider 项目

2.1、配置pom文件:

	<parent>
<groupId>com.dubbo</groupId>
<artifactId>dubbo-samples-springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-samples-springcloud-provider</artifactId> <dependencies>
<!--dubbo-samples-springcloud-api 项目 依赖-->
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>dubbo-samples-springcloud-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--dubbo 与 spring-boot 整合包-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!--springboot 启动核心包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--springboot rest -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
</dependency>
</dependencies>

使用了 dubbo-spring-boot-starter 就不需要 原来的 dubbo 依赖了,但是还是需要 dubbo-registry-zookeeper ,因为要连接zk。

2.2、yaml文件配置

server:
port: 8090 spring:
application:
name: dubbo-samples-privider-springCloud dubbo:
application:
name: ${spring.application.name}
registry:
address: zookeeper://127.0.0.1:2181
timeout: 2000
protocol:
name: dubbo
port: 20890
# 扫描 @DubboService 注解
scan:
base-packages: com.dubbo.service

dubbo.application.name 可以不写,默认是 spring.application.name 的名字。

2.3、实现 UserService 接口

@DubboService
@Component
@Slf4j
public class UserServiceImpl implements UserService { /**
*
* @param userId
* @return
* RPC provider 接口 实现
*/
@Override
public User getUserInfo(long userId) { log.info("request from consumer: {}", RpcContext.getContext().getRemoteAddress());
log.info("response from provider: {}" , RpcContext.getContext().getLocalAddress());
return new User(userId, "userName" + userId , " --->>>>response from remote RPC provider:" + RpcContext.getContext().getLocalAddress());
}
}

@DubboService 表示这是一个暴露出去的接口。

旧版本可能是 使用 @Service ,与 spring的 @Service 容易让人误解,不推荐使用

@Component 表示这是一个bean,方便其他地方引用

2.4、添加一个Controller

我这里用写一个Controller,方便测试。

@RestController
@RequestMapping("/provider")
public class ProviderUserController { @Resource
UserServiceImpl userService; @RequestMapping("/user/{id}")
User getUserInfo(@PathVariable("id") Long id ){
return userService.getUserInfo(id);
}
}

2.5、启动类

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
System.out.println("dubbo client started..........");
}
}

@EnableDubbo 表示自动扫描声明 @DubboService 的类,也可以使用dubbo.scan.base-packages 指定扫描路径,两者选择其中一个即可。

3、创建consumer——dubbo-samples-springcloud-consumer

3.1、配置pom文件

<parent>
<groupId>com.dubbo</groupId>
<artifactId>dubbo-samples-springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>dubbo-samples-springcloud-consumer</artifactId>
<packaging>jar</packaging>
<description>The demo consumer module of dubbo project</description>
<properties>
<skip_maven_deploy>true</skip_maven_deploy>
</properties> <dependencies>
<!--dubbo-samples-springcloud-api 项目 依赖-->
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>dubbo-samples-springcloud-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<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> <dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
</dependency>
</dependencies>

3.2、yaml配置

server:
port: 8091 spring:
application:
name: dubbo-samples-consumer-springCloud dubbo:
registry:
address: zookeeper://127.0.0.1:2181
timeout: 2000
protocol:
name: dubbo

3.3、调用 provider

这一步我添加一个Controller 用来调用provider

@RestController
@RequestMapping("/consumer")
@Slf4j
public class ConsumerUserController { @DubboReference(version = "*", protocol = "dubbo", loadbalance = "random")
private UserService userService; @RequestMapping("/user/{id}")
public User getUser(@PathVariable("id") Long id) {
User user = userService.getUserInfo(id);
log.info("response from provider: {}", user);
return user;
}
}

@DubboReference 表示使用RPC(这里使用dubbo协议)进行远程调用。

3.4、启动类

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
System.out.println("dubbo client started..........");
}
}

4、测试

4.1、启动 provider

运行 ProviderApplication.java

端口是 8090

4.2、启动 consumer

运行 ConsumerApplication.java

端口是 8091

4.3 登入 dubboAdmin看看

dubboAdmin 是一个后台可视化项目,可以看到 关于dubbo服务方、消费者相关的信息。

这里就不阐述怎么搭建了,可以参考其他文章。

4.4、调用 consumer 的接口

浏览器输入:http://localhost:8091/consumer/user/2

看下provider日志:

2021-11-19 15:05:40.206  INFO 25932 --- [20890-thread-11] com.dubbo.service.UserServiceImpl: request from consumer: /172.16.44.48:50513
2021-11-19 15:05:40.206 INFO 25932 --- [20890-thread-11] com.dubbo.service.UserServiceImpl: response from provider: 172.16.44.48:20890

consumer日志:

2021-11-19 15:05:40.207  INFO 33120 --- [nio-8091-exec-4] c.d.controller.ConsumerUserController: response from provider: User(userId=2, userName=userName2, responseInfo= --->>>>response from remote RPC provider:172.16.44.48:20890)

你会看到 consumer 启动了一个 50513 的端口和provider进行通讯。

到这里,dubbo+SpringBoot 的整合就完成了。

·

如果你直接调用provider的Controller。

浏览器输入:http://localhost:8090/provider/user/2

它显示是这样的:

它就很普通的调用一样了。

所以在这里你对比一下,RPC也就是这样的一个过程。

5、总结和踩坑

5.1、版本管理

建议使用dubbo的统一版本管理,也就是 dubbo-bom

5.2、jar依赖

如果你使用的是 dubbo-spring-boot-starter ,就不需要 dubbo 这个jar了

5.3、关联

正常情况下, 这三个项目不是在一起的。

比如说公司两个部门,一个是用户中心,一个是订单,用户中心要RPC调用订单服务。

那么只需要订单服务只需要新建一个API项目,定义一些接口。

然后打成jar 给到用户中心接入,用户中心使用Dubbo就可以直接调用了。

所以好处就是:

  • 不需要使用Http直接调用了(当然Dubbo也支持http协议)
  • 不需要整个jar打包,可以解耦,把api项目暴露即可

5.4、最后

项目的地址已经上传到github:https://github.com/DogerRain/dubbo-samples-test

接下来还有两个TODO:

  • 整合SpringCloud
  • 使用jmeter压测dubbo、rest、hessian协议 传输大包的性能

Duboo整合SpringBoot超级详细例子(附源码)的更多相关文章

  1. 详解SpringBoot集成jsp(附源码)+遇到的坑

    本文介绍了SpringBoot集成jsp(附源码)+遇到的坑 ,分享给大家 1.大体步骤 (1)创建Maven web project: (2)在pom.xml文件添加依赖: (3)配置applica ...

  2. easyUI整合富文本编辑器KindEditor详细教程(附源码)

    原因 在今年4月份的时候写过一篇关于easyui整合UEditor的文章Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合,从那 ...

  3. SpringBoot集成jsp(附源码)+遇到的坑

    1.大体步骤 (1)       创建Maven web project: (2)       在pom.xml文件添加依赖: (3)       配置application.properties支持 ...

  4. PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)

    说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...

  5. SpringBoot2.x整合Prometheus+Grafana【附源码+视频】

    图文并茂,新手入门教程,建议收藏 SpringBoot2.x整合Prometheus+Grafana[附源码+视频] 附源码+视频 目录 工程简介 简介 Prometheus grafana Spri ...

  6. 微信小程序之蓝牙开发(详细读数据、写数据、附源码)

    本文将详细介绍微信小程序的蓝牙开发流程(附源码)准备:微信只支持低功耗蓝牙也就是蓝牙4.0,普通的蓝牙模块是用不了的,一定要注意. 蓝牙可以连TTL接到电脑上,再用XCOM调试 一开始定义的变量 va ...

  7. 超详细的php用户注册页面填写信息完整实例(附源码)

    这篇文章主要介绍了一个超详细的php用户注册页面填写信息完整实例,内容包括邮箱自动匹配.密码强度验证以及防止表单重复等,小编特别喜欢这篇文章,推荐给大家. 注册页面是大多数网站必备的页面,所以很有必要 ...

  8. 微服务8:通信之RPC实践篇(附源码)

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

随机推荐

  1. 100台机器上海量IP如何查找出现频率 Top 100?

    场景题 有 100 机器,每个机器的磁盘特别大,磁盘大小为 1T,但是内存大小只有 4G,现在每台机器上都产生了很多 ip 日志文件,每个文件假设有50G,那么如果计算出这 100 太机器上访问量最多 ...

  2. java多线程--wait和sleep

    调用sleep方法将时线程进入休眠状态 如 public class ThreadTest implements Runnable{ @Override public void run() { try ...

  3. 网络基础--简单理解什么是DNS? TCP? UDP? Http? Socket?

    什么是IP 协议?  协议就是为了实现网络通信而创建的一系列规范.  通常我们的网络模型从上到下共分为4层: 应用层, 传输层, 网络层 和数据链路层. IP协议属于网络层协议,它精确定义了网络通信中 ...

  4. 面试官问我MySQL调优,我真的是

    面试官:要不你来讲讲你们对MySQL是怎么调优的? 候选者:哇,这命题很大阿...我认为,对于开发者而言,对MySQL的调优重点一般是在「开发规范」.「数据库索引」又或者说解决线上慢查询上. 候选者: ...

  5. 题解 P6454 麻将 加强版

    题目传送门 题目大意 不想写了,直接看题面吧. 思路 被这个题搞自闭了,因为读错题目想一个非常恶心的东西想了一场考试,然后就删代码,然后就被骂了.哎. 需要注意的是:我们只能选一次雀头 于是,不难看出 ...

  6. 洛谷2805 [NOI2009]植物大战僵尸 (拓扑排序+最小割)

    坚决抵制长题面的题目! 首先观察到这个题目中,我们会发现,我们对于原图中的保护关系(一个点右边的点对于这个点也算是保护) 相当于一种依赖. 那么不难看出这个题实际上是一个最大权闭合子图模型. 我们直接 ...

  7. CVPR2021提出的一些新数据集汇总

    ​  前言  在<论文创新的常见思路总结>(点击标题阅读)一文中,提到过一些新的数据集或者新方向比较容易出论文.因此纠结于选择课题方向的读者可以考虑以下几个新方向.文末附相关论文获取方式. ...

  8. css实现水平-垂直居中的方法

    * 定宽居中: 1.absolute+负margin 2.absolute+margin:auto 3.absolute--calc 4.min-height:100vh + flex + margi ...

  9. (半课内)信安数基 RSA-OAEP 初探

    在RSA攻击中,存在着"小明文攻击"的方式: 在明文够小时,密文也够小,直接开e次方即可: 在明文有点小时,如果e也较小,可用pow(m,e)=n*k+c穷举k尝试爆破 所以,比如 ...

  10. NOIP 模拟 $79\; \rm y$

    题解 \(by\;zj\varphi\) NOIP2013 的原题 最简单的思路就是一个 bfs,可以拿到 \(70pts\) 75pts #include<bits/stdc++.h> ...