springboot整合nacos和dubbo
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初试