百度和阿里哪个厉害做网站,千万不要学数字媒体技术,互联网金融型网站开发,wordpress 仿站 主题一、RPC的简化版原理如下图#xff08;核心是代理机制#xff09;。 1.本地代理存根: Stub
2.本地序列化反序列化
3.网络通信
4.远程序列化反序列化
5.远程服务存根: Skeleton
6.调用实际业务服务
7.原路返回服务结果
8.返回给本地调用方
二、新建一个模块rpc-demo-c…一、RPC的简化版原理如下图核心是代理机制。 1.本地代理存根: Stub
2.本地序列化反序列化
3.网络通信
4.远程序列化反序列化
5.远程服务存根: Skeleton
6.调用实际业务服务
7.原路返回服务结果
8.返回给本地调用方
二、新建一个模块rpc-demo-consumer 主要的依赖是rpc-demo-api即业务服务定义的api接口rpc-core是核心依赖包。 三、启动方法
在启动方法中注入业务服务接口UserService和OrderService使用的注解是RpcConsumer本文主要的功能就是如何实现这个注解。
在启动的时候会导入ConsumerConfig的配置类。
使用的ApplicationRunner来测试方法调用。 四、ConsumerConfig用来启动消费者服务。 五、ConsumerBootstrap实现了ApplicationContextAware接口注入ApplicationContext即Spring的应用上下文获取bean。 在start()方法中
1.获取所有的bean
2.遍历每个bean查找bean中是否有字段用了RpcConsumer注解
3.对被标记了的RpcConsumer的字段进行遍历
4.获取到该字段的类型全限定名
5.使用动态代理的方式创建消费者对象
6.把代理对象赋值给空字段。 查找bean中的字段是否使用了RpcConsumer注解通过循环遍历的方式进行判断。不断向父类寻找是因为bean本身可能被Spring进行了CGLIB增强形成了一个代理类。 使用Proxy创建代理对象。 六、代理对象RpcInvocationHandler中定义了远程调用方法的逻辑。 在invoke()方法中定义具体实现1.判断是否本地方法就不需要走远程调用
2.封装请求参数
3.发起远程调用
4.处理调用结果。 本地方法判断即Object类中方法不需要被代理不需要发起远程调用请求。 RpcRequest封装了远程调用消费者端请求的数据结构接口全限定名称、方法名称、方法参数。 通过post方法发起远程调用使用的是OkHttpClient。 RpcResponse定义了消费者端的响应体数据结构状态、响应结果数据、异常对象。 处理调用结果如果成功就对调用结果数据进行反序列化如果失败就封装异常信息。 七、对各种情况的基本测试
1.类对象参数的远程调用2.本地方法的远程调用3.基本参数类型的远程调用4. String类型参数的远程调用5. 另一个业务范围订单服务的远程调用6. 嵌套注入的远程调用7. 异常测试 还有哪些问题
默认使用的Java的动态代理还有Spring的切面代理CGLI增强ByteBuddy的字节码当前还是localhost请求后续应该是走网络请求。基本类型参数并不完整如果是Double类型参数可能会报错。
工程地址https://github.com/midnight2104/midnight-rpc