Dubbo服务暴露过程
代理 暴露操作都是围绕着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