微服务调用
一、微服务调用服务之间通过网络互相请求数据、执行逻辑完成完整业务。1. 微服务调用规范上层调用下层禁止下层调用上层同步调用保持简单异步调用解耦必须熔断、降级、限流防止雪崩禁止循环调用底层通知上层用 MQ调用必须带日志、链路追踪2. 两种调用方式1)同步调用实时、直接一边发请求一边等返回实时性强会阻塞、会耦合场景查询、下单、支付校验。主流技术OpenFeign企业首选2)异步调用不等待、解耦发消息到 MQ不等待结果解耦、高可用、不阻塞场景通知、日志、更新、后续流程。主流技术RabbitMQ / RocketMQ / Kafka3. 微服务的调用方式1)OpenFeign—— 最主流、企业首选声明式调用像调用本地方法一样调用远程服务。FeignClient(name stock-service) public interface StockClient { GetMapping(/stock/deduct) Result deduct(); }2)RestTemplate—— 传统方式restTemplate.getForObject(http://stock-service/stock/deduct, String.class);二、微服务调用顺序1. 正常调用顺序上层调用下层基础服务不调用业务服务同步按流程异步解耦。2. 特殊情况底层调用上层如库存更新了 → 想通知订单服务商品变价了 → 想通知购物车服务解决方案1) 事件驱动 MQ 消息最推荐、最标准流程① 底层服务库存 / 商品只发消息不调用任何人② 上层服务订单 / 购物车监听消息自己处理③ 完全无依赖、无调用、无耦合优点无依赖、无循环调用、不阻塞、不雪崩、架构最健康2) 抽取公共服务消除双向依赖如果 A 和 B 互相需要抽一个公共服务 C。如订单服务和库存服务中的公共服务部分 公共逻辑、状态、数据可以抽出作为公共服务3) 上层主动轮询 / 拉取简单场景上层定时调用下层获取状态下层不回调上层。三、常见问题1.服务雪崩一个服务挂 → 调用方也挂 → 全部崩溃。解决方案熔断 ——Sentinel、Hystrix降级兜底方案保证系统的可用性限流Sentinel超时控制快速失败释放线程隔离如给每个服务调用分配独立线程池2. 服务调用超时网络波动导致调用失败。超时原因下游服务响应慢、卡顿、死锁数据库慢查询、IO 阻塞网络延迟、抖动线程池满、资源耗尽调用链太长一环慢全链超时解决方案设置合理的超时时间最基础、必须做超时次数过多 →自动熔断不继续调用防止拖死调用方异步化 异步调用解耦不阻塞用MQ、事件驱动削峰、解耦、不等待响应超时重试注意保证接口幂等性服务隔离 线程池隔离3. 分布式事务数据不一致现象多服务分步操作某一步失败前面已经提交数据无法回滚。解决方案强一致Seata AT/TCC最终一致本地消息表、可靠消息 MQ、最大努力通知。