Open wittyResry opened 5 years ago
客户端 1.创建代理(cglib,java原生代理,javaassist);2.路由寻址(配置中心,vip,test-url,sofa路由分组);3.序列化(二进制传输);4.编码(bolt为了通信的高效,还需要加超时,requestId,按照编码格式传输);5.网络传输(netty),socket通道;14.收到网络;15.解码响应;16.反序列化 服务端 6.收到网络;7.解码;8.反序列化;9.反射调用;10.回传结果;11.序列化结果;12.编码;13.网络传输;
服务端问题:
客户端问题
解决办法
远程通讯、性能损耗、调用的透明化、同步/异步调用方式的实现
同步 RPC:指的是客户端发起调用后,必须等待调用执行完成并返回结果; 异步 RPC:指客户方调用后不关心执行结果返回,如果客户端需要结果,可用通过提供异步 callback 回调获取返回信息;
1.提供rpc服务的大致流程如下: • server启动时候向configserver注册 • client启动时候向configserver请求list • client缓存list,发现不可用的server,从缓存中remove • configserver通过心跳包维护可用server的list • list有更新的时候,configserver通过带version的报文通知client更新
Proxy:接口代理、软负载、单元化 Remoting:Rpc IO:异步、长连接
发起一个 RPC 调用,需要传输的最基本数据如下:
接口方法:包括接口的名字和相应的方法名字; 方法参数:包括参数的类型和取值; 附件参数,包括调用接口版本,接口超时时间等等。
虽然 RPC 有足够多的优点让你去使用,但是当真正转向服务化的时候,依然有很多需要考虑的地方:1)网络问题:本地调用无需考虑是否能够执行问题,网络调用可能会因为各种外部网络环境,端口拦截,IP 受限等可能情况导致无法成功执行。所以 RPC 的服务端通常要考虑幂等性和容错性,接口需要较强的鲁棒性设计;2)异常处理:RPC 和本地服务最大的不同就是 RPC 服务存在分布式一致性问题,当服务没有调用成功情况下,本地和远程的服务可能处于一个不一致的状态,如何进行异常处理和事物的回滚机制也是一个需要考虑的问题,是需要保障强一致性和最终一致性通常取决于具体的业务需求。
建议:可以参考当前最主流的一些 RPC 框架,如dubbo, protobuff, thrift 通过对其源码的深入学习,相信能获益匪浅。
RPC处理过程
服务端问题:
客户端问题
解决办法
准备
远程通讯、性能损耗、调用的透明化、同步/异步调用方式的实现
实现原理
1.提供rpc服务的大致流程如下: • server启动时候向configserver注册 • client启动时候向configserver请求list • client缓存list,发现不可用的server,从缓存中remove • configserver通过心跳包维护可用server的list • list有更新的时候,configserver通过带version的报文通知client更新
Proxy:接口代理、软负载、单元化 Remoting:Rpc IO:异步、长连接
发起一个 RPC 调用,需要传输的最基本数据如下:
服务端调用优化
虽然 RPC 有足够多的优点让你去使用,但是当真正转向服务化的时候,依然有很多需要考虑的地方:1)网络问题:本地调用无需考虑是否能够执行问题,网络调用可能会因为各种外部网络环境,端口拦截,IP 受限等可能情况导致无法成功执行。所以 RPC 的服务端通常要考虑幂等性和容错性,接口需要较强的鲁棒性设计;2)异常处理:RPC 和本地服务最大的不同就是 RPC 服务存在分布式一致性问题,当服务没有调用成功情况下,本地和远程的服务可能处于一个不一致的状态,如何进行异常处理和事物的回滚机制也是一个需要考虑的问题,是需要保障强一致性和最终一致性通常取决于具体的业务需求。
建议:可以参考当前最主流的一些 RPC 框架,如dubbo, protobuff, thrift 通过对其源码的深入学习,相信能获益匪浅。