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

Spring Cloud构建微服务架构:服务消费者


🎈 选型

方式类型协议是否声明式负载均衡注册中心集成适用场景
LoadBalancerClient底层 APIHTTP✅(手动选实例)需精细控制选例逻辑
RestTemplate(Ribbon)模板类HTTP✅(自动)简单 HTTP 调用(已不推荐新项目使用
@FeignClient声明式客户端HTTP✅(自动)接口化开发、HTTP 服务间调用
@DubboReferenceRPC 代理TCP(二进制)✅(自动)高性能、低延迟、强一致内部调用

一句话选型建议

  • 写 REST API → 选@FeignClient
  • 写核心链路/高并发内部服务 → 选@DubboReference
  • 学原理或特殊调度 → 用LoadBalancerClient
  • RestTemplate + Ribbon仅用于兼容老系统。

🎈 使用LoadBalancerClient


1、服务端和客户端配置

--**服务端`application.yml`**(以`user-service` 为例):spring:application:name:user-serviceserver:port:8081# 若对接 Eureka(推荐)eureka:client:service-url:defaultZone:http://localhost:8761/eureka/--**客户端`application.yml`**(调用方):spring:application:name:order-serviceserver:port:8080# 同样注册到同一注册中心(如 Eureka),才能发现 user-serviceeureka:client:service-url:defaultZone:http://localhost:8761/eureka/

2、服务端代码

@RestController@RequestMapping("/api")publicclassUserController{@GetMapping("/user/{id}")publicMap<String,Object>getUser(@PathVariableLongid){returnMap.of("id",id,"name","Charlie","age",28,"timestamp",System.currentTimeMillis());}}

3、客户端代码

@ServicepublicclassUserService{privatefinalLoadBalancerClientloadBalancerClient;privatefinalRestTemplaterestTemplate;publicUserService(LoadBalancerClientloadBalancerClient,RestTemplaterestTemplate){this.loadBalancerClient=loadBalancerClient;this.restTemplate=restTemplate;}publicMap<String,Object>fetchUser(Longid){// ① 通过服务名获取一个可用实例ServiceInstanceinstance=loadBalancerClient.choose("user-service");if(instance==null){thrownewIllegalStateException("No instances available for user-service");}// ② 拼接完整请求 URL(http://host:port/path)Stringurl=String.format("http://%s:%d/api/user/%d",instance.getHost(),instance.getPort(),id);// ③ 发起同步 HTTP GET 请求returnrestTemplate.getForObject(url,Map.class);}}@ConfigurationpublicclassRestTemplateConfig{@BeanpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}

🎈使用RestTemplate(Ribbon版)


1、服务端和客户端配置

--**服务端`application.yml`**(`user-service`,注册到Eureka):spring:application:name:user-serviceserver:port:8081eureka:client:service-url:defaultZone:http://localhost:8761/eureka/instance:prefer-ip-address:true--**客户端`application.yml`**(`d-eureka-consumer-ribbon`):spring:application:name:d-eureka-consumer-ribbonserver:port:8080eureka:client:service-url:defaultZone:http://localhost:8761/eureka/

2、服务端代码

@RestController@RequestMapping("/api")publicclassUserController{@GetMapping("/user/{id}")publicMap<String,Object>getUser(@PathVariableLongid){returnMap.of("id",id,"name","David","age",32,"from","d-eureka-consumer-ribbon demo");}}

3、客户端代码

💡 原理说明:@LoadBalanced使RestTemplateRibbonInterceptor拦截,将http://user-service/...中的user-service解析为 Eureka 中注册的多个实例,并按IRule(如RoundRobinRule)选择一个发起真实 HTTP 请求。

@ConfigurationpublicclassRestTemplateConfig{@Bean@LoadBalanced// 关键:开启 Ribbon 负载均衡拦截publicRestTemplaterestTemplate(){returnnewRestTemplate();}}@ServicepublicclassUserService{privatefinalRestTemplaterestTemplate;publicUserService(RestTemplaterestTemplate){this.restTemplate=restTemplate;}publicMap<String,Object>fetchUser(Longid){// ✅ 直接使用服务名 "user-service"(非 IP),Ribbon 自动解析并负载均衡Stringurl="http://user-service/api/user/{id}";returnrestTemplate.getForObject(url,Map.class,id);}}@RestController@RequestMapping("/consumer")publicclassConsumerController{privatefinalUserServiceuserService;publicConsumerController(UserServiceuserService){this.userService=userService;}@GetMapping("/user/{id}")publicMap<String,Object>getUser(@PathVariableLongid){returnuserService.fetchUser(id);}}

🎈使用@FeignClient(Feign版)


1、服务端和客户端配置

--**服务端`application.yml`**(同前,`user-service`):spring:application:name:user-serviceserver:port:8081eureka:client:service-url:defaultZone:http://localhost:8761/eureka/instance:prefer-ip-address:true--**客户端`application.yml`**(`d-eureka-consumer-feign`):spring:application:name:d-eureka-consumer-feignserver:port:8080eureka:client:service-url:defaultZone:http://localhost:8761/eureka/

2、服务端代码

@RestController@RequestMapping("/api")publicclassUserController{@GetMapping("/user/{id}")publicMap<String,Object>getUser(@PathVariableLongid){returnMap.of("id",id,"name","Eve","age",27,"from","d-eureka-consumer-feign demo");}}

3、客户端代码

💡 原理说明:@FeignClient接口在运行时被动态代理,Feign 自动整合 Ribbon(旧版)或 Spring Cloud LoadBalancer(新版)实现服务发现 + 负载均衡,并通过Contract解析@GetMapping@PathVariable等注解生成 HTTP 请求。

@SpringBootApplication@EnableFeignClients// ← 必须添加!扫描 @FeignClient 接口@EnableDiscoveryClientpublicclassDEurekaConsumerFeignApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DEurekaConsumerFeignApplication.class,args);}}@FeignClient(name="user-service")// ← 服务名,自动从 Eureka 查找publicinterfaceUserClient{@GetMapping("/api/user/{id}")Map<String,Object>getUser(@PathVariable("id")Longid);}@ServicepublicclassUserService{privatefinalUserClientuserClient;publicUserService(UserClientuserClient){this.userClient=userClient;}publicMap<String,Object>fetchUser(Longid){returnuserClient.getUser(id);// ← 一行代码完成远程调用!}}@RestController@RequestMapping("/consumer")publicclassConsumerController{privatefinalUserServiceuserService;publicConsumerController(UserServiceuserService){this.userService=userService;}@GetMapping("/user/{id}")publicMap<String,Object>getUser(@PathVariableLongid){returnuserService.fetchUser(id);}}

🎈使用@DubboReference(Dubbo版)


1、服务端和客户端配置

**服务端`application.yml`**(`user-service-dubbo-nacos`):spring:application:name:user-service-dubbo-nacoscloud:nacos:discovery:server-addr:localhost:8848# ← Nacos 服务地址dubbo:protocol:name:dubboport:20880registry:address:nacos://localhost:8848# ← 关键:Nacos 协议注册中心scan:base-packages:com.example.demo.service.implserver:port:8081--**客户端`application.yml`**(`dubbo-consumer-nacos`):spring:application:name:dubbo-consumer-nacoscloud:nacos:discovery:server-addr:localhost:8848dubbo:registry:address:nacos://localhost:8848# ← 同样使用 nacos:// 协议server:port:8080

✅ 前提:本地启动 Nacos Server(https://nacos.io),默认地址http://localhost:8848,账号密码均为nacos


2、服务端代码

--**服务接口(共享)**// com.example.demo.service.UserService.javapublicinterfaceUserService{Map<String,Object>getUser(Longid);}--**服务实现类(`@DubboService`+自动注册到Nacos**importorg.apache.dubbo.config.annotation.DubboService;importorg.springframework.stereotype.Service;@DubboService// ← 自动向 Nacos 注册为 dubbo 服务(含接口名、版本、分组等元数据)publicclassUserServiceImplimplementsUserService{@OverridepublicMap<String,Object>getUser(Longid){returnMap.of("id",id,"name","Grace","age",29,"registry","nacos","timestamp",System.currentTimeMillis());}}

✅ 启动后,服务将注册到 Nacos 控制台【服务管理】→providers:com.example.demo.service.UserService,支持健康检查与元数据展示。


3、客户端代码

--**消费方注入(`@DubboReference`,自动从Nacos发现)**importorg.apache.dubbo.config.annotation.DubboReference;importorg.springframework.stereotype.Service;@ServicepublicclassUserService{// ← 关键:Dubbo 自动从 Nacos 拉取 provider 列表,创建 RPC 代理// 如果 不能直接引入,需要定义完全一样的@DubboReferenceprivatecom.example.demo.service.UserServiceuserService;publicMap<String,Object>fetchUser(Longid){returnuserService.getUser(id);// ← 无感知远程调用(非 HTTP,是高性能 RPC)}}--**Controller示例(可选)**@RestController@RequestMapping("/consumer")publicclassConsumerController{privatefinalUserServiceuserService;publicConsumerController(UserServiceuserService){this.userService=userService;}@GetMapping("/user/{id}")publicMap<String,Object>getUser(@PathVariableLongid){returnuserService.fetchUser(id);}}

💡 补充说明:Dubbo 通过NacosServiceDiscovery与 Nacos 交互;服务发现采用长轮询 + 缓存机制,支持秒级故障剔除;默认负载均衡策略为RandomLoadBalance


http://www.gsyq.cn/news/1358242.html

相关文章:

  • 超聚变冲刺创业板:年营收582亿,净利10亿 拟募资80亿,估值超400亿
  • 深度学习分段逼近实战:激活函数硬件友好型实现指南
  • 告别试错!用Ansys DesignXplorer的响应面技术,5步搞定产品性能优化
  • Burp Suite跨平台安装适配:Java环境校验与AI驱动的落地方案
  • 2026年5月百达翡丽官方售后升级公告|全国服务热线及门店地址更新公示 - 资讯纵览
  • 2026年北京迷你仓自助仓储怎么选?行业标准起草单位、地铁官方服务商、零差评品牌深度横评 - 优质企业观察收录
  • unidbg动态调试X-Gorgon签名生成原理与实战
  • 2026年北京迷你仓、自助仓储、智能寄存柜服务商深度横评与官方联系指南 - 优质企业观察收录
  • 手写决策树:从熵与基尼到软分割和KS驱动分裂
  • CANoe LIN压力测试避坑指南:为什么你的Disturbance Block干扰不生效?从波形图找答案
  • 写综述如何避免重复率过高?
  • unplugin-dts性能优化:提升TypeScript编译速度的7个方法
  • 2026广州债权债务催收律所服务TOP4推荐 企业欠款清收维权优选榜单 - 速递信息
  • Amphenol ICC ND9ACC2E0A线束组件应用解析与国产兼容思路
  • STM32开发新选择:TrueSTUDIO 9.0免费专业版功能全解析与迁移指南
  • Super IO:Blender批量导入导出终极指南,工作效率提升300%
  • 告别图片加载慢!手把手教你用AVIF格式为网站提速(附在线转换工具推荐)
  • 高性价比软文发稿投放策略中小企业精准控预算高效营销指南
  • 【分享】介绍 Rootkit 技术矩阵及指南更新
  • 量子纠错码原理与容错阈值技术解析
  • MockIt终极教程:10个高效创建模拟API端点的实用技巧
  • 2026年镇江黄金回收门店推荐,品质之选尽在其中 - 黄金上门回收
  • 【docker系列】安装docker和docker-compose
  • 山东一卡通闲置处理三大回收方案,高效的路径 - 京回收小程序
  • AI时代软文内容创作营销专业平台打造适配智能收录新方案
  • 多账号矩阵运营进入深水区:2026年从业者正在面对的五个真实问题
  • 2026广州企业劳动纠纷处理律所服务TOP4推荐|企业用工合规与劳资应诉指南 - 速递信息
  • 国内紧缺四大热门专业,月薪普遍破万,毕业就业不用愁
  • 2026年温州黄金回收门店推荐,品质之选尽在其中 - 黄金上门回收
  • 3步解决Mac NTFS读写难题:Nigate开源工具让跨平台文件交换畅通无阻