SpringCloud 是当前比较流行的微服务开发框架,因此很有必要介绍一下 SpringCloud 集成和使用 Dubbo 技术。本篇博客在上一篇博客的 Demo 基础上,对 pom 文件和 yml 配置文件进行了修改,就可以完成 SpringCloud 集成和使用 Dubbo 的 Demo。是的,你没有看错,没有修改代码,只是修改了 pom 文件和 yml 。由此可见 SpringCloud 集成和使用 Dubbo 是很容易的。
当然为了区分上篇博客的 demo ,我还是把项目工程的名字修改了一下,跟上篇博客的 Demo 源代码以示区分。由于代码没有进行更改,因此本篇博客不再列出具体的代码细节,可以在本篇博客的最后下载源代码进行查看和测试。
一、搭建工程
本篇博客仍然采用 Nacos 为注册中心,因此需要搭建 Nacos,我之前已经在自己的虚拟机中搭建了单机版 Nacos,虚拟机的 ip 地址是 192.168.216.128,搭建好之后默认不需要登录就可以访问,端口是 8848,这里全都保持不变。
把上一篇博客的 Demo 复制一份过来,修改了项目工程的名称,修改后的结果如下:
common_cloud 是抽取出来的公共项目,里面是公用的实体类和接口方法
provider_cloud 是 dubbo 服务接口的提供者,实现 dubbo_common 中定义的接口
consumer_cloud 是 dubbo 服务的消费者,用来调用 dubbo 服务提供的 tcp 接口
二、父工程的 pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jobs</groupId>
<artifactId>springcloud_dubbo</artifactId>
<version>1.0</version>
<modules>
<module>common_cloud</module>
<module>provider_cloud</module>
<module>consumer_cloud</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--引入 springCloud alibaba 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
对于父工程来说,需要注意 SpringBoot 和 SpringCloud 的版本对应关系,版本不匹配的话,就会走弯路。
- 这里使用的是 SpringCloud alibaba 版本是 2.2.5.RELEASE
- 这里使用的 SpringBoot 版本是 2.3.9.RELEASE
lombok 是子工程都使用的依赖,直接在父工程中引入,主要使用其日志记录功能,以及创建实体对象时省略 get 和 set 方法。
三、Provider 的 pom 和 yml
Provider 的 pom 内容如下,具体细节不做解释,一目了然。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud_dubbo</artifactId>
<groupId>com.jobs</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider_cloud</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--如果该 springboot 程序只是做 dubbo 的服务端提供 tcp 接口,
不对外提供 http 接口的话,那么只需要引用 springboot 的起步依赖即可。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--nacos注册中心的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--springcloud alibaba dubbo依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--引入公共的实体类和接口-->
<dependency>
<groupId>com.jobs</groupId>
<artifactId>common_cloud</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
Provider 的 yml 配置文件内容如下:
spring:
application:
name: provider-cloud
cloud:
nacos:
discovery:
server-addr: 192.168.216.128:8848
# 配置 dubbo 提供者信息:采用 dubbo 协议,指定服务的 tcp 端口
dubbo:
protocol:
name: dubbo
port: 22222
# 使用 nacos 作为注册中心
registry:
#使用springcloud中注册中心的地址
address: spring-cloud://192.168.216.128
# dubbo 扫描服务接口的包,一般扫描接口所在的包即可
scan:
base-packages: com.jobs.service
这里需要注意的是:由于 Provider 微服务已经配置了 Nacos 的地址:192.168.216.128:8848 ,因此对于 Dubbo 来说,其向 Nacos 注册时使用微服务的注册地址就可以了,写法为:spring-cloud://192.168.216.128 ,不需要写端口信息。
四、Consumer 的 pom 和 yml
Consumer 的 pom 内容如下,具体细节不做解释,一目了然。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud_dubbo</artifactId>
<groupId>com.jobs</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer_cloud</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--这里的 dubbo 消费者对外提供 http 接口,用于通过浏览器测试,
因此引入了 springboot web 的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos注册中心的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--springcloud alibaba dubbo依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--引入公共的实体类和接口-->
<dependency>
<groupId>com.jobs</groupId>
<artifactId>common_cloud</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.9.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
由于在父工程中使用的 SpringBoot 版本是 2.3.9.RELEASE ,因此这里的 spring-boot-maven-plugin 版本就保持跟父工程的 SpringBoot 版本一致了。然后再看一下 Consumer 的 yml 配置内容:
server:
port: 8888
spring:
application:
name: consumer-cloud
cloud:
nacos:
discovery:
server-addr: 192.168.216.128:8848
# 配置 dubbo 消费者信息
dubbo:
registry:
address: spring-cloud://192.168.216.128
consumer:
# 关闭了启动检查,这样消费者启动时,不会到 nacos 中检查服务提供者是否存在
check: false
# 建议在这里统一配置为不重试请求,对于查询来说可以在代码中单独配置重试次数
retries: 0
# 默认情况下限制请求必须在 1000 毫秒内完成,对于具体服务可以在代码中单独配置
timeout: 1000
这里有关 Dubbo 的注册地址配置跟 Provider 配置的写法是一样。
五、验证成果
启动 Provider 和 Consumer 两个微服务,然后打开 Nacos 就可以看到,如下所示:
在浏览器地址栏上输入链接,比如:http://localhost:8888/emp/666
就能看到返回结果:
本篇博客的源代码下载地址为:https://files.cnblogs.com/files/blogs/699532/springcloud_dubbo.zip