业务接口wrapper类:
Class com.alibaba.dubbo.demo.DemoService$sw1{
public Object getPropertyValue(Object o, String n)
{
com.alibaba.dubbo.demo.DemoService w;
try{
w = ((com.alibaba.dubbo.demo.DemoService)$1);
}catch(Throwable e)
{
throw new IllegalArgumentException(e);
}
throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \""+$2+"\" filed or setter method in class com.alibaba.dubbo.demo.DemoService.");
}
public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException
{
com.alibaba.dubbo.demo.DemoService w;
try{
w = ((com.alibaba.dubbo.demo.DemoService)$1);
}catch(Throwable e)
{
throw new IllegalArgumentException(e);
}
try
{
if( "sayHello".equals( $2 ) && $3.length == 1 )
{
return ($w)w.sayHello((java.lang.String)$4[0]);
}
} catch(Throwable e)
{
throw new java.lang.reflect.InvocationTargetException(e);
} throw new com.alibaba.dubbo.common.bytecode.NoSuchMethodException("Not found method \""+$2+"\" in class com.alibaba.dubbo.demo.DemoService.");
}
public void setPropertyValue(Object o, String n, Object v)
{
com.alibaba.dubbo.demo.DemoService w;
try{
w = ((com.alibaba.dubbo.demo.DemoService)$1);
}
catch(Throwable e)
{
throw new IllegalArgumentException(e);
}
throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \""+$2+"\" filed or setter method in class com.alibaba.dubbo.demo.DemoService.");
}
}
导出服务URL
dubbo://10.0.3.126:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=20593&side=provider×tamp=1409192221291
local export URL
injvm://127.0.0.1/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=20593&side=provider×tamp=1409192221291
将服务实现类包装为Invoker:
public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
// TODO Wrapper类不能正确处理带$的类名
final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
returnnew 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);
}
};
}
Export 服务Invoker:(本地)
Exporter<?> exporter = protocol.export(
proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
ProtocolListenerWrapper 监听exported服务的动态
returnnew ListenerExporterWrapper<T>(protocol.export(invoker),
Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(ExporterListener.class)
.getActivateExtension(invoker.getUrl(), Constants.EXPORTER_LISTENER_KEY)));
其中public ListenerExporterWrapper(Exporter<T> exporter, List<ExporterListener> listeners)
由listeners监听Exported的服务动态
ProtocolFilterWrapper 装饰 Invoker
protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));
InjvmProtocol 新建exporter对象(InjvmProtocal单例对象由exporterMap缓存所有exported的服务)
returnnew InjvmExporter<T>(invoker, invoker.getUrl().getServiceKey(), exporterMap);
ServiceConfig<T>中由exporters对该接口新exported服务缓存
exporters.add(exporter);
向注册中心export
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
Exporter<?> exporter = protocol.export(invoker);
//registryURL: registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.5.4-SNAPSHOT&export=dubbo%3A%2F%2F10.0.3.126%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.5.4-SNAPSHOT%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dwilliam%26pid%3D20593%26side%3Dprovider%26timestamp%3D1409192221291&owner=william&pid=20593®istry=zookeeper×tamp=1409192152649
ProtocolListenerWrapper remote注册暴露:
if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
returnprotocol.export(invoker);
}
ProtocolFilterWrapper remote注册暴露:
if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
returnprotocol.export(invoker);
}
RegistryProtocol export服务:
Exporter<T> export(final Invoker<T> originInvoker)
——》
ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker);
——》//RegistryURL Invoker代理为服务DubboURL的Invoker
providerURL= dubbo://10.0.3.126:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=20593&side=provider×tamp=1409192221291
final Invoker<?> invokerDelegete = new InvokerDelegete<T>(originInvoker, getProviderUrl(originInvoker));
exporter = new ExporterChangeableWrapper<T>((Exporter<T>)protocol.export(
invokerDelegete), originInvoker);
bounds.put(key, exporter);
DubboProtocol:
openServer(url);
ExchangeServer createServer(URL url)
server = Exchangers.bind(url, requestHandler);
getExchanger(url).bind(url, handler);
publicstatic Exchanger getExchanger(String type/*header*/) {
return ExtensionLoader.getExtensionLoader(Exchanger.class).getExtension(type);
}
new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
DecodeHandler->HeaderExchangeHandler->DubboProtocol$requestHandler
NettyTransporter::bind(URL url, ChannelHandler listener)
new NettyServer(url, listener)
AbstractServer (url, ChannelHandlers.wrap(handler, ExecutorUtil.setThreadName(url, SERVER_THREAD_POOL_NAME)));
ChannelHandlers.getInstance().wrapInternal(handler, url)
new MultiMessageHandler(new HeartbeatHandler(ExtensionLoader.getExtensionLoader(Dispatcher.class)
.getAdaptiveExtension().dispatch(handler, url)));
AllDispatcher:: dispatch(ChannelHandler handler, URL url)
new AllChannelHandler(handler, url)
NettyServer::doOpen()
new NioServerSocketChannelFactory(boss, worker, getUrl().getPositiveParameter(Constants.IO_THREADS_KEY, Constants.DEFAULT_IO_THREADS));
bootstrap = new ServerBootstrap(channelFactory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() {
NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec() ,getUrl(), NettyServer.this);
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", adapter.getDecoder());
pipeline.addLast("encoder", adapter.getEncoder());
pipeline.addLast("handler", nettyHandler);
return pipeline;
}
//这里返回的ChannelPipeline的ChannelHandler只有三个,decoder负责解码,encoder负责编码,nettyHandler负责业务处理,其中nettyHander wrapper了 NettyServer->MultiMessageHandler->HeartbeatHandler->AllChannelHandler->DecodeHandler->HeaderExchangerHandler->requestHandler(真正的业务处理)
});
// bind
channel = bootstrap.bind(getBindAddress());