ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零搭建Dubbo 2.7与Zookeeper 3.8服务治理环境:避坑指南与实战Demo

从零搭建Dubbo 2.7与Zookeeper 3.8服务治理环境:避坑指南与实战Demo 1. 项目背景与核心价值最近在整理一些遗留的老项目发现好几个系统还在用Dubbo 2.x配合Zookeeper做服务治理。虽然现在Spring Cloud Alibaba和Dubbo 3.x已经大行其道但不得不说这套经典的“Dubbo ZK”组合拳在不少公司的生产环境里依然坚挺。对于刚接触分布式服务框架的新手或者需要维护老系统的朋友来说能快速搭建一个可运行的Demo环境依然是项很实用的基本功。今天这个内容就是带你从零开始把Dubbo和Zookeeper的最新稳定版装起来并跑通一个最基础的“服务提供者-消费者”Demo。别小看这个简单的流程里面涉及到版本兼容性、配置项理解、服务启动顺序等一堆细节任何一个环节卡住都可能让你折腾半天。我会把我在实际搭建过程中踩过的坑、验证过的有效配置都揉进去目标就是让你看完之后能一次成功地把服务调通。2. 环境准备与核心组件选型动手之前先把“家伙事儿”备齐。这里的选择直接关系到后续Demo能否顺利运行。2.1 Java环境确认Dubbo是Java系的框架所以一个正确配置的JDK是前提。我强烈建议使用JDK 8或JDK 11这两个长期支持版LTS它们在生态兼容性上最好。避免使用过于前沿的版本如JDK 17虽然新版本也能跑但可能会遇到一些三方库依赖的兼容性警告增加不必要的排查成本。打开你的终端输入java -version和javac -version确保两者版本一致且已正确配置环境变量JAVA_HOME,PATH。这是老生常谈但也是最多人栽跟头的地方。我遇到过有人电脑里装了好几个JDK环境变量指向混乱导致Maven编译用的是一套运行时又是另一套报错信息让人摸不着头脑。2.2 组件版本锁定这是最关键的一步版本不匹配是导致各种诡异问题的罪魁祸首。我们基于2024年4月这个时间点选择经过验证的稳定组合。Apache Zookeeper: 选择3.8.3版本。这是3.8.x系列的稳定版修复了之前版本的一些重要Bug且与Dubbo兼容性良好。不建议使用最新的3.9.x因为其二进制包结构和默认配置有些变化对于新手来说容易配置出错。Apache Dubbo: 选择2.7.23版本。这是Dubbo 2.x系列的最后一个稳定版本功能完善社区资料丰富。虽然Dubbo 3.x是未来但2.7.x仍然是目前存量系统的主流学习它更具普适价值。3.x在协议、服务发现模型上有较大改动我们可以在熟悉2.x后再平滑过渡。Apache Maven: 选择3.8.8或更高版本如3.9.x。用于管理项目依赖和构建。确保你的settings.xml文件通常在~/.m2/目录下配置了正确的国内镜像源如阿里云镜像否则下载依赖会非常缓慢甚至失败。集成开发环境IDE: IntelliJ IDEA 或 Eclipse。IDEA对Spring和Dubbo的支持更友好有丰富的插件这里以IDEA为例进行演示。注意不要盲目追求“最新”。生产环境的稳定性高于一切我们学习和搭建Demo环境也应该遵循这个原则使用经过广泛验证的稳定版本组合。2.3 下载安装ZookeeperZookeeper在这里扮演服务注册中心的角色Dubbo的服务提供者会向它注册自己的地址消费者从它那里查询提供者地址。获取安装包 访问Apache Zookeeper官网的 下载页面 找到3.8.3版本下载apache-zookeeper-3.8.3-bin.tar.gz这个二进制包。注意是-bin后缀这是编译好的可直接运行的版本。解压与目录结构 将下载的压缩包解压到你喜欢的目录例如/opt/zookeeper或D:\tools\zookeeper。解压后的目录主要包含bin/: 运行脚本conf/: 配置文件目录lib/: 依赖库logs/: 日志目录启动后生成配置Zoo.cfg 进入conf目录将zoo_sample.cfg复制一份并重命名为zoo.cfg。这是Zookeeper的主配置文件。用文本编辑器打开zoo.cfg我们主要关注以下几个参数dataDir: 数据目录。默认是/tmp/zookeeper但这个目录在Linux下可能被系统清理。强烈建议修改为一个固定的、有读写权限的路径例如dataDir/opt/zookeeper/data。记得手动创建这个目录。clientPort: 客户端连接端口。默认是2181通常保持默认即可。admin.serverPort: 管理服务器端口。默认是8080注意不要和你本地的其他服务如Tomcat冲突。一个最小化的、安全的配置示例如下tickTime2000 initLimit10 syncLimit5 dataDir/opt/zookeeper/data clientPort2181 admin.serverPort8888 # 改为一个不常用的端口启动与验证Linux/Mac: 进入bin目录执行./zkServer.sh start。查看状态用./zkServer.sh status。Windows: 进入bin目录双击zkServer.cmd。 启动成功后你可以用telnet localhost 2181连接然后输入stat命令如果能看到Zookeeper的版本和模式standalone/单机信息说明服务启动正常。也可以使用zkCli.sh或zkCli.cmd连接客户端进行简单操作测试。3. 创建Dubbo服务提供者Demo服务提供者Provider是实际业务逻辑的实现方它将自己的服务接口和地址注册到Zookeeper。3.1 使用Spring Boot Initializr创建项目我们使用Spring Boot来简化配置这是目前最主流的方式。在IDEA中可以直接使用 Spring Initializr 创建项目。项目基本信息Project: MavenLanguage: JavaSpring Boot: 选择2.7.x版本例如2.7.18。Spring Boot 3.x 需要JDK 17且与一些老版本库的兼容性需要额外处理为了减少复杂度我们选择更成熟的2.7.x。Group:com.exampleArtifact:dubbo-provider-demoPackaging: JarJava Version: 8 或 11依赖选择 在Dependencies搜索框中添加Spring Web(可选用于提供健康检查等HTTP端点)Apache Dubbo Spring Boot Starter。这里需要注意Spring Initializr可能不直接提供Dubbo的starter。我们可以先创建项目然后在pom.xml中手动添加依赖。3.2 配置POM.xml依赖创建好项目后打开pom.xml手动添加Dubbo和Zookeeper客户端依赖。这是核心步骤依赖不对一切白费。?xml version1.0 encodingUTF-8? project ... !-- 父工程信息 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent groupIdcom.example/groupId artifactIddubbo-provider-demo/artifactId version0.0.1-SNAPSHOT/version properties java.version11/java.version !-- 锁定Dubbo版本 -- dubbo.version2.7.23/dubbo.version !-- Zookeeper客户端版本需与服务器端兼容 -- zkclient.version0.11/zkclient.version curator.version5.5.0/curator.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency !-- Dubbo Spring Boot Starter -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId version${dubbo.version}/version /dependency !-- Dubbo依赖的Zookeeper客户端 -- !-- 使用Curator作为Zookeeper客户端框架这是Dubbo官方推荐和默认的 -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-dependencies-zookeeper/artifactId version${dubbo.version}/version typepom/type exclusions !-- 排除旧版本的Log4j避免与Spring Boot默认日志框架冲突 -- exclusion groupIdlog4j/groupId artifactIdlog4j/artifactId /exclusion /exclusions /dependency !-- 可选用于健康检查等 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project关键点解析我们引入了dubbo-dependencies-zookeeper这个依赖包它内部管理了Curator、Zookeeper客户端等一堆相关依赖的兼容版本。这比我们自己一个个去声明curator-framework,curator-recipes,zookeeper依赖要省心得多能最大程度避免版本冲突。排除了log4j是为了防止和Spring Boot默认的Logback日志框架冲突。这是一个常见的坑。3.3 定义服务接口在分布式系统中服务接口需要单独定义并且要被提供者和消费者共同依赖。通常我们会创建一个独立的api模块Maven Module来存放接口和DTO。为了Demo简单我们就在Provider项目中定义接口Consumer项目通过复制源码或依赖jar包的方式共享。在实际项目中务必使用独立的API模块。在Provider项目中创建接口package com.example.dubbo.api; public interface HelloService { String sayHello(String name); }3.4 实现服务接口创建接口的实现类这是业务逻辑所在。package com.example.dubbo.provider.service; import com.example.dubbo.api.HelloService; import org.apache.dubbo.config.annotation.DubboService; DubboService // 关键注解声明这是一个Dubbo服务会被注册到注册中心 public class HelloServiceImpl implements HelloService { Override public String sayHello(String name) { System.out.println(Provider received: name); return Hello, name ! (from Dubbo Provider); } }DubboService注解是Dubbo Spring Boot Starter提供的它包含了Service的功能暴露服务并且会自动处理服务注册等事宜。3.5 配置Provider的application.yml在src/main/resources/application.yml中配置Dubbo和注册中心。# 服务器端口如果引入了spring-boot-starter-web server: port: 8081 # Dubbo配置 dubbo: application: name: dubbo-provider-demo # 应用名用于在注册中心标识 qos-enable: false # 关闭Dubbo QOS服务避免端口冲突生产环境可按需开启 protocol: name: dubbo # 使用dubbo协议 port: 20880 # dubbo协议服务暴露的端口消费者通过这个端口调用 registry: address: zookeeper://127.0.0.1:2181 # 注册中心地址指向我们启动的Zookeeper scan: base-packages: com.example.dubbo.provider.service # 指定Dubbo服务实现类的扫描包路径 # Spring配置 spring: main: allow-bean-definition-overriding: true # 允许Bean定义覆盖防止某些情况下因Bean重复定义而启动失败配置项解读dubbo.application.name: 服务提供者的应用标识在注册中心里能看到。dubbo.protocol.port:非常重要这是Dubbo服务暴露的端口默认20880不是HTTP端口。消费者是通过这个端口进行RPC调用的。确保这个端口没有被防火墙屏蔽且未被其他进程占用。dubbo.registry.address: 注册中心地址。zookeeper://是协议头后面跟Zookeeper服务器的地址和端口。dubbo.scan.base-packages: 告诉Dubbo去哪里扫描带有DubboService注解的类。路径一定要写对否则服务无法发布。spring.main.allow-bean-definition-overriding: 这是一个保险配置。Dubbo和Spring在初始化Bean时有时会因为同名Bean导致冲突加上这个配置可以避免启动报错。3.6 启动Provider并验证编写主启动类package com.example.dubbo.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }启动ProviderApplication。观察控制台日志如果看到类似下面的信息说明服务发布成功[INFO] Export dubbo service com.example.dubbo.api.HelloService to local registry [INFO] Export dubbo service com.example.dubbo.api.HelloService to url dubbo://192.168.1.100:20880/com.example.dubbo.api.HelloService?anyhosttrueapplicationdubbo-provider-demobind.ip192.168.1.100bind.port20880defaulttruedeprecatedfalsedubbo2.0.2dynamictruegenericfalseinterfacecom.example.dubbo.api.HelloServicemethodssayHellopid12345release2.7.23sideprovider×tamp1649999999999 [INFO] Register dubbo service com.example.dubbo.api.HelloService url dubbo://192.168.1.100:20880/com.example.dubbo.api.HelloService?anyhosttrueapplicationdubbo-provider-demobind.ip192.168.1.100bind.port20880defaulttruedeprecatedfalsedubbo2.0.2dynamictruegenericfalseinterfacecom.example.dubbo.api.HelloServicemethodssayHellopid12345release2.7.23sideprovider×tamp1649999999999 to registry zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService更直观的验证方法是使用Zookeeper客户端工具。运行zkCli.sh或使用可视化工具如PrettyZoo连接localhost:2181。依次查看/dubbo、/dubbo/com.example.dubbo.api.HelloService、/providers节点你应该能看到刚刚注册的服务URL信息。如果能看到证明Provider已经成功在Zookeeper上注册。4. 创建Dubbo服务消费者Demo消费者Consumer从注册中心获取提供者地址并发起远程调用。4.1 创建消费者项目重复类似3.1的步骤创建一个新的Spring Boot项目命名为dubbo-consumer-demo。GroupId等可以与Provider相同也可以不同。4.2 配置POM.xml依赖消费者的pom.xml与提供者非常相似主要区别在于它不需要实现服务但需要依赖服务接口。由于我们把接口定义在了Provider项目里这里为了简单我们直接复制HelloService接口的代码到Consumer项目的相同包路径下。再次强调实际项目请使用独立的API模块Maven Module并通过依赖引入。消费者的pom.xml依赖部分与Provider几乎一致dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId !-- 消费者通常需要Web层来触发调用 -- /dependency dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId version${dubbo.version}/version /dependency dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-dependencies-zookeeper/artifactId version${dubbo.version}/version typepom/type exclusions exclusion groupIdlog4j/groupId artifactIdlog4j/artifactId /exclusion /exclusions /dependency /dependencies4.3 复制服务接口在Consumer项目的com.example.dubbo.api包下创建与Provider中完全相同的HelloService接口。包名和接口名必须完全一致这是Dubbo进行服务匹配的基础。4.4 配置Consumer的application.ymlserver: port: 8082 # 消费者自己的HTTP端口与Provider不同 dubbo: application: name: dubbo-consumer-demo qos-enable: false registry: address: zookeeper://127.0.0.1:2181 # 注册中心地址与Provider相同 consumer: check: false # 启动时不检查提供者是否可用。设为true时如果启动时没有提供者应用会启动失败。Demo环境建议false。 scan: base-packages: com.example.dubbo.consumer.controller # 扫描Reference注解的包路径 spring: main: allow-bean-definition-overriding: true关键配置dubbo.consumer.check:true: 在Spring容器启动时会检查所引用的服务是否在注册中心存在可用提供者。如果不存在会抛出异常导致应用启动失败。这适用于强依赖场景确保服务就绪。false: 启动时不检查即使没有提供者应用也能正常启动。当提供者上线后消费者能动态发现并调用。这在Demo、测试或提供者可能后启动的场景下很有用。4.5 编写消费者Controller进行调用创建一个Controller通过Dubbo的Reference注解注入远程服务代理。package com.example.dubbo.consumer.controller; import com.example.dubbo.api.HelloService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController public class HelloController { // Reference 注解用于注入远程服务代理 // 版本号(version)、负载均衡策略(loadbalance)等都可以在这里配置 Reference private HelloService helloService; GetMapping(/hello) public String sayHello(RequestParam String name) { // 像调用本地方法一样调用远程服务 String result helloService.sayHello(name); return Consumer received: result; } }Reference是Dubbo消费者端的核心注解。它会在Spring容器中创建一个指向远程HelloService实现的代理对象。当你调用helloService.sayHello()时这个代理对象会完成从注册中心查找服务地址、网络通信、序列化/反序列化等一系列复杂操作对你来说就像调用本地方法一样简单。4.6 启动Consumer并测试编写消费者的主启动类并运行。确保Provider应用也在运行中。启动成功后打开浏览器或使用Postman、curl等工具访问http://localhost:8082/hello?nameWorld你应该能看到返回结果Consumer received: Hello, World! (from Dubbo Provider)同时观察Provider应用的控制台会打印出Provider received: World至此一个完整的Dubbo服务调用链路就打通了。消费者通过HTTP接口触发内部通过Dubbo RPC调用了远在另一个JVM进程中的Provider服务并将结果返回。5. 核心原理与配置深度解析Demo跑通了但背后的原理和可配置项远不止这些。理解这些才能应对更复杂的场景。5.1 Dubbo服务暴露与订阅流程Provider启动Spring容器启动扫描到DubboService注解的Bean。Dubbo框架会为这个Bean创建一个ServiceBean。服务暴露ServiceBean在初始化后会执行export()方法。这个过程分为两步本地暴露在JVM内创建一个本地服务代理用于处理同一JVM内的本地调用Injvm协议提升性能。远程暴露将服务信息接口名、方法列表、服务器IP、端口号等封装成一个URL注册到配置的注册中心Zookeeper。这个URL就是你在Zookeeper节点里看到的那一串信息。Consumer启动扫描到Reference注解的字段。Dubbo为其创建一个ReferenceBean。服务订阅ReferenceBean初始化时会向注册中心订阅它所关心的服务接口如com.example.dubbo.api.HelloService。地址通知注册中心将当前可用的Provider地址列表推送给Consumer。Consumer端的Dubbo客户端如Netty Client会与这些Provider地址建立长连接。调用发生当Controller调用helloService.sayHello()时实际调用的是Dubbo生成的动态代理。代理从已建立的连接池中选择一个连接根据配置的负载均衡策略将调用信息序列化后发送给Provider。Provider处理Provider端的Netty Server收到请求反序列化后找到本地真正的HelloServiceImpl实例调用其方法再将结果序列化返回。Consumer接收结果Consumer端的代理收到响应反序列化后返回给Controller完成一次完整的RPC调用。5.2 关键配置项详解除了Demo中用到的Dubbo还有大量可配置参数用于控制超时、重试、容错、负载均衡等。服务提供者配置 (DubboService或application.yml):version: 服务版本。用于灰度发布、多版本共存。DubboService(version 1.0.0)timeout: 方法调用超时时间毫秒。DubboService(timeout 3000)retries: 失败重试次数不包含第一次调用。DubboService(retries 2)loadbalance: 负载均衡策略。可选random随机roundrobin轮询leastactive最少活跃调用consistenthash一致性哈希。cluster: 集群容错模式。可选failover失败自动切换failfast快速失败failsafe安全失败failback失败自动恢复forking并行调用broadcast广播调用。服务消费者配置 (Reference或application.yml):check: 启动时检查提供者是否存在。timeout/retries/loadbalance/cluster: 消费者端的配置优先级高于提供者端。这意味着你可以在消费者端覆盖提供者设置的超时时间等。async: 是否异步调用。如果为true调用会立即返回一个CompletableFuture。connections: 对单个提供者建立的长连接数量。用于提升高并发下的吞吐量。注册中心配置:address: 支持多个注册中心地址用逗号分隔实现多注册中心部署。address: zookeeper://127.0.0.1:2181,zookeeper://127.0.0.1:2182file: 本地缓存文件路径。Dubbo会将注册中心列表缓存到本地文件当注册中心全部挂掉时可以从本地文件读取提供者列表实现降级。registry.file${user.home}/dubbo-cache/${dubbo.application.name}.cache协议配置:name: 除了dubbo协议还支持hessian,http,webservice,thrift等。Dubbo协议性能最高。port: -1 表示随机端口。生产环境建议指定端口便于防火墙规则配置。serialization: 序列化方式。hessian2默认,java,json,kryo,protostuff等。Kryo和Protostuff性能更好但需要引入额外依赖。5.3 监控与管理Dubbo Admin在微服务体系中可视化的监控和管理界面必不可少。Dubbo生态提供了Dubbo Admin项目。获取Dubbo Admin可以从Dubbo的GitHub仓库下载最新版本的发行包或者自己从源码构建。它也是一个Spring Boot应用。配置与启动修改其application.properties将其注册中心地址指向同一个Zookeeper集群。然后启动。使用访问Dubbo Admin的Web界面默认端口8080你可以看到已注册的服务、提供者、消费者列表可以查看服务详情、进行服务测试、动态修改配置如权重、超时、进行服务治理如路由、限流、降级等。这对于生产环境的运维至关重要。6. 常见问题排查与实战技巧搭建和运行过程中你肯定会遇到各种问题。这里汇总一些典型问题的排查思路。6.1 服务找不到No provider available这是最常见的问题。消费者报错No provider available for the service ...排查链路检查注册中心首先确认Zookeeper是否真的在运行。用客户端工具连接看/dubbo节点是否存在其下是否有你的服务接口节点。检查Provider注册在Zookeeper中找到你的服务接口节点如/dubbo/com.example.dubbo.api.HelloService/providers看下面是否有子节点URL。如果没有说明Provider没有注册成功。Provider日志检查Provider启动日志搜索Export dubbo service和Register dubbo service关键字看是否有成功日志和错误信息。配置检查确认application.yml中dubbo.registry.address和dubbo.scan.base-packages配置正确。包路径错误是导致扫描不到DubboService的常见原因。检查Consumer订阅在Zookeeper中查看服务接口节点的consumers目录看是否有Consumer的URL。如果没有说明Consumer没有成功订阅。Consumer日志检查Consumer启动日志搜索Subscribe关键字。配置与注解检查确认Consumer的application.yml中注册中心地址正确并且Reference注解注入的接口包名、类名与Provider完全一致。Reference默认按接口类型注入要确保Spring能扫描到这个字段所在的类如Controller。网络与防火墙确认Provider和Consumer所在的机器/容器之间以及它们与Zookeeper之间的网络是通的。特别是Provider暴露的dubbo.protocol.port默认20880和Zookeeper的clientPort默认2181需要在防火墙中放行。版本与Group检查Provider和Consumer的version和group属性是否匹配。DubboService(grouptest, version1.0)的服务需要Reference(grouptest, version1.0)才能引用。不指定则使用默认值。6.2 调用超时Timeout错误信息Invoke remote method timeout.调整超时时间默认超时是1000毫秒。对于耗时较长的服务需要在Provider或Consumer端增加timeout配置。建议在Provider端设置一个合理的默认超时在Consumer端可根据业务特性覆盖。检查性能瓶颈在Provider端方法内打日志计算实际执行时间。可能是数据库查询慢、调用外部接口慢、或内部逻辑复杂。检查线程池Dubbo服务端默认使用固定大小线程池处理请求。如果并发请求数超过线程池大小请求会排队导致等待超时。可以在Provider端配置dubbo.protocol.threads或dubbo.protocol.threadpool来调整。GC停顿观察Provider的GC日志看是否有长时间的Full GC导致所有线程暂停无法处理请求。6.3 序列化/反序列化错误错误信息可能包含Serialization,Hessian,IOException等关键字。实体类一致性确保在Provider和Consumer两端RPC接口中涉及的所有自定义DTO类参数、返回值的全限定名、字段类型、字段顺序完全一致。即使包结构相同如果Consumer端的类缺少某个字段也可能导致反序列化失败。这是使用Dubbo等RPC框架时的一个严格约束。序列化方式确认两端使用的序列化协议一致。默认是hessian2。如果有一端显式配置了其他协议如kryo另一端也必须支持。无参构造函数自定义DTO类必须有无参构造函数可以是默认的因为序列化框架需要通过反射创建对象实例。6.4 优雅停机与流量感知在线上环境直接Kill -9进程会导致正在处理的请求失败。Dubbo支持优雅停机。Provider端当Spring容器关闭时Dubbo会先取消服务注册等待一段时间默认10秒让注册中心将下线的消息通知给所有消费者。然后继续处理已接收的请求但不再接收新的请求。处理完毕后再关闭网络连接和线程池。可以通过dubbo.service.shutdown.wait配置等待时间。Consumer端在关闭时不再发起新的远程调用并等待已发起的调用返回。最佳实践在Kubernetes或Docker环境中结合preStop钩子先发送SIGTERM信号触发Spring Boot的优雅停机等待一段时间后再强制终止容器。6.5 将接口模块独立Maven多模块Demo中我们复制了接口代码这在实际项目中是不可维护的。正确做法是创建Maven多模块项目dubbo-demo-project ├── dubbo-api // 接口与DTO模块打包为jar ├── dubbo-provider // 服务提供者依赖dubbo-api └── dubbo-consumer // 服务消费者依赖dubbo-api在dubbo-api模块的pom.xml中只定义接口和简单的DTO不要引入Dubbo或Spring Boot的依赖保持其纯净。Provider和Consumer模块通过Maven依赖引入dubbo-api模块。这样接口变更只需在dubbo-api中修改一次由Maven管理版本和依赖传递。搭建这个Demo环境就像是分布式服务化的“Hello World”它把注册中心、服务提供者、服务消费者这三个核心角色串了起来。我个人的体会是初期搭建时百分之九十的问题都出在版本兼容、配置错误和网络环境上。所以严格按照稳定版本组合来仔细核对每一个配置项学会看日志和利用Zookeeper客户端工具观察服务状态这三个习惯能帮你省下大量排查时间。当这个简单的调用链路跑通后你再去看负载均衡、集群容错、服务降级这些高级特性就会觉得有扎实的根基理解起来也顺畅多了。
返回列表