微服务通信[HTTP|RPC同步通信、MQ异步通信]

概念

A服务调用B服务,B服务调C服务,C服务调D服务,即微服务之间的通信(也可以叫微服务之间的调用)

HTTP同步通信

  • 一种轻量级的通信协议,常用于在不同的微服务之间进行通信,也是最简单的通信方式
  • 使用REST ful为开发规范,将服务对外暴露的HTTP调用方式为REST API(如GET、POST、PUT、DELETE等),已经成为替代传统SOAP Web 服务的流行方案
  • 具体的类库包括httpclient、RestTemplate、OkHttp,包括Springcloud 中的OpenFegin
  • 但是当服务之间的调用较为频繁时,我们一般不会用HTTP调用了,而是选择基于TCP的RPC调用

RPC同步通信

  • RPC即Remote Procedure Call(远程过程调用),可确保调用性能更加高效,能支持更高的并发量
  • 因为RPC通信过程在传输层(HTTP通信过程在应用层中完成),所以使用RPC调用方式需要在服务层和客户端之间建立Socket连接来实现二进制数据的交换
  • RPC是面向服务的,关注于行为和动作;而REST是面向资源的,强调描述应用程序的事物和名词
  • RPC框架来屏蔽底层的通信过程,这是RPC框架的核心价值,使得我们更加专注于业务开发

RPC协议的实现框架

主流 RPC 框架有 Dubbo、gRPC、bRPC 和 Thrift以及RMI、SpringCloud等
从github star来看,Dubbo > gRPC > bRPC > Thrift

异步通信

  • 当客户端调用服务端时,并不需要等待服务端做出响应时,就要使用异步调用,毕竟使用HTTP或RPC改造成异步调用的成本相关较高,所以更容易使用的是基于MQ(Message Queue 消息队列)来实现服务之间的异步调用
  • 通过消息队列实现微服务之间的异步通信,每个服务只需要关注自己的消息队列即可,实现了服务之间的解耦,常见的消息队列包括RabbitMQ、Kafka和ActiveMQ等

总结

  • 当一个服务调用另一个服务时,最简单的就是基于HTTP的同步调用,只需目标服务对外暴露相关HTTP请求地址(包括域名或IP、端口、路径等),调用方就能通过该HTTP请求地址调用目标服务
  • 当服务之间的调用较为频繁时,就需要选择基于TCP的RPC调用,这种方式可确保性能更加高效,能支持更高的并发量
  • 当客户可调用服务端时不需要等待服务端马上做出响应时,就应该使用异步调用,比较容易使用的是基于MQ来实现服务之间的异步调用
  • 当要求服务之间的调用必须同步时,可使用MQ开发基于请求应答模式的RPC调用框架

其他

HTTP协议和RPC协议区别

功能层面

  • http是应用层的超文本传输协议,主要用于网页端和服务端进行传输数据
  • 而RPC是远程过程调用协议,它用于应用进程间的通信,屏蔽了通信底层的复杂度,我们开发者就可以去像调用本地服务一样去完成远程服务的一个调用

实现层面

  • http是一个成熟的应用层协议,它定义了通信报文格式(request/response header,body等),符合这种协议特征的才属于http协议
  • 而RPC只是一种通信协议的规范,并没有实现,只有按照RPC通信协议规范实现的通信框架才是协议具体的实现,比如dubbo,grpc,因此我们可以自定义报文规范、自定义序列化方式、自定义网络通信协议类型来作为RPC的实现框架

应用层面

  • http协议和实现了RPC规范的框架都可以实现跨网络节点的服务通信,并且它们底层都是用TCP/IP协议作为通信基础。而RPC网络通信协议层我们可以自定义,所以可以通过http协议去实现,比如grpc,openFegin
相关推荐
葡萄成熟时 !6 小时前
JAVA 常用API学习笔记
java·笔记·学习
Rain的Java大神之路7 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
吴声子夜歌8 小时前
Java面试题——基础(一)
java·开发语言
南城以南溫暖如初1478 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
傻啦嘿哟9 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅10 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
mqiqe11 小时前
AgentScope Java 2.0 Agent 状态存储(AgentStateStore)深度解析:构建可恢复、可扩展的智能体运行时
java·运维·网络
zhifou12345611 小时前
java 17升级安装
java·开发语言
用户37215742613511 小时前
如何使用 Java 将 Markdown 转换为 PDF(含自定义设置)
java
用户37215742613512 小时前
如何使用 Java 在 Word 文档中添加和删除水印:分步指南
java