网站制作与网页设计,wordpress 文章分类页面,做那个的网站谁有,化妆品网站程序RPC是什么#xff0c;先摘取一段解释#xff1a; RPC全称为远程过程调用#xff08;Remote Procedure Call#xff09;#xff0c;它是一种计算机通信协议#xff0c;允许一个计算机程序调用另一个计算机上的子程序#xff0c;而无需了解底层网络细节。通过RPC#xff…RPC是什么先摘取一段解释 RPC全称为远程过程调用Remote Procedure Call它是一种计算机通信协议允许一个计算机程序调用另一个计算机上的子程序而无需了解底层网络细节。通过RPC一个计算机程序可以像调用本地程序一样调用远程程序使得分布式应用程序的开发更加简单和高效。
根据对应的接口定义去找到对应实际提供服务的方法去调用需要的必要信息要调用的服务的地址要调用的类方法方法参数类型参数值怎么接收返回值多个服务提供者的话需要负载均衡 RPC 框架很多找一个比较纯粹的框架来分析下是怎么实现的自己实现的话也可以照葫芦画瓢有哪些是必要的当然同样的效果可以有不同的实现自己也可以针对一些特性进行替换。
xxl-rpc实现原理解析
怎么对外提供服务考虑到性能原因采用的netty来实现的服务 要调用的地址这里可以直接指定可以通过本地或者注册中心获取到提供的服务列表进行负载 类方法方法参数类型参数值为什么需要这些因为这些才可以唯一确定一个调用的方法具体是调用的哪个 返回值是否需要关心返回值是否需要异步异步的话是通过回调还是future怎么进行实现的
xxl-rpc对于代理的生成
针对需要依赖的接口生成对应代理的代理是什么时候生成的这里还是先看spring环境中的情况吧 通过spring的生命周期管理实现了InstantiationAwareBeanPostProcessor来对对象初始化之后对对象的属性进行处理看是不是有依赖rpc的接口有依赖的对其进行属性注入对应生成的代理类
public class XxlRpcSpringInvokerFactory implements InitializingBean, DisposableBean, BeanFactoryAware, InstantiationAwareBeanPostProcessor {
}怎么生成对应的代理类包装成了什么样子的数据 采用的JDK的动态代理有对应的版本号区分然后类名方法方法参数类型参数值地址可以支持负载那么要传递给提供服务方的数据是什么样子呢,就是这样子的
public class XxlRpcRequest implements Serializable{private static final long serialVersionUID 42L;private String requestId;private long createMillisTime;private String accessToken;private String className;private String methodName;private Class?[] parameterTypes;private Object[] parameters;private String version;
}只要有这些参数就可以确定服务提供方需要执行的方法进行执行 是否关心返回值xxl-rpc提供了四种选择同步调用异步调用返回future异步设置callbackoneway不关心返回值 底层实现这几种的方式首先oneway不关心返回值不需要多考虑rpc内部都是直接异步发送那么怎么接受返回值呢采用的回调的方法就是clent自己也起一个服务然后当服务端执行完成之后进行远程调用回来结果怎么确定是哪次调用的呢上面封装参数的requestId就派上用场了采用uuid生成的方式唯一标志回调之后有等待结果的就对其进行唤醒需要执行回调方法的就进行执行回调
具体实现上通过XxlRpcFutureResponse 来封装返回值里面记录了request然后根据requestId把对应的resonse进行存放到一个公共集合这里用的一个concurrentHashMap里面然后回调的时候从里面通过对应的requestId取对应的resposne对象把返回值记录上状态修改
XxlRpcInvokeFuture invokeFuture new XxlRpcInvokeFuture(futureResponse);
// future存入到了threadLocal里面
XxlRpcInvokeFuture.setFuture(invokeFuture);返回的对象也通过工具类直接放到对应的ThreadLocal里面可以获取到对应的futureResponse然后可以get等待返回状态的改变未返回的时候加锁等待等返回之后通过唤醒锁可以设置超时时间这样一个基础的rpc功能就齐了
总结
提供服务可以采用netty或者别的也可以然后服务暴露就需要自己完成去暴露了这里没主动去解析主要考虑的调用端调用时候根据对应的注解去生成代理对象进行注入地址可以提供负载然后进行调用返回值通过回调的方式回调之后通过改变对应的对象的状态对其进行唤醒就可以取到对应的返回值一次rpc调用完成