RPC原理

1.什么是RPC?java

远程过程调用协议RPC(Remote Procedure Call Protocol)服务器

首先了解什么叫RPC,为何要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,因为不在一个内存空间,不能直接调用,须要经过网络来表达调用的语义和传达调用的数据。网络

2.RPC调用过程是什么?数据结构

  • 1)服务消费方(client)调用以本地调用方式调用服务;
  • 2)client stub接收到调用后负责将方法、参数等组装成可以进行网络传输的消息体;
  • 3)client stub找到服务地址,并将消息发送到服务端;
  • 4)server stub收到消息后进行解码;
  • 5)server stub根据解码结果调用本地的服务;
  • 6)本地服务执行并将结果返回给server stub;
  • 7)server stub将返回结果打包成消息并发送至消费方;
  • 8)client stub接收到消息,并进行解码;
  • 9)服务消费方获得最终结果。

3.怎么作到透明化远程服务调用并发

代理!怎么封装通讯细节才能让用户像以本地调用方式调用远程服务呢?对java来讲就是使用代理!java代理有两种方式:1) jdk 动态代理;2)字节码生成。尽管字节码生成方式实现的代理更为强大和高效,但代码不易维护,大部分公司实现RPC框架时仍是选择动态代理方式。负载均衡

4.怎么对消息进行编码和解码框架

4.1肯定消息的数据结构异步

请求消息结构:①接口名称②方法名③参数类型&参数值④超时时间⑤requestID(异步请求时,依靠此id才能将return绑定到对应请求线程上)函数

服务器返回的消息结构:①返回值②状态code③requestID编码

4.2序列化和反序列化

5.通讯

消息数据结构被序列化为二进制流后,下一步就要进行网络通讯,目前有两种通讯模型,BIO和NIO。通常rpc框架都须要支持这两种通讯模型。

(基于netty实现io通讯框架,好比阿里巴巴的HSF、dubbo,Twitter的finagle)

6.如何发布本身的服务

如何让别人使用咱们的服务呢?有同窗说很简单嘛,告诉使用者服务的IP以及端口就能够了啊。确实是这样,这里问题的关键在因而自动告知仍是人肉告知。

人肉告知的方式:若是你发现你的服务一台机器不够,要再添加一台,这个时候就要告诉调用者我如今有两个ip了,大家要轮询调用来实现负载均衡;调用者咬咬牙改了,结果某天一台机器挂了,调用者发现服务有一半不可用,他又只能手动修改代码来删除挂掉那台机器的ip。现实生产环境固然不会使用人肉方式。

有没有一种方法能实现自动告知,即机器的增添、剔除对调用方透明,调用者再也不须要写死服务提供方地址?固然能够,现现在zookeeper被普遍用于实现服务自动注册与发现功能!

简单来说,zookeeper能够充当一个服务注册表(Service Registry),让多个服务提供者造成一个集群,让服务消费者经过服务注册表获取具体的服务访问地址(ip+端口)去访问具体的服务提供者。

zookeeper和eruke的对比:https://blog.csdn.net/u010963948/article/details/71730165

 

参考:https://blog.csdn.net/u013521220/article/details/70157956

相关文章
相关标签/搜索