1.什么是RPC?java
远程过程调用协议RPC(Remote Procedure Call Protocol)服务器
首先了解什么叫RPC,为何要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,因为不在一个内存空间,不能直接调用,须要经过网络来表达调用的语义和传达调用的数据。网络
2.RPC调用过程是什么?数据结构
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