为什么需要分布式通信
我们之前在讲分布式资源调度的时候,把分布式系统中的各个节点与操作系统的进程做了类比。我们知道,操作系统的进程之间由于需要数据的交换,是需要进程通信机制的。那么同理,分布式系统之间同样需要通信。在业务层面,每个分布式系统一般都承载着一个微服务,所以,微服务之间也一定是需要通信的。比如,我们各条业务线均需要查询用户中心微服务的数据等等。我们常用的通信方式有三种:RPC、发布-订阅、消息队列。
RPC
在传统的B/S模式中,服务端会对外暴露接口,然后客户端通过调用这个接口来完成二者之间的通信。那么在分布式系统中,我们同样也可以采用这种模式。但是,B/S 架构是基于 HTTP 协议实现的,每次调用接口时,都需要先进行 HTTP 请求。这样既繁琐又浪费时间,不适用于有低时延要求的大规模分布式系统,所以远程调用的实现大多采用更底层的网络通信协议。我们先用一张图俯瞰一下RPC的架构:
![c5f8520c500e80b759efe40284c4a86b.png](https://img-blog.csdnimg.cn/img_convert/c5f8520c500e80b759efe40284c4a86b.png)
在这里,订单系统进程并不需要知道底层是如何传输的,在用户眼里,远程过程调用和调用一次本地服务没什么不同。这,就是 RPC 的核心。即图中的第3步和第8步,对我们调用方是透明的。与我们经常使用的接口调用不同,图中的网络通信基本是基于TCP协议自己封装的一些协议。这样做可以约定通信双方的数据格式,从而让客户端封包和服务端解包更加快速,更加适用于分布式系统。这里的通信协议封装可参考Redis的RESP协议与FastCGI协议。
RPC的典型实现 - Dubbo
假设我们要自己去实现一个RPC通信框架,我们应该如何实现呢?假如我们用4个调用方与4个服务提供方,我们该如何管理他们呢?
![8a281bf88c350006d72f3f76db3f9dfa.png](https://img-blog.csdnimg.cn/img_convert/8a281bf88c350006d72f3f76db3f9dfa.png)