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 问题记录

4.2 学习参考

4.3 之前相关博客

posted @   Codorld  阅读(1011)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示
目录导航
springboot整合nacos和dubbo
0. 源码
1. 版本
2. 创建项目
2.1 根项目依赖
2.2 创建模块
2.3 公共模块
2.4 提供者
2.5 消费者
2.6 启动测试
3. 其他知识
4. 参考
4.1 问题记录
4.2 学习参考
4.3 之前相关博客