模块关系
模块说明
整体上按照分层结构进行分包,与分层的不同点在于:
各层说明
关系说明:
依赖关系:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
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">
<dubbo:monitor address="${dubbo.monitor.address}"/>
<dubbo:application name="应用名" owner=""/>
<dubbo:registry protocol="zookeeper" address="${dubbo.zk.servers}" client="zkclient" group="${dubbo.zk.group}" file="dubbo-reg-zk.cache"/>
<dubbo:protocol name="dubbo" port="${dubbo.service.provider.port}" threadpool="cached" threads="${dubbo.service.provider.threads:200}"/>
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
</beans>
Spring提供了可扩展Schema的支持,解析自定义的xml文件,然后转化为配置对象。主要步骤:
dubbo框架实现的子类分别是 com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler和com.alibaba.dubbo.config.spring.schema.DubboBeanDefinitionParser将xml配置转换为类实例对象。
参考例子:http://blog.csdn.net/cutesource/article/details/5864562
dubbo的xml配置与对应业务类的映射关系:
com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
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));
}
说明:
org.springframework.beans.factory.xml.NamespaceHandlerSupport.registerBeanDefinitionParser(String, BeanDefinitionParser)
a)第一个参数,表示子节点名,比如“dubbo:service/” 中的service
b) 第二个参数,表示节点的解析器
schema格式 | 类模板 | 内部属性 | 描述 |
---|---|---|---|
dubbo:service/ | com.alibaba.dubbo.config.ServiceConfig | 链接 | 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 |
dubbo:reference/ | com.alibaba.dubbo.config.ReferenceConfig | 同上 | 引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。 |
dubbo:protocol/ | com.alibaba.dubbo.config.ProtocolConfig | 同上 | 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 |
dubbo:application/ | com.alibaba.dubbo.config.ApplicationConfig | 同上 | 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者 |
dubbo:module/ | com.alibaba.dubbo.config.ModuleConfig | 同上 | 模块配置,用于配置当前模块信息,可选。 |
dubbo:registry/ | com.alibaba.dubbo.config.RegistryConfig | 同上 | 注册中心配置,用于配置连接注册中心相关信息 |
dubbo:monitor/ | com.alibaba.dubbo.config.MonitorConfig | 同上 | 监控中心配置,用于配置连接监控中心相关信息,可选。 |
dubbo:provider/ | com.alibaba.dubbo.config.ProviderConfig | 同上 | 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。 |
dubbo:consumer/ | com.alibaba.dubbo.config.ConsumerConfig | 同上 | 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。 |
dubbo:method/ | com.alibaba.dubbo.config.MethodConfig | 同上 | 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息 |
dubbo:argument/ | com.alibaba.dubbo.config.ArgumentConfig | 同上 | 用于指定方法参数配置。 |
类依赖关系:
注意:只有group,interface,version是服务的匹配条件,三者决定是不是同一个服务,其它配置项均为调优和治理参数。
所有配置最终都将转换为URL表示,并由服务提供方生成,经注册中心传递给消费方,各属性对应URL的参数,参见配置项一览表中的"对应URL参数"列。
URL格式:
dubbo://192.168.21.58:20130/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=bbs-service&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.DemoService&methods=getSimpleMemberByUids,getMasterMemberInfo,getUidsByWcuids,getUserInfoListByWcuids,getForumModeratorByUidAndFid,getMemberInfoByUsernames,clearMemberCache,getMemberCountByUids,addDav,updateBio,updateMemberCount,getLastTidsByUids,batchGetMemberProfileModel,getWcuidsByUids,isDav,getUidByWcuid,updateLastTid,saveName,getMemberDetailModelListByUids,register&pid=4481&revision=0.0.1&side=provider&threadpool=cached&threads=200×tamp=1490614869341
服务提供方暴露服务的初始化链,时序图如下:
1、Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。
2、Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
3、Invocation是会话域,它持有调用过程中的变量,比如方法名,参数等。
服务提供者暴露一个服务的详细过程
上图是服务提供者暴露服务的主过程:
首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl),然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到Invoker的转化。接下来就是Invoker转换到Exporter的过程。
Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程(如上图中的红色部分),下面我们以Dubbo和RMI这两种典型协议的实现来进行说明:
1、Dubbo的实现 Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由Dubbo自己实现。
2、RMI的实现 RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法, 它通过Spring或Dubbo或JDK来实现RMI服务,通讯细节这一块由JDK底层来实现,这就省了不少工作量。
代码调用细节:
入口在afterPropertiesSet()方法,从spring容器中查找这些bean(ProviderConfig、ApplicationConfig、ModuleConfig、List<RegistryConfig>、MonitorConfig、 List<ProtocolConfig>、),并set到ServiceBean
服务消费方引用服务的初始化链,时序图如下:
服务消费者消费一个服务的详细过程
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图中的红色部分),这是服务消费的关键,Invoker实现了真正的远程服务调用。接下来把Invoker转换为客户端需要的接口(如:HelloWorld)。
由于Invoker是Dubbo领域模型中非常重要的一个概念,很多设计思路都是向它靠拢。这就使得Invoker渗透在整个实现代码里,对于刚开始接触Dubbo的人,确实容易给搞混了。 下面我们用一个精简的图来说明最重要的两种Invoker:服务提供Invoker和服务消费Invoker:
位于【dubbo-cluster】模块
核心思想:
protected Invoker doSelect(List<Invoker> invokers, URL url, Invocation invocation);从invokers列表中,根据算法选择一个合适Invoker来执行具体业务。
com.alibaba.dubbo.registry.RegistryService:注册服务。提供以下方法:
实现子类:
com.alibaba.dubbo.registry.NotifyListener。当收到服务变更通知时触发
通知需处理契约:
1. 总是以服务接口和数据类型为维度全量通知,即不会通知一个服务的同类型的部分数据,用户不需要对比上一次通知结果。
2. 订阅时的第一次通知,必须是一个服务的所有类型数据的全量通知。<br>
3. 中途变更时,允许不同类型的数据分开通知,比如:providers, consumers, routers, overrides,允许只通知其中一种类型,但该类型的数据必须是全量的,不是增量的。<br>
4. 如果一种类型的数据为空,需通知一个empty协议并带category参数的标识性URL数据。<br>
5. 通知者(即注册中心实现)需保证通知的顺序,比如:单线程推送,队列串行化,带版本对比。<br>
com.alibaba.dubbo.monitor.simple.RegistryContainer,取到RegistryService,实现subscribe节点数据变更方法。
负责客户端与服务端、客户端与注册中心、服务端与注册中心等服务器间的数据通信。底层接口:
com.alibaba.dubbo.remoting.Transporter
com.alibaba.dubbo.remoting.Server
com.alibaba.dubbo.remoting.Client
支持多种通信框架:
https://github.com/alibaba/dubbo/wiki/user-guide-sample#%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )