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负责执行远程服务方法
无法做到全局事务