业务接口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());
相关推荐
《Dubbo源码分析系列》是一份深入探讨Java开源...通过对《Dubbo源码分析系列》的学习,开发者不仅可以掌握Dubbo的基本使用,还能深入理解其设计思想,从而更好地在实际项目中应用和优化Dubbo,提高系统的稳定性和效率。
4. **Java RPC机制**:理解RPC(远程过程调用)的概念是学习Dubbo的关键之一。可以先从RMI、Hessian、Thrift等RPC框架入手,了解它们的工作原理及其与Dubbo之间的联系。 5. **Java其他内容**:除了以上提及的知识点...
《Dubbo源码分析》是一套深入探讨Apache Dubbo这一著名Java开源框架的书籍,旨在帮助开发者更好地理解和应用Dubbo。Dubbo是一个高性能、轻量级的服务治理框架,广泛应用于微服务架构中,以实现服务的发布、发现、...
通过深入学习和实践Dubbo源码,开发者不仅可以更好地理解Dubbo的工作原理,还能在实际项目中灵活运用,解决各种复杂的分布式服务问题。Dubbo的源码阅读也是一个不断提升自身技术深度的过程,有助于成长为更优秀的...
本文对dubbo源码进行了深入的解析,涵盖了dubbo的架构、核心机制分析、扩展点加载流程、代理机制、远程调用流程、集群和容错处理、监控机制等多个方面。通过阅读和理解这些内容,可以更好地掌握dubbo的内部工作机制...
本篇将详细讲解基于dubbo-demo-consumer、dubbo-demo-provider和dubbo-simple-monitor的实例服务,带你深入理解Dubbo的核心概念和操作流程。 首先,我们来看`dubbo-demo-consumer`,它是Dubbo服务的消费者。消费者...
总的来说,Dubbo的SPI机制是其强大功能背后的关键技术之一,它不仅提供了类似Java SPI的服务发现能力,还通过一系列的增强,使得服务的扩展和管理变得更加高效和便捷。在深入研究`dubbo-spi`和`java-spi`这两个...
通过源码的学习,开发者能够了解到RPC调用的整个流程,包括服务的注册、发现、调用、负载均衡等,这些都是分布式服务架构中不可或缺的部分。随着互联网技术的不断发展,掌握这些知识对于从事分布式系统开发的开发者...
Dubbo作为Java领域最知名的分布式服务框架之一,其设计理念、实现原理以及在实际应用中的优化策略都是开发者们关注的焦点。这份解析文档旨在帮助读者理解Dubbo的工作流程,提升对分布式系统设计的理解,为实际开发...
Dubbo 源码 阿里巴巴 这是最新的 源码大家学习一下!
- **Refer&export**:描述了服务引用和发布的完整流程,包括调用顺序、生成Invoker的过程、暴露服务等。 - **Registry**:注册中心的相关操作,包括创建注册中心、启动注册中心、发布服务和引用服务的过程。 - **...
总结,Dubbo的源码学习不仅可以帮助我们理解分布式服务治理的实现原理,还能提升我们的系统设计能力。通过深入分析`Provider`、`Consumer`、`Registry`、`Proxy`等核心组件,我们可以更好地运用Dubbo解决实际项目中...
了解Dubbo源码通常从其主要模块入手,如服务提供者(Provider)、服务消费者(Consumer)、注册中心(Registry)、协议层(Protocol)等。通过跟踪调用流程,理解服务发布、订阅、调用过程。 2. **Dubbo诞生的背景*...
Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,其源码的深入理解和分析对于Java开发者来说,具有极高的学习价值。本文将针对提供的dubbo-2.4.3-sources.jar等一系列源码包,逐一剖析其中的核心组件和...
通过对Apache Dubbo 3.0.7源码的阅读和分析,开发者可以学习到如何设计高性能的RPC框架,理解服务治理的核心原理,以及如何通过SPI机制实现系统的高度可扩展性。这对于构建大型分布式系统或微服务架构具有极大的价值...
标题中的“dubbo-provider”和“dubbo-consumer”指的是Dubbo框架中的两个核心组件,分别代表服务提供者和服务消费者。Dubbo是一个由阿里巴巴开源的高性能、轻量级的Java服务治理框架,它主要应用于分布式系统,实现...
综上所述,这个项目是一个基于Dubbo构建的服务架构,其中`dubbo-consumer`负责调用服务,`dubbo-provider`负责提供服务,两者通过Redis作为注册中心进行交互。整个项目是用Maven管理的,可以直接通过`main`方法运行...