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

微服务通信

第一部分:微服务通信

微服务通信主要分为两大类:同步通信 和 异步通信

一、同步通信 (Synchronous Communication)

同步通信模式下,客户端发送请求后会阻塞等待,直到收到服务端的响应。这是一种紧耦合的交互方式。

实现方式:

  1. REST (Representational State Transfer)

    • 原理: 基于 HTTP/HTTPS 协议,使用标准的 HTTP 方法(GET, POST, PUT, DELETE)来操作资源。通常使用 JSON 或 XML 作为数据交换格式。

    • Java 实现

      • Spring Cloud OpenFeign: 声明式的 REST 客户端。你只需要定义一个接口并用注解修饰,Feign 会自动帮你处理 HTTP 请求和响应编解码。

        @FeignClient(name = "user-service") // 指定服务名
        public interface UserServiceClient {@GetMapping("/users/{id}") // 映射远端APIUser getUserById(@PathVariable("id") Long id);
        }
        // 使用时,直接@Autowired注入UserServiceClient即可调用
      • RestTemplate (已逐步被淘汰,由WebClient取代): Spring 提供的用于同步 HTTP 请求的模板类。

      • WebClient (Spring 5+ 推荐): 响应式、非阻塞的同步/异步HTTP客户端,性能优于RestTemplate。

  2. RPC (Remote Procedure Call)

    • 原理: 像调用本地方法一样调用远程服务。RPC 框架会隐藏底层的网络通信、序列化等复杂细节。

    • Java 实现

      • gRPC (Google): 高性能、开源、通用的 RPC 框架,基于 HTTP/2 和 Protocol Buffers (protobuf)。性能极高,尤其适合服务间的内部通信。

      • Apache Dubbo (阿里): 高性能的 Java RPC 框架,后融入 Spring Cloud 生态成为 Spring Cloud Alibaba 套件的一部分。

      • Thrift (Apache): 与 gRPC 类似,也是一个跨语言的 RPC 框架。

同步通信适用场景:

  • 需要立即得到结果的操作。例如:查询用户信息、下单时验证库存、支付确认等。

  • 客户端逻辑严重依赖于服务端的即时响应。

同步通信缺点:

  • 可用性降低: 如果服务提供者宕机或响应缓慢,消费者也会被拖垮(可能导致雪崩效应)。

  • 耦合性高: 消费者必须知道提供者的具体端点(URL或接口)。

  • 性能瓶颈: 大量阻塞等待会占用线程资源,影响系统吞吐量。


二、异步通信 (Asynchronous Communication)

异步通信模式下,客户端发送请求后不会等待响应,而是继续执行后续操作。服务端处理完成后,可以通过回调或通知的方式告知客户端。这是一种松耦合的交互方式。

实现方式:

  1. 消息队列 (Message Queue) / 消息代理 (Message Broker)

    • 原理: 服务A(生产者)将消息发送到消息中间件,服务B(消费者)从中间件订阅并消费消息。双方无需同时在线,也无需知道彼此的存在。

    • Java 实现

      • Spring Cloud Stream: 一个用于构建消息驱动微服务的框架,它抽象了底层的消息中间件(如 RabbitMQ, Kafka),让代码与特定MQ解耦。

      • 直接使用客户端:

        • RabbitMQ: 使用 spring-boot-starter-amqp 和 RabbitTemplate

        • Apache Kafka: 使用 spring-kafka 和 KafkaTemplate

    • 模式

      • 点对点 (Point-to-Point): 一个消息只能被一个消费者消费。例如:订单处理。

      • 发布/订阅 (Pub/Sub): 一个消息可以被多个消费者消费。例如:订单成功消息同时通知库存系统、积分系统、物流系统。

  2. 事件驱动 (Event-Driven)

    • 原理: 服务在完成某项操作后,会发布一个事件到事件总线(通常是消息队列)。其他服务订阅感兴趣的事件,并做出相应的反应。事件代表“某事已经发生”(如 OrderCreatedEvent),而不是一个命令(如 CreateOrderCommand)。

    • 实现: 通常与消息队列结合使用,是一种架构风格。

异步通信适用场景:

  • 耗时操作: 如发送邮件、生成报表、处理视频转码。

  • 流量削峰: 应对突发流量,消息队列可以起到缓冲作用。

  • 系统解耦: 服务间通过消息通信,无需相互感知。

  • 最终一致性: 在分布式事务场景下,通过事件驱动实现数据的最终一致性(如 Saga 模式)。

异步通信缺点:

  • 架构复杂性: 需要引入和维护消息中间件。

  • 延迟性: 无法立即得到结果,只能通过回调或查询获取最终状态。

  • 消息可靠性: 需要处理消息丢失、重复消费、顺序等问题。


第二部分:高频面试题补充

  1. 如何保证微服务间的数据一致性?(分布式事务)

    • : 放弃强一致性,采用最终一致性。常用模式有:

      • Saga 模式: 将一个分布式事务拆分为多个本地事务,每个事务都有对应的补偿操作(Compensating Transaction)。如果某个步骤失败,则按顺序执行补偿操作来回滚。

      • TCC (Try-Confirm-Cancel): 两阶段提交的业务版。针对每个操作,都需要实现 Try(预留资源)、Confirm(确认操作)、Cancel(取消操作)三个方法。

      • 基于消息的最终一致性: 利用消息队列和本地事务表,保证业务操作和消息发送的原子性(如先业务落库,再消息落库,通过定时任务扫描本地消息表发送消息)。

  2. 服务调用超时或失败怎么办?(服务容错)

    • : 使用 Spring Cloud Netflix Hystrix 或 Spring Cloud Alibaba Sentinel 实现服务容错。

      • 熔断 (Circuit Breaker): 当失败率达到阈值,熔断器打开,后续请求直接快速失败,不再调用远端服务。隔一段时间后进入半开状态,尝试恢复。

      • 降级 (Fallback): 当服务调用失败(超时、异常、熔断)时,提供一个备选方案(如返回默认值、缓存数据),保证主线业务可用。

      • 限流 (Rate Limiting): 控制每秒的请求数,防止服务被突发流量冲垮。

  3. 服务A如何发现和服务B的实例?(服务发现)

    • : 服务实例启动后将自己的地址(IP和端口)注册到一个中心化的服务注册中心。消费者通过查询注册中心来获取提供者的可用实例列表并进行调用。

      • 常用组件: Nacos (推荐)、Eureka、Consul、Zookeeper。

      • 流程: 服务提供者 -> 注册到注册中心;服务消费者 -> 从注册中心拉取列表 -> 通过负载均衡器(如Ribbon/LoadBalancer)选择一个实例 -> 发起调用。

  4. REST 和 RPC (如gRPC) 有什么区别?如何选型?

    • 特性RESTRPC (gRPC)
      协议HTTP/1.1 (文本)HTTP/2 (二进制)
      性能较低(文本序列化,HTTP/1.1)极高(二进制序列化,多路复用)
      契约松耦合,自描述(Swagger/OpenAPI)强耦合,需定义 .proto 文件
      灵活性高,与语言无关高,支持多语言,但需生成代码
      可读性高(JSON可读)低(二进制不可读)
      适用场景对外部开放API,需要易用性内部服务间,追求极致性能
  5. 如何保证微服务通信的安全性?

      • 认证 (Authentication): 验证调用方身份。常用 JWT (JSON Web Token) 或 OAuth 2.0。API网关可以作为统一的认证入口。

      • 授权 (Authorization): 验证调用方是否有权限访问该资源。可以在网关或微服务内部进行权限校验。

      • 传输安全: 使用 HTTPS 对通信链路进行加密。

      • 网络安全: 使用白名单、安全组等措施限制不必要的网络访问。

  6. Kafka 和 RabbitMQ 在微服务通信中如何选择?

      • RabbitMQ: 更适合业务逻辑处理企业级应用。它提供了灵活的路由规则(Exchange)、消息确认、重试等机制,保证消息的可靠投递。

      • Kafka: 更适合大数据流处理日志收集高吞吐量的场景。它以高吞吐、持久化、水平扩展著称,但消息路由功能相对简单。

总结与面试技巧

当面试官问到“微服务通信如何实现”时,一个出色的回答应该包括:

  1. 分类阐述: 清晰地指出同步和异步两种模式。

  2. 列举技术: 对每种模式,说出至少两种主流技术(如REST/gRPC, RabbitMQ/Kafka)。

  3. 对比优缺点: 简要说明每种技术的适用场景和缺点。

  4. 结合实际: 如果能结合你之前项目的实际场景(如“我们在XX项目中,因为需要处理支付这种即时操作,所以用了Feign进行同步调用;而为了解耦和削峰,发货通知用的是RabbitMQ”),会大大加分。

  5. 引出关联知识: 主动提到由此引发的服务发现、容错、安全等问题的解决方案,展示你的知识体系完整性。

希望这份详细的解释和问题清单能帮助你顺利通过面试!


文章转载自:

http://xrZfZk5c.thjqk.cn
http://zc31qt0F.thjqk.cn
http://mljnc1Kf.thjqk.cn
http://t2Em67FD.thjqk.cn
http://JjRAEvn8.thjqk.cn
http://b0LjuZ7o.thjqk.cn
http://SlzthrE8.thjqk.cn
http://iXztybKt.thjqk.cn
http://ddDlCCGt.thjqk.cn
http://ozjbEL21.thjqk.cn
http://85FUoP5f.thjqk.cn
http://wq4J5qUR.thjqk.cn
http://NjpJUgJY.thjqk.cn
http://b4Igk1yR.thjqk.cn
http://irXi1e2P.thjqk.cn
http://cRfAE9pW.thjqk.cn
http://fGaf4LB6.thjqk.cn
http://sbAxdjAj.thjqk.cn
http://MVVY4iXQ.thjqk.cn
http://lSxVqga5.thjqk.cn
http://ZI2QmXVJ.thjqk.cn
http://QA1oiHJp.thjqk.cn
http://iRv2sdKN.thjqk.cn
http://TBmXqWIS.thjqk.cn
http://01WTDptx.thjqk.cn
http://FAuE2fAM.thjqk.cn
http://jsGGJAOn.thjqk.cn
http://e8HFiAqV.thjqk.cn
http://gEUHFlOE.thjqk.cn
http://BFBI0BEj.thjqk.cn
http://www.dtcms.com/a/387304.html

相关文章:

  • 重定向、命令行判断、管道、正则三剑客
  • 破垄断!东土科技与海光信息联合发布全国产化工控系统,筑牢工业安全新底座
  • 一场史诗级的冒险——Docker命令大航海!
  • 基于 Node.js 的后端框架:NestJS 和 Express(二)
  • 大数据时代时序数据库选型指南:为何Apache IoTDB成优选——从技术架构与行业实践深度剖析
  • HBase 实战:3 步掌握基于 Rowkey 的数据更新技巧
  • 【Android】Jetpack Media3 播放音频文件
  • 算法 --- 队列 + 宽搜(BFS)
  • 苹果手机怎么导出App数据目录,iOS文件管理、应用沙盒访问、日志缓存导出与性能调试实战(uni-app开发者指南)
  • Java 设计模式——策略模式:从 3 种写法到 SpringBoot 进阶
  • JVM:性能调优的理解
  • AR眼镜在巡检业务中的软件架构设计|阿法龙XR云平台
  • 活动预告 | Paraverse × Unity:Unity云XR串流——突破设备与平台限制
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(5、猴子拿桃)
  • 二维码辅助回桩之二维码识别
  • Mojo vs Python vs Rust,2025年搞AI,怎么学
  • 从软件工程角度谈企业管理
  • 【C语言】C 语言自定义类型:联合与枚举的基础解析
  • 模型部署:(五)安卓端部署Yolov8关键点检测项目全流程记录
  • 在业务应用中集成 go-commons,实现应用+系统双指标监控
  • ESP32-C3四种工作模式
  • ReactNative中实现可拖拽的温度计组件
  • react snippets
  • 基于Matlab高低频混合建模的大气湍流相位屏生成算法
  • 2025年8月SCI-袋鼠逃生优化算法Kangaroo Escape Optimizer-附Matlab免费代码
  • Node.js 创建 TCP 服务
  • 关于鸿蒙配置HMRouter的问题,比如白屏等
  • 为什么 socket.io 客户端在浏览器能连接服务器但在 Node.js 中报错 transport close?
  • Express框架介绍(基于Node.js的轻量级、灵活的Web应用框架)
  • Lustre Ceph GlusterFS NAS 需要挂载在k8s容器上,数据量少,选择哪一个存储较好