第三篇:从零搭建 Spring Boot 3 + Dubbo 3 + ZooKeeper 微服务实战 -- 消费者 模块
创建 dubbo-consumer 模块服务消费者Consumer 通过 ZooKeeper 发现 Provider发起 RPC 调用并通过 REST 接口将结果暴露给前端或外部系统。5.1pom.xml与 Provider 模块的依赖基本一致。dubbo-consumer/pom.xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdcom.example/groupId artifactIddubbo-demo/artifactId version1.0.0/version relativePath../pom.xml/relativePath /parent artifactIddubbo-consumer/artifactId namedubbo-consumer/name descriptionDubbo 服务消费者 — 通过 REST 接口演示 RPC 调用、版本路由和负载均衡/description dependencies !-- 本项目 API -- dependency groupIdcom.example/groupId artifactIddubbo-api/artifactId /dependency !-- Spring Boot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Dubbo Spring Boot Starter -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId /dependency !-- Dubbo ZooKeeperCurator 5 -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-zookeeper-curator5-spring-boot-starter/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project5.2application.ymldubbo-consumer/src/main/resources/application.yml# # Dubbo Consumer 配置 # server: port: 8082 spring: application: name: dubbo-consumer # --- Dubbo 配置 --- dubbo: application: name: dubbo-consumer serialize-check-status: WARN protocol: name: dubbo port: -1 # consumer 不暴露 Dubbo 端口设为 -1 registry: # ⚠️ 修改为你的 ZooKeeper 地址 address: zookeeper://192.168.0.100:2181 timeout: 10000 consumer: timeout: 5000 retries: 2 check: false # 启动时不检查 provider 是否就绪方便调试 # 日志级别 logging: level: org.apache.dubbo: INFO com.example.dubbo: DEBUG与 Provider 配置的关键区别dubbo.protocol.port: -1Consumer 不需要暴露 Dubbo 端口它只调用别人不被别人调用设为-1表示不监听。dubbo.consumer.check: false启动时不强制检查 Provider 是否在线。设为false后即使 Provider 还没启动Consumer 也能正常启动调用时再去发现服务。这在开发调试时很方便。5.3启动类dubbo-consumer/src/main/java/com/example/dubbo/consumer/ConsumerApplication.javapackage com.example.dubbo.consumer; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * Dubbo Consumer 启动类。 */ SpringBootApplication EnableDubbo public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); System.out.println( Dubbo Consumer 启动成功 ); } }5.4 UserControllerREST 接口 RPC 调用这是本项目最核心的消费端代码演示了如何通过DubboReference注入远程服务并调用。dubbo-consumer/src/main/java/com/example/dubbo/consumer/controller/UserController.javapackage com.example.dubbo.consumer.controller; import com.example.dubbo.api.UserService; import com.example.dubbo.api.model.User; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * REST 控制器 — 演示如何通过 DubboReference 消费远程服务。 * * version 引入哪个版本的 UserService ,引用任意版本version* * * loadbalance(Provider 提供者 有多个机器时决定调哪台机器) 采用的负载均衡算法 * 策略名 说明 适用场景 * random 随机默认 机器性能均衡请求量均匀 * roundrobin 轮询 需要均匀分配请求 * leastactive 最少活跃调用数 处理耗时差异大的场景 * consistenthash 一致性哈希 需要相同参数落到同一台机器 * shortestresponse 最短响应时间 机器性能差异大优先调快的 */ RestController RequestMapping(/user) public class UserController { DubboReference(version 1.0, loadbalance roundrobin) private UserService userServiceAny; /** * 连续调用 N 次返回每次的结果 * 便于观察请求在 v1/v2 之间的分布。 */ GetMapping(/lb-test) public MapString, Object loadBalanceTest(RequestParam(value times, defaultValue 10) int times) { MapString, Object result new HashMap(); int v1Count 0, v2Count 0; for (int i 0; i times; i) { ListUser users userServiceAny.listAll(); if (users ! null users.size()4) { v2Count; } else { v1Count; } } result.put(totalCalls, times); result.put(v1Count, v1Count); result.put(v2Count, v2Count); result.put(v1Percent, String.format(%.1f%%, v1Count * 100.0 / times)); result.put(v2Percent, String.format(%.1f%%, v2Count * 100.0 / times)); return result; } }DubboReference详解version 1.0精确引用 v1.0 版本的 UserService。如果改为version *则会随机路由到任意版本v1 或 v2用于演示通配路由。loadbalance roundrobinConsumer 端指定的负载均衡策略优先级高于 Provider 端的建议值。Dubbo 负载均衡策略速查表策略名说明适用场景random随机默认机器性能均衡roundrobin轮询均匀分配请求leastactive最少活跃调用数处理耗时差异大consistenthash一致性哈希相同参数落同一台机器shortestresponse最短响应时间机器性能差异大
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416570.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!