分布式系统的基石是RPC。
RPC(Remote Procedure Call) 是远程过程调用,允许一台计算机调用另外一台计算机的程序。
技术基础:
- 动态代理
生成client stub和server stub,需要动态代理技术。除了JDK动态代理,还有字节码工生成工具,如:CgLib Javassit等。 - 序列化
为了在网络中传输,需要序列化。就是把对象转换成byte[] 的过程。
Java原生的序列化效率很低,开源的序列化有:protobuf,thrift, hessian(dubbo 默认) - NIO
很多RPC框架都基于netty,比如dubbo - 服务注册中心
比如zookeeper, redis等
以dubbo为例说明rpc的原理:
-
Server: 暴露服务的服务提供方。服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表。
-
Client: 调用远程服务的服务消费方。服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;
-
Registry: 服务注册与发现的注册中心。
调用原理
- 服务消费者(client) 以本地调用的方式调用服务
- client stub接受到后,将方法和参数封装成一个消息体,并序列化,找到服务地址,并将消息发送给服务器
- server stub接收到消息后进行解码和反序列化
- server stub调用本地服务
- 本地服务执行,并将结果返回给server stub
- server stub将返回结果分装成消息体,并序列化,发送给client stub
- client stub接受到消息,解码和反序列化。
- 服务消费者(client)得到最终结果。
RPC框架的就是把2-7封装起来,并对用户透明。
某高手自主实现的rpc:https://github.com/TiFG/mango
2019-07-18
以前看RPC混混沌沌,现在居然觉得自己有了宏观思维,可以高屋建瓴了。这就是重复的力量。学而时习之,不亦说乎?这就是最好的学习策略。
网友评论