Dubbo服务暴露过程

本文详细阐述了Dubbo服务的暴露过程,从ServiceImpl的实现到Invoker的创建,再到动态代理的原理。通过export方法,将Invoker转化为Exporter并开启网络服务,最后通过ExchangeHandlerAdapter处理远端调用,完成服务的暴露和调用流程。
摘要由CSDN通过智能技术生成


代理 暴露操作都是围绕着invoker展开的,invoker在不同状态的转化

Protocol维护了invoker的生命周期

在这里插入图片描述
下图引用地址
在这里插入图片描述

ServiceImpl

服务提供方实现ServiceAPI的业务细节

获取触发器 - getInvoker

将实现类实例包装成invoker

负责doInvoke的实现通过Invocation中的调用信息,对本地服务实现实例的调用

// javassist实现
public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
   
    // ServiceImpl的包装类
    final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
    return new AbstractProxyInvoker<T>(proxy, type, url) {
   
        @Override
        protected Object doInvoke(T proxy, String methodName,
                                  Class<?>[] parameterTypes,
                                  Object[] arguments) throws Throwable {
   
            return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
        }
    };
}

// jdk反射实现
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);
        }
    };
}

javassist动态代理的实现原理 - Wrapper

Wrapper - 动态获取ServiceImpl的处理类

创建一个ServiceImpl对应的Wrapper包装类,负责对ServiceImpl实例方法和参数的调用

相当于是ServiceImpl特制的处理类,是动态代理的javassist实现

将显示的调用(serviceImpl.hello()

变成(wrapper.invokeMethod(serviceImpl,"hello",new Class[] {}, new Object[] {})

serviceImpl真正的调用操作在javassist动态生成的继承Wrapper的类中(实现Wrapper中的三个抽象方法来操作ServiceImpl实例的属性和方法)

/**
  * 设置ServiceImpl实例的属性
  * @param o serviceImpl instance
  * @param n property name
  * @param v property value
  */
public void 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值