dubbo实践最小治理单元demo
这个示例将使用Spring Boot 3 Dubbo 3.3采用Nacos 作为注册中心完整演示服务定义、暴露和调用。1. 整体目录结构dubbo-demo父工程 ├── pom.xml父POM管理版本 ├── common公共模块 │ ├── pom.xml │ └── src/main/java/com/demo/common/ │ ├── dto/User.java │ └── api/UserService.java // 纯业务接口无任何注解 ├── service-b服务提供方端口8081 │ ├── pom.xml │ ├── src/main/java/com/demo/serviceb/ │ │ ├── ServiceBApplication.java │ │ └── service/ │ │ └── UserServiceImpl.java // 实现 common 中的接口 │ └── src/main/resources/application.yml └── service-a服务调用方端口8080 ├── pom.xml ├── src/main/java/com/demo/servicea/ │ ├── ServiceAApplication.java │ └── controller/OrderController.java // 注入 Dubbo 远程服务 └── src/main/resources/application.yml2. 父工程 pom.xml根目录?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.demo/groupIdartifactIddubbo-demo/artifactIdversion1.0.0/versionpackagingpom/packagingparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.2.8/versionrelativePath//parentpropertiesjava.version17/java.versiondubbo.version3.3.0/dubbo.version/propertiesdependencyManagementdependenciesdependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-bom/artifactIdversion${dubbo.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementmodulesmodulecommon/modulemoduleservice-b/modulemoduleservice-a/module/modules/project3. common 模块定义 API 契约common/pom.xml?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIddubbo-demo/artifactIdgroupIdcom.demo/groupIdversion1.0.0/version/parentmodelVersion4.0.0/modelVersionartifactIdcommon/artifactIddependencies!-- 仅需最基础的依赖不需要 Dubbo 注解 --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!-- 为了兼容 DTO 序列化 --dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-annotations/artifactId/dependency/dependencies/projectcommon/src/main/java/com/demo/common/dto/User.javapackagecom.demo.common.dto;importlombok.Data;importjava.io.Serializable;DatapublicclassUserimplementsSerializable{privatestaticfinallongserialVersionUID1L;privateLongid;privateStringname;privateStringemail;}common/src/main/java/com/demo/common/api/UserService.javapackagecom.demo.common.api;importcom.demo.common.dto.User;// 注意这是一个纯 Java 接口没有任何注解// 在 Dubbo 中接口就是契约不需要 FeignClient 这类东西publicinterfaceUserService{UsergetUserById(Longid);}4. service-b 模块服务提供方service-b/pom.xml?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIddubbo-demo/artifactIdgroupIdcom.demo/groupIdversion1.0.0/version/parentmodelVersion4.0.0/modelVersionartifactIdservice-b/artifactIddependencies!-- 依赖 common 模块 --dependencygroupIdcom.demo/groupIdartifactIdcommon/artifactIdversion1.0.0/version/dependency!-- Spring Boot Web提供 HTTP 能力可选 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Dubbo Spring Boot Starter核心 --dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactId/dependency!-- Nacos 注册中心 --dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-nacos-spring-boot-starter/artifactId/dependency/dependencies/projectservice-b/src/main/resources/application.ymlserver:port:8081spring:application:name:service-bdubbo:application:name:service-b# 应用名与 spring.application.name 一致protocol:name:tri# Triple 协议Dubbo 3.x 推荐port:50051# Dubbo 服务端口registry:address:nacos://127.0.0.1:8848# 注册中心地址# 如果使用 Zookeeper改为: zookeeper://127.0.0.1:2181scan:base-packages:com.demo.serviceb.service# 扫描 DubboService 注解service-b/src/main/java/com/demo/serviceb/ServiceBApplication.javapackagecom.demo.serviceb;importorg.apache.dubbo.config.spring.context.annotation.EnableDubbo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplicationEnableDubbo// 开启 Dubbo 支持等价于 EnableDubboConfig DubboComponentScanpublicclassServiceBApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceBApplication.class,args);}}service-b/src/main/java/com/demo/serviceb/service/UserServiceImpl.javapackagecom.demo.serviceb.service;importcom.demo.common.api.UserService;importcom.demo.common.dto.User;importorg.apache.dubbo.config.annotation.DubboService;importorg.springframework.stereotype.Component;ComponentDubboService// 暴露服务到注册中心publicclassUserServiceImplimplementsUserService{OverridepublicUsergetUserById(Longid){UserusernewUser();user.setId(id);user.setName(张三来自Dubbo服务);user.setEmail(zhangsandubbo.com);returnuser;}}5. service-a 模块服务调用方service-a/pom.xml?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIddubbo-demo/artifactIdgroupIdcom.demo/groupIdversion1.0.0/version/parentmodelVersion4.0.0/modelVersionartifactIdservice-a/artifactIddependencies!-- 依赖 common 模块 --dependencygroupIdcom.demo/groupIdartifactIdcommon/artifactIdversion1.0.0/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Dubbo Spring Boot Starter --dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactId/dependency!-- Nacos 注册中心 --dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-nacos-spring-boot-starter/artifactId/dependency/dependencies/projectservice-a/src/main/resources/application.ymlserver:port:8080spring:application:name:service-adubbo:application:name:service-aregistry:address:nacos://127.0.0.1:8848# 注册中心地址consumer:check:false# 启动时不检查提供者是否在线开发环境推荐timeout:3000# 调用超时时间毫秒service-a/src/main/java/com/demo/servicea/ServiceAApplication.javapackagecom.demo.servicea;importorg.apache.dubbo.config.spring.context.annotation.EnableDubbo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplicationEnableDubbopublicclassServiceAApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceAApplication.class,args);}}service-a/src/main/java/com/demo/servicea/controller/OrderController.javapackagecom.demo.servicea.controller;importcom.demo.common.api.UserService;importcom.demo.common.dto.User;importorg.apache.dubbo.config.annotation.DubboReference;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassOrderController{DubboReference// 引用远程 Dubbo 服务privateUserServiceuserService;GetMapping(/order/{id}/user)publicUsergetOrderUser(PathVariable(id)Longid){// 像调用本地方法一样调用远程服务returnuserService.getUserById(id);}}6. 启动前准备启动 Nacos 注册中心在运行服务之前你需要启动 Nacos# 下载 Nacos 并解压然后启动这里以 2.3.0 版本为例# Mac/Linuxshstartup.sh-mstandalone# Windowsstartup.cmd-mstandalone如果使用 Zookeeper则需要启动 Zookeeper 服务并将配置中的nacos改为zookeeper。7. 运行测试先启动 service-b观察控制台输出会看到 Dubbo 服务成功注册到 Nacos。再启动 service-a观察控制台输出。访问http://localhost:8080/order/123/user返回{id:123,name:张三来自Dubbo服务,email:zhangsandubbo.com}8. 与 Feign 版本的关键对比对比点Feign (OpenFeign)Dubbocommon 模块内容FeignClientGetMapping注解接口纯 Java 接口 DTO无任何注解提供方B暴露方式实现 Controller用RestController实现 Service用DubboService调用方A注入方式Autowired注入DubboReference注入通信协议HTTP默认Triple基于 HTTP/2默认注册中心自动集成 Spring Cloud 注册中心通过dubbo.registry配置接口变更影响修改GetMapping路径A 服务编译期报错修改接口方法名/参数A 服务编译期报错启动类注解EnableFeignClientsEnableDubbo9. 注意事项避坑指南问题解决方案端口冲突Dubbo 的dubbo.protocol.port是RPC 端口与server.portHTTP端口不同可独立设置。服务找不到检查注册中心地址是否正确且 B 服务已启动。consumer.checkfalse可避免启动时因服务未上线而报错。接口包路径不一致A 和 B 的common包路径必须完全一致如都是com.demo.common.api否则 Dubbo 无法匹配。DTO 序列化所有 DTO 必须实现Serializable并建议显式声明serialVersionUID。Spring Boot 版本Dubbo 3.3.x 支持 Spring Boot 3.x如果使用 Spring Boot 2.x需引入dubbo-spring-boot-starter3.0.x 版本。总结标准微服务的 Dubbo 最小单元┌──────────────────────────────────────────────────────────┐ │ common 模块 (纯 Java 接口 DTO) │ │ └── UserService.java (无任何注解) │ │ └── User.java (实现 Serializable) │ └──────────────────────────────────────────────────────────┘ ▲ 依赖 ▲ 依赖 │ │ ┌──────────┴──────────┐ ┌─────────────┴────────────┐ │ service-b (提供方) │ │ service-a (调用方) │ │ EnableDubbo │ │ EnableDubbo │ │ DubboService │ │ DubboReference │ │ 实现 UserService │──RPC─▶ 注入 UserService │ └─────────────────────┘ └──────────────────────────┘