4. Dubbo原理解析-代理之接口定义
来源:互联网 发布:凯瑟琳·哈尔西 知乎 编辑:程序博客网 时间:2024/06/07 02:56
代理模式这里不再逻辑介绍,dubbo中有使用这种模式,如: dubbo服务的消费端获取的就是对远程服务的一个代理。Dubbo由代理工厂ProxyFactory对象创建代理对象
一:ProxyFactory的接口定义
@SPI("javassist")public interface ProxyFactory { @Adaptive({Constants.PROXY_KEY}) <T> T getProxy(Invoker<T>invoker) throws RpcException; @Adaptive({Constants.PROXY_KEY}) <T> Invoker<T>getInvoker(T proxy, Class<T> type, URL url) throws RpcException;}
1. @SPI指定默认使用javassist字节码技术来生成代理对象
2. 接口定义了生成代理对象的方法getProxy, 入参是invoker对象
3. 接口定义了获取invoker对象, invoker对象是个可执行对象,这里inovker对象的invoke方法其实执行的是根据url获取的方法对第一个入参的实体对象的调用,即:如果url的得知调用方法sayHello, 入参proxy为空Test对象实现test,那invoker.invoke()就是test.sayHello()
AbstractProxyFactory: 代理工厂的公共抽象, 这里抽象实现主要是获取需要代理的接口,代理接口可以在设置在url中key为interfaces, 如果是多个接口用逗号分隔, 如果没有在url中指定,代理invoker获取的和EchoService接口
JdkProxyFactory: 利用jdk动态代理来创建代理,实现来说比较简单
JDK动态代理获取代理对象
public <T> T getProxy(Invoker<T> invoker,Class<?>[] interfaces) {return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), interfaces, newInvokerInvocationHandler(invoker));}
InvokerInvocationHandler是jdk动态代理创建一定要构建的参数,这里它的invoke方法只是简单的调用了invoker.invoke方法, Invoker在dubbo中代表一个可执行体,一切都向它靠拢。
获取invoker对象
public <T> Invoker<T> getInvoker(T proxy,Class<T> type, URL url) { return new AbstractProxyInvoker<T>(proxy, type, url) { @Override protected Object doInvoke(T proxy,String methodName,Class<?>[] parameterTypes,Object[] arguments) throws Throwable { Method method = proxy.getClass().getMethod(methodName,parameterTypes); return method.invoke(proxy, arguments); } };}
这里创建的 Invoker对象,执行invoke方法,其实就是利用反射利用入参执行对应对象的对应方法。
阅读全文
0 0
- 4. Dubbo原理解析-代理之接口定义
- 4. Dubbo原理解析-代理之接口定义
- 22. Dubbo原理解析-编码解码之Serialization接口定义
- 23. Dubbo原理解析-编码解码之Codec2接口定义
- 11. Dubbo原理解析-注册中心之接口介绍
- Dubbo原理解析-注册中心之接口介绍
- 5.Dubbo原理解析-代理之Javassist字节码技术生成代理
- 5.Dubbo原理解析-代理之Javassist字节码技术生成代理
- 6. Dubbo原理解析-代理之Javassist生成的伪代码
- 6. Dubbo原理解析-代理之Javassist生成的伪代码
- 3. Dubbo原理解析-Dubbo内核实现之动态编译
- Dubbo 原理解析-Dubbo 内核实现之 SPI 简单介绍
- 3. Dubbo原理解析-Dubbo内核实现之动态编译
- Dubbo原理解析
- Dubbo原理解析-监控
- dubbo原理解析
- Dubbo原理解析-监控
- dubbo spi原理解析
- 使用 Nginx 和 GeoIP 模块来处理不同国家的访问2
- iOS设备型号
- 两段锁协议
- httpClient学习整理
- 微信H5房卡牛牛开发5个Java开发人员必须注重HTML5的理由
- 4. Dubbo原理解析-代理之接口定义
- Spring Cloud在国内中小型公司能用起来吗?
- MySql安装及其在QT中的使用
- Python自然语言处理 1 语言处理与Python
- 脚本index.sh——控制频率往es写数据
- 欢迎使用CSDN-markdown编辑器
- input输入框修改placeholder和readonly的样式
- vs2013创建exe程序在其它电脑运行出错解决方案
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink批处理API详解与编程实战022--DateSet实用API详解022