分布式调用的复杂度
- 远程的服务在哪里(服务发现)
- 有多少个(负载均衡)
- 网络出现分区、超时或者服务出错了怎么办(熔断、隔离、降级)
- 方法的参数与返回结果如何表示(序列化协议)
- 信息如何传输(传输协议)
- 服务权限如何管理(认证、授权)
- 如何保证通信安全(网络安全层)
- 如何令调用不同机器的服务返回相同的结果(分布式数据一致性)
Alan Turing
We can only see a short distance ahead, but we can see plenty there that needs to be done.
尽管目光所及之处,只是不远的前方,即使如此,依然可以看到那里有许多值得去完成的工作在等待我们。
分布式网络8宗罪
The network is reliable —— 网络是可靠的。
Latency is zero —— 延迟是不存在的。
Bandwidth is infinite —— 带宽是无限的。
The network is secure —— 网络是安全的。
Topology doesn't change —— 拓扑结构是一成不变的。
There is one administrator —— 总会有一个管理员。
Transport cost is zero —— 不必考虑传输成本。
The network is homogeneous —— 网络是同质化的。
RPC需要解决的三大问题
- 如何表达数据
1.1 通讯双方采用中立的约定格式
1.2 序列化及反序列化
ONC RPC 的External Data Representation (XDR)
CORBA 的Common Data Representation(CDR)
Java RMI 的Java Object Serialization Stream Protocol
gRPC 的Protocol Buffers
Web Service 的XML Serialization
众多轻量级 RPC 支持的JSON Serialization
- 如何确认方法
1.1 跨语言的,唯一的方法签名
1.2 通讯双方约定使用中立的接口描述语言(Interface Description Language,IDL)
Android 的Android Interface Definition Language(AIDL)
CORBA 的OMG Interface Definition Language(OMG IDL)
Web Service 的Web Service Description Language(WSDL)
JSON-RPC 的JSON Web Service Protocol(JSON-WSP)
- 如何传递数据
1.1 通过网络(tcp/udp)进行数据交换,包括异常,超时,安全,认证等需求
1.2 通讯双方约定采用中立的Wire Protocol(通讯协议规则)
Java RMI 的Java Remote Message Protocol(JRMP,也支持RMI-IIOP)
CORBA 的Internet Inter ORB Protocol(IIOP,是 GIOP 协议在 IP 协议上的实现版本)
DDS 的Real Time Publish Subscribe Protocol(RTPS)
Web Service 的Simple Object Access Protocol(SOAP)
如果要求足够简单,双方都是 HTTP Endpoint,直接使用 HTTP 协议也是可以的(如 JSON-RPC)
RPC框架发展方向
- 朝着面向对象发展,不满足于 RPC 将面向过程的编码方式带到分布式,希望在分布式系统中也能够进行跨进程的面向对象编程,代表为 RMI、.NET Remoting,之前的 CORBA 和 DCOM 也可以归入这类,这条线有一个别名叫做分布式对象(Distributed Object)。
- 朝着性能发展,代表为 gRPC 和 Thrift。决定 RPC 性能的主要就两个因素:序列化效率和信息密度。序列化效率很好理解,序列化输出结果的容量越小,速度越快,效率自然越高;信息密度则取决于协议中有效荷载(Payload)所占总传输数据的比例大小,使用传输协议的层次越高,信息密度就越低,SOAP 使用 XML 拙劣的性能表现就是前车之鉴。gRPC 和 Thrift 都有自己优秀的专有序列化器,而传输协议方面,gRPC 是基于 HTTP/2 的,支持多路复用和 Header 压缩,Thrift 则直接基于传输层的 TCP 协议来实现,省去了额外应用层协议的开销。
- 朝着简化发展,代表为 JSON-RPC,说要选功能最强、速度最快的 RPC 可能会很有争议,但选功能弱的、速度慢的,JSON-RPC 肯定会候选人中之一。牺牲了功能和效率,换来的是协议的简单轻便,接口与格式都更为通用,尤其适合用于 Web 浏览器这类一般不会有额外协议支持、额外客户端支持的应用场合。
Why need docment
When the staff were fired/walked out the door, they took with them all of this context. The existing code can tell you what it does and how, but it can’t tell you why.
领域问题
他认为:“对于领域问题来说,可以理解为,对一个问题不断地划分,直到划分为我们熟悉的、能够快速处理的小问题。然后再对小问题的处理排列一个优先级。”
本文由 Ivan Dong 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jun 16, 2023 at 02:20 am