4、 Dubb代理之接口定义

代理模式这里不再这里介绍,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()

 

javassistProxyFactory---->abstractProxyFactory----->ProxyFactory

AbstractProxyFactory: 代理工厂的公共抽象, 这里抽象实现主要是获取需要代理的接口,代理接口可以在设置在url中key为interfaces, 如果是多个接口用逗号分隔, 如果没有在url中指定,代理invoker获取的和EchoService接口

public abstract class AbstractProxyFactory implements ProxyFactory {

    public <T> T getProxy(Invoker<T> invoker) throws RpcException {
        Class<?>[] interfaces = null;
        String config = invoker.getUrl().getParameter("interfaces");
        if (config != null && config.length() > 0) {
            String[] types = Constants.COMMA_SPLIT_PATTERN.split(config);
            if (types != null && types.length > 0) {
                interfaces = new Class<?>[types.length + 2];
                interfaces[0] = invoker.getInterface();
                interfaces[1] = EchoService.class;
                for (int i = 0; i < types.length; i ++) {
                    interfaces[i + 1] = ReflectUtils.forName(types[i]);
                }
            }
        }
        if (interfaces == null) {
            interfaces = new Class<?>[] {invoker.getInterface(), EchoService.class};
        }
        return getProxy(invoker, interfaces);
    }

 

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值