SpringCloud 集成和使用 Dubbo

发布时间 2023-07-15 21:31:08作者: 乔京飞

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 复制一份过来,修改了项目工程的名称,修改后的结果如下:

image

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 就可以看到,如下所示:

image

在浏览器地址栏上输入链接,比如:http://localhost:8888/emp/666 就能看到返回结果:

image


本篇博客的源代码下载地址为:https://files.cnblogs.com/files/blogs/699532/springcloud_dubbo.zip