springboot整合nacos和dubbo

2023-08-15

0. 源码

源码: gitee

1. 版本

java: 1.8.0_281
nacos: 2.1.2

2. 创建项目

创建一个简单的springboot或者maven项目, 或者代码库(gitee/github/其他代码库管理平台)创建一个空白的拉下来, 最后只保留一个pom.xml即可.

2.1 根项目依赖

版本控制参考: 版本说明

其中有一句话Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进, 虽然停止维护了, 但是用户体量大, 而且还有当当的dubbox在更新. 在有明显漏洞或者其他的问题时候还有其他选择, 暂时选作dubbo学习时候使用

spring-boot版本控制
spring-cloud版本控制
spring-cloud-alibaba版本控制
pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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.cloud.nacos.dubbo.demo</groupId>
<artifactId>demo-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version> <!-- spring boot 版本控制 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/>
</parent> <!-- 版本说明: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E-->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target> <spring-cloud-clibaba.version>2021.0.1.0</spring-cloud-clibaba.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties> <dependencyManagement>
<dependencies>
<!-- spring cloud 版本控制 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 版本控制 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-clibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>

2.2 创建模块

右键项目名 -> new -> Module, 分别创建:

common-module
demo-server
demo-client

其中server和client其实是对于dubbo来说的, 因为nacos只是提供配置(未使用), 服务注册和发现的管理, 并没有服务和客户端的说法. 对于dubbo来说是在服务端(提供者)实现接口推送到nacos上, 然后客户端(消费者)引用接口, 会自动从nacos上找到对应接口的实现.

通过以上方式创建出三个model后三个模块的包路径是一样的, 在练习中是可以的, 开发过程中可以更改成各自模块的路径.(如果不是多模块的话需要注意dubbo消费者在引入提供者的接口时候, 接口的包路径需要与提供者相同.)

2.3 公共模块

共用的依赖.(甚至再细分一些自己封装的数据库等等工具类)

<dependencies>
<!-- nacos 注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

实体类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LoginUser implements Serializable { /**
* 用户id/用户名/昵称/角色/权限等等基本信息
*/
String username; /**
* 登录时间/设备/ip/失效等等属性
*/
Date accessTime;
}

接口

public interface UserService {

    /**
* 访问
*
* @return 结果对象
*/
LoginUser access();
}

2.4 提供者

实现接口, 将接口推送到nacos上

pom文件, 引入公共模块

<dependencies>
<!-- 公共模块 -->
<dependency>
<groupId>com.cloud.nacos.dubbo.demo</groupId>
<artifactId>common-module</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

配置文件 application.yml

spring:
main:
# spring boot 2.6.3默认不允许循环依赖, dubbo的这个版本存在循环依赖
allow-circular-references: true
application:
name: demo-server
cloud:
nacos:
config:
enable: false
discovery:
server-addr: 192.168.0.110:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508 dubbo:
consumer:
retries: 5
protocol:
port: -1
name: dubbo
scan:
# 扫描实现类的包路径(可配置多个或数组)
base-packages: com.cloud.nacos.dubbo.demo
registry:
address: nacos://${spring.cloud.nacos.discovery.server-addr}?namespace=${spring.cloud.nacos.discovery.namespace}
cloud:
# 默认*订阅所有, 所以在此处写一个不存在的提供者
# (可订阅多个用,隔开或者用数组的配置方式 -: name)
subscribed-services: "-"

接口实现

@DubboService
public class UserServiceImpl implements UserService {
/**
* 访问
*
* @return 结果对象
*/
@Override
public LoginUser access() {
return LoginUser.builder().username("赵先生").accessTime(new Date()).build();
}
}

启动类

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

2.5 消费者

调用接口, 抛出rest接口

pom文件, 引入公共模块

<dependencies>
<!-- 公共模块 -->
<dependency>
<groupId>com.cloud.nacos.dubbo.demo</groupId>
<artifactId>common-module</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

配置文件 application.yml

spring:
main:
# spring boot 2.6.3默认不允许循环依赖, dubbo的这个版本存在循环依赖
allow-circular-references: true
application:
name: demo-client
cloud:
nacos:
config:
enable: false
discovery:
server-addr: 192.168.0.110:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508 dubbo:
consumer:
retries: 5
protocol:
port: -1
name: dubbo
subscribed-services: nacos-server

抛出接口

@RestController
public class UserController { @DubboReference
UserService userService; @RequestMapping
public LoginUser access() {
return userService.access();
}
}

启动类

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

2.6 启动测试

提供者: 启动后去nacos上面可以看到, 应用名、提供者和提供者提供的api
消费者:启动后nacos上有对应的应用名, 然后浏览器访问http://localhost:8080可以在页面上看到类似{"username":"赵先生","accessTime":"2023-08-14T05:54:11.582+00:00"}的结果算正常

由于提供者并没有引入web依赖, 所以不会在tomcat中启动, 也就不存在端口, 因为不会有端口冲突!

3. 其他知识

我没有用到下面的注解, 应该是配置了相关内容后会隐式生效

@EnableDubbo: 开启注解Dubbo功能, 用在主方法入口
@EnableDiscoveryClient: 开启服务注册发现功能, 用在主方法入口
@RefreshScope: 实现配置自动更新, 用在配置实体类

4. 参考

4.1 问题记录

spring-cloud-starter-dubbo-2021.0.1.0 循环依赖问题
Spring Cloud Dubbo组件去留问题讨论
Spring Cloud Alibaba2.2.9.RELEASE版本中,没有Dubbo版本的对应关系了

4.2 学习参考

dubbo官方文档: 主页
github: alibaba 版本说明
github: alibaba 参考文档
掘金: SpringBoot+Dubbo+Nacos 开发实战教程
简书: nacos结合dubbo2.7.12、springboot分析
知乎: springboot+dubbo+nacos非常详细的整合过程
csdn: 2.1.1版本Spring-cloud + Dubbo + Nacos初试

4.3 之前相关博客

Spring Cloud Gateway 整合 Nacos,测试负载均衡
简单读读源码 - dubbo多提供者(provider)配置方法,以及泛接口多实现类作为提供者上nacos的方案
seata-server 1.3.0整合nacos,使用nacos做注册和配置中心

springboot整合nacos和dubbo的相关教程结束。