当前位置: 首页 > news >正文

手把手教你Spring Cloud Alibaba(一) 集成 Nacos 、Dubbo构建项目

一、背景与项目说明

Dubbo构建项目的微服务好处就是底层的服务可以集中在一块,上层代码消费者(Consumer)直接像使用本地代码一样使用服务。

我们用Nacos作为服务的注册与发现, 方便管理与调用。我们用最简单的项目来说明这个问题,项目有三个子模块:

  • api

    提供服务,与领域实体。 在真正的项目中,做好领域数据的集中管理与划分是衡量一个架构师的其中一个方面

  • provider

    真正服务的实现者,通过注解@DubboService提供对外的微服务组件的提供者(provider)

  • consumer

    服务的使用者,通过注解@DubboReference,就要调用本地服务一样方便。

本项目我们采用的技术栈如下:

  • JDK >= 17
  • Spring Boot 3.X
  • 相应的Spring Cloud Alibaba
  • Nacos 服务 2.X 版本,其默认端口是 8848。(注:Nacos 3.X已经发表,但端口与其他使用上略有些不同)

借助 AI 的提示词:

JDK版本17,Spring Cloud Alibaba 集成 Nacos 、构建一个最简单的Dubbo 服务项目,共有三个字模块:api、provider consumer。

二、模块与代码构成

  1. 父模块,取名为dubbo-demo(实际开发中其实就是你的正式项目),统一管理版本控制与常用依赖。 其pom.xml:

    <?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.example</groupId> <artifactId>dubbo-demo</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>api</module> <module>provider</module> <module>consumer</module> </modules> <packaging>pom</packaging> <!-- 版本管理 --> <properties> <spring.boot.version>2.7.18</spring.boot.version> <spring.cloud.alibaba.version>2021.0.5.0</spring.cloud.alibaba.version> <lombok.version>1.18.28</lombok.version> </properties> <!-- 依赖管理 --> <dependencyManagement> <dependencies> <!-- Spring Boot 依赖管理 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring.boot.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.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <optional>true</optional> </dependency> </dependencies> </dependencyManagement> <!-- 公共依赖 --> <dependencies> <!-- Lombok(编译时注解) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring.boot.version}</version> </plugin> </plugins> </build> </project>

    api模块

    <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>dubbo-demo</artifactId> <groupId>com.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>api</artifactId> </project>

    服务接口类:

    packagecom.example.service;publicinterfaceHelloService{StringsayHello(Stringname);}
  2. provider 模块

    <?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>dubbo-demo</artifactId> <groupId>com.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>provider</artifactId> <dependencies> <!-- 服务接口模块 --> <dependency> <groupId>com.example</groupId> <artifactId>api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Cloud Alibaba Nacos 服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- Spring Cloud Dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.11</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>

    Spring配置

    server: port: 8081 spring: application: name: dubbo-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848 dubbo: scan: base-packages: com.example.service.impl # 服务实现类包路径 protocol: name: dubbo port: -1 # 随机端口 registry: address: nacos://127.0.0.1:8848

    服务实现类,注意注解@DubboService

    packagecom.example.service.impl;importcom.example.service.HelloService;importorg.apache.dubbo.config.annotation.DubboService;@DubboService// Dubbo 服务暴露publicclassHelloServiceImplimplementsHelloService{@OverridepublicStringsayHello(Stringname){return"Hello, "+name+"! 来自 Dubbo 服务提供者";}}

    启动类:

    packagecom.example.service.impl.com.example;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassProviderApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ProviderApplication.class,args);}}
  3. consumer 模块

    <?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>dubbo-demo</artifactId> <groupId>com.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>consumer</artifactId> <dependencies> <!-- API模块依赖 --> <dependency> <groupId>com.example</groupId> <artifactId>api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Cloud Alibaba Nacos 服务注册发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.11</version> </dependency> </dependencies> </project>
    server: port: 8082 spring: application: name: dubbo-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 dubbo: registry: address: nacos://127.0.0.1:8848 cloud: subscribed-services: dubbo-provider # 要调用的服务名(provider的application.name)

    服务使用者类:HelloController

packagecom.example.controller;importcom.example.service.HelloService;importorg.apache.dubbo.config.annotation.DubboReference;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassHelloController{@DubboReference// 远程注入Dubbo服务privateHelloServicehelloService;@GetMapping("/hello/{name}")publicStringhello(@PathVariableStringname){returnhelloService.sayHello(name);}}

启动类:

packagecom.example;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassConsumerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ConsumerApplication.class,args);}}

三、Nacos服务的准备

①. 去Nacos的官网下载页面 :

https://nacos.io/download/nacos-server/

选择2.x的压缩包进行下载,如图:

②. 解压缩后,在nacos\bin的目录使用命令行启动 :

startup.cmd -m standalone

③. 登录Nacos页面 : http://localhost:8848/nacos 。 如图登录成功

四、代码的功能验证

启动顺序:

启动Nacos(localhost:8848)

启动dubbo-provider

启动dubbo-consumer

浏览器访问:

http://localhost:8082/hello/world

返回:

Hello, world! 来自 Dubbo 服务提供者
http://www.jsqmd.com/news/623634/

相关文章:

  • 【实战指南】Ubuntu密码遗忘与重置全流程解析
  • 反应釜大型厂家推荐,江苏地区好用又性价比高的有哪些 - 工业品网
  • Mac QuickLook插件集:3倍效率提升的文件预览解决方案
  • 终极批量文本处理指南:FNR工具如何让查找替换变得如此简单
  • numpy自带的openblas库和openblas64库的差异
  • 从输入URL到页面显示:这中间到底发生了什么?一场“互联网快递”的奇幻漂流
  • 为什么现代PHP项目需要统一的支付解决方案:专业级支付SDK深度解析
  • 单细胞注释进阶指南-利用AddModuleScore精准定位细胞亚群
  • 基于深度学习的YOLOv11的车辆测速和测距与轨迹预测项目 车辆测距识别 车速识别 车辆轨迹预测
  • AI 搜索时代,让本地客户主动找到你 —— 广州互赢网络geo优化 - 资讯焦点
  • 5分钟搞定:用Everything文件搜索工具提升MCP服务的本地文件检索效率
  • Markdown演示文稿制作终极方案:Marp CLI高效命令行工具深度解析
  • 聊聊厦门做隐形车衣有千台经验师傅的门店推荐 - 工业设备
  • 《短剧平台商品详情页前端性能优化实战》
  • cv_resnet101_face-detection_cvpr22papermogface多场景落地:会议签到、活动人流统计、智能门禁预处理
  • 从拉格朗日乘子到支持向量机:深入解析KKT条件与SVM优化
  • 5G室外宏站机房设计与设备布局实战:基于IUV平台的AAU、BBU、电源柜摆放避坑要点
  • 深入解析YOLOv8检测头中的DFL实现原理
  • HunyuanVideo-Foley生成音频的后处理:使用专业软件进行混音与母带制作
  • 为什么你的PyTorch模型需要量化?从原理到落地全解析
  • AnimateDiff模型压缩教程:10分钟掌握量化部署技巧
  • 喜报!itc保伦股份荣膺数字展示在线“2025年度十大LED显示屏品牌奖” - 资讯焦点
  • Linux驱动开发必备:手把手教你编译自定义设备树(dts文件)
  • 张雪机车碾压夺冠背后:比热爱更稀缺的,是“一眼见道”的能力
  • 【实战】AI编程“三件套“深度拆解:Hermes Agent 4.7万star + Claude Code 登顶SWE-bench + Superpowers 14万star,附完整工作流配置
  • 零代码搞定脑电分析!用Brainstorm处理MEG/EEG数据的保姆级入门教程
  • Wan2.2-I2V-A14B创意应用:基于Qt开发跨平台视频生成桌面工具
  • 2026年分析厦门贴隐形车衣哪家可协助提车,靠谱门店解读 - 工业品牌热点
  • PS3游戏更新下载器:解决怀旧游戏更新的终极方案
  • 告别驱动烦恼:Windows平台终极ADB安装工具全解析