RPC学习

1.http://blog.jobbole.com/92290/

 通俗易懂的讲解rpc,client与server,服务的提供与调用。

java代理可实现透明化调用远程服务,两种,jdk动态代理(常用)和cglib(字节码生成)

消息的必备结构,服务、方法、requestId、timeout、参数类型和值,返回结果有requestId、code、返回值。

消息的编码和解码:序列化,hessian、thrift等序列化解决方案。看重三点,通用性,即支持的数据结构;性能,空间时间复杂度;扩展性,新字段的兼容等。hessian介绍:http://www.cnblogs.com/niejunlei/p/5981910.html

通信方面,两种IO模型,BIO/NIO;链接:http://blog.jobbole.com/88984/

requestID的重要性:客户端先存到concurrentHashMap里,key是id,value是callback,等待结果,看一段代码:客户端发送请求后就异步加锁去取,取不到时,wait方法,释放锁。

客户端有有专门监听服务端消息的线程,得到结果后设置相应的requestId的callback对象的值,且是通过加锁操作来唤醒等待的线程。

public Object get() {      

  synchronized (this) {  // 旋锁           

 while (!isDone) {  // 是否有结果了                

wait(); //没结果是释放锁,让当前线程处于等待状态            }        }    }

private void setDone(Response res) {        

this.res = res;        isDone = true;       

 synchronized (this) { //获取锁,因为前面wait()已经释放了callback的锁了            

notifyAll(); // 唤醒处于等待的线程        }    }

捉急的格式,上述可以理解到同步的同步调用rpc的实现方式。

此时,一个rpc若想被调用,不能单靠ip通知,zookeeper提供了服务的注册与发现功能,并且通过心跳检测(socket长连接),可以找到可用的服务。简单理解,zookeeper可以充当一个服务注册表,zookeeper是个分布式文件系统。每当一个服务部署后,都要将自己的服务注册到zookeeper的某一路径上:/{service}/{version}/{ip:port}, 比如我们的HelloWorldService部署到两台机器,那么zookeeper上就会创建两条目录:分别为/HelloWorldService/1.0.0/100.19.20.01:16888  /HelloWorldService/1.0.0/100.19.20.02:16888。

socket长连接:https://www.cnblogs.com/lcplcpjava/p/6581179.html

你可能感兴趣的:(RPC学习)