Dubbo源码介绍

Dubbo是阿里的一个分布式服务框架

介绍
Dubbo通过Zookeeper注册服务及获取服务注册信息,并使用JAVA spi机制生成服务,使用RPC协议远程调用服务,具体实现使用了Netty调用服务,这样Dubbo本身是无法使用全局事务,需要借助额外TCC事务。
生成
Dubbo服务在服务端注册后。调用端引用服务端的API,并连接到注册中心,就可以获取服务端注册的服务类相关信息。使用时调用端面需要在spring的xml文件中引入dubbo的dtd文件,dubbo扩展的自己的一些xml标签节点,这些可以像使用spring的BEAN一样注入或生成。
Dubbo之所以可以这样工作是因为在xml的xsi引入了dobbo相关的定义
xsi:schemaLocation=”http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd“>
Spring根据dubbo的 dtd文件找到 http://code.alibabatech.com/schema/dubbo 对应的解析BEAN:DubboNamespaceHandler,这个类型继承了Spring的NamespaceHandlerSupport并覆盖了init()方法,该方法注册了dubbo的10个xml标签的解析方式:

public class DubboNamespaceHandler extends NamespaceHandlerSupport {

    static {
        Version.checkDuplicate(DubboNamespaceHandler.class);
    }

    public void init() {
        registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
        registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
        registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
        registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
    }

}

这样在spring的xml中可以直接写dubbo的标签并通过已注册的标签解析类是解析并生成对应的BEAN。
由于调用端使用的只是一个API接口,无实现所以通过Spring生成BEAN,没有实现中就没有对应API的实例生成,所以Dubbo的生成的都是对应标签的一个包装类实现。
在生成的Dubbo的时间会获取 注册中心对应API的服务提供都IP,端口,方法列表及方法信息。并进行多次封装组合。在这中间Dubbo多次使用了ConcurrentHashMap类进行属性存储,同时也将调用都的IP相关信息获取到。同时获取Dubbo的执行方式是随机还是轮询。默认的是随机。根据这个方法生成不同的执行类。
执行
最后在执行的时候是使用的JOSS的Netty框架,将调用 者及服务提供者生成JBOSS的管道对象:org.jboss.netty.channel.Channel并执行它的write方法: channel.write(message);Dubbo这个将方法的执行结果封装到一个Result对象中。执行完后,还会判断方法执行时间是否超时,如果超时就会抛出异常,所以对于执行方法比较长的,最好设置超时时间长一点,不然方法执行完成了,还是会抛出异常,事务却不会回滚。
知识点
Zookeeper注册服务,并提供服务提供都类信息
JAVA代理类通过动态代理执行方法
JAVA SPI机制,DUBBO将执行服务类信息使用SPI机制放在对应的DUBBO的JAR包中,通过META-INF包下对面存储。
JBOSS 的Netty负责执行远程服务方法
无法做到全局事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值