springboot整合nacos和dubbo

springboot,整合,nacos,dubbo · 浏览次数 : 60

小编点评

**1. Spring Boot Dubbo 示例** ```java @EnableDubbo @EnableDiscoveryClient public class Main { @RefreshScope @Autowired private UserService userService; @RequestMapping("/access") public LoginUser access() { return userService.access(); } } ``` **2. nacos 配置** ```properties # nacos 配置 nacos.server-addr=192.168.0.110:8848 nacos.namespace=5467517c-4121-4275-b459-b92a7a12f508 ``` **3. 服务注册发现** ```properties # 服务注册发现 discovery.client.discovery-interval=100 discovery.client.discovery-client-name=demo-client ``` **4. 消费者调用接口** ```java @DubboReference UserService userService; @RequestMapping("/access") public LoginUser access() { return userService.access(); } ``` **5. 运行测试** ```bash # 启动后去nacos上面可以看到 nacos -server-addr=192.168.0.110:8848 -register-nacos-config # 浏览器访问http://localhost:8080可以在页面上看到类似{\"username\":\"赵先生\",\"accessTime\":\"2023-08-14T05:54:11.582+00:00\"}的结果算正常 ``` **6. 其他知识** * Dubbo 是一个提供者支持服务注册发现的框架。 * Nacos 是一个配置中心,用于配置服务注册发现。 * Spring Boot Dubbo 是一个整合Dubbo和Nacos的框架。

正文

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 之前相关博客

与springboot整合nacos和dubbo相似的内容:

springboot整合nacos和dubbo

## 0. 源码 **源码: [gitee](https://gitee.com/codorld/spring-cloud-alibaba-nacos-dubbo-demo)** ## 1. 版本 - java: `1.8.0_281` - nacos: `2.1.2` ## 2. 创建项目 创建一

Springboot整合Apollo

一、Apollo作用 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址…… 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制…… 在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对

SpringBoot 整合 EasyExcel 实现自由导入导出,太强了

在实际的业务系统开发过程中,操作 Excel 实现数据的导入导出基本上是个非常常见的需求。 之前,我们有介绍一款非常好用的工具:EasyPoi,有读者提出在数据量大的情况下,EasyPoi 会占用内存大,性能不够好,严重的时候,还会出现内存异常的现象。 今天我给大家推荐一款性能更好的 Excel 导

SpringBoot整合XXLJob

目录XXLJob简介特性模块安装调度中心初始化数据库配置启动整合执行器pomymlXxlJobConfig启动执行器实践简单的定时任务在执行器创建任务在调度中心创建执行器在调度中心创建任务带前置和后置处理的定时任务XxlJob注解详解创建带前(后)置处理的任务父子任务父子执行器关联父子任务执行器侧l

利用SpringBoot+rabbitmq 实现邮件异步发送,保证100%投递成功

在之前的文章中,我们详细介绍了 SpringBoot 整合 mail 实现各类邮件的自动推送服务。 但是这类服务通常不稳定,当出现网络异常的时候,会导致邮件推送失败。 本篇文章将介绍另一种高可靠的服务架构,实现邮件 100% 被投递成功。类似的短信自动发送等服务也大体相同。 一、先来一张流程图 本文

MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图

MQTT连接池 主要用到 `InitializingBean、BasePooledObjectFactory、GenericObjectPool、GenericObjectPoolConfig` MQTT是一个轻量级传输协议,它被设计用于轻量级的发布/订阅式消息传输,MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化。是一种简单、稳定、开放、轻量级易于实现的消息协议,在物联网的应用下的信

Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别

今天给大家分享一个SpringBoot整合Tess4j库实现图片文字识别的小案例,希望xdm喜欢。文末有案例代码的Git地址,可以自己下载了去玩玩儿或继续扩展也行。

Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发

Dubbo3程序的初步开发 Dubbo3升级的核心内容 易⽤性 开箱即⽤,易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持(GO PYTHON RUST) 超⼤规模微服务实践 ⾼性能通信(Tripl

我不应该用JWT的!

一、前言 大家好呀,我是summo,之前有自学过Shrio框架,网上一搜就有SpringBoot整合Shrio+ JWT的文章,我是在学习Shrio框架的时候顺带学的JWT。后来我还看见有很多博主专门写文章介绍JWT,说这个东西的优点很多,安全性好、去中心化、方便啥的,我就把JWT也应用在我们自己的

基于SpringBoot应⽤的logback⽇志配置

SpringBoot默认整合了logback-classic⽇志框架,我们需要对logback⽇志框架进⾏配置 以⾃定义⽇志输出格式、⽇志⽂件配置、⽇志⽂件保存策略等信息