概念
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