




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
English|首页||下载||用户指南||开发者指南||管理员指南||培训文档||常见问题解答||发布记录||发展路线||English|首页||下载||用户指南||开发者指南||管理员指南||培训文档||常见问题解答||发布记录||发展路线||ProtocolTCKRegistryCallback功能sticky参(+)修改后通过PushRequest高高高高高高高高低低低高高高高低低低高低高高高高高高高高修改后通过PushRequest高高高高高高高高低低低高高高高低低低高低高高高高高高高高低低低低低版本管(+)2个版本并行开#版本管(+)2个版本并行开#这个版本可放在SVN的Trunk#如何可行,可以推进应用在期望的时间点内升级到GA源码构(+)UsethiscommandtocheckoutthelatestprojectsourcePoweredby:Weusethetrunkforthenextmainrelease;thenweuseabranchforanybugfixesonthepreviousmajorrelease.Youcanlookatallbrancheshere:DubbousesMavenasitsbuildtool.Ifyoudon'tfancyusingMavenyoucanuseyourIDEdirectlyorDownloadadistributionorJava1.5orGetthelatestSourcesvncheckout/svn/dubbo/trunkMavenTobuilddubbomavenhastobeconfiguredtousemoresetMAVEN_OPTS=‐Xmx1024mAnormalmvnDoingaQuickAvailableasofDubboThefollowingskipsbuildingthemanual,thedistroanddoesnotexecutetheunitmvninstallUsingsetMAVEN_OPTS=‐Xmx1024mAnormalmvnDoingaQuickAvailableasofDubboThefollowingskipsbuildingthemanual,thedistroanddoesnotexecutetheunitmvninstallUsinganIfyouprefertouseanIDEthenyoucanauto-generatetheIDE'sprojectfilesusingmavenplugins.mvnmvnIfyouhavenotalreadydoneso,youwillneedtomakeEclipseawareoftheMavenrepositorysothatitcanbuildeverything.Inthepreferences,gotoJava->Build>ClasspathanddefineanewClasspathVariablenamedM2_REPOthatpointstoyourlocalMavenrepository(i.e.,~/.m2/repositoryonUnixandc:\DocumentsandSettings\<user>\.m2\repositoryonWindows).YoucanalsogetMaventodothisformvneclipse:configure‐workspaceBuildingsourceIfyouwanttobuildjarfileswiththesourcecode,thatforinstanceEclipsecanimportantsoyoucandebugtheDubbocodeaswell.Thenyoucanrunthiscommandfromthedubborootfolder:mvncleansource:jarinstall框架设(+)图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Svic和Cfi层为API均为SPI。,,,serialize,数据序列化层,可复用的一些工具,扩展接口为Serialization,ObjectInput,ObjectOutput,ThreadPool在RPC中,Protocol是核心层,也就是只要有ProtocolInvokerExporter就可以完成非透明的RPC调用,然后在Invoker的主过程上Filterserialize,数据序列化层,可复用的一些工具,扩展接口为Serialization,ObjectInput,ObjectOutput,ThreadPool在RPC中,Protocol是核心层,也就是只要有ProtocolInvokerExporter就可以完成非透明的RPC调用,然后在Invoker的主过程上Filter,,,而Clst是外围概念,所以Clst的目的是将多个Ivk伪装成一个Ivk,这样其它人只要关注Ptcl层Ivk即可,加上Clst或者去掉Clst对其它层都不会造成影响,因为只有一个提供者时,是不需要Clst的。Pxy层封装了所有接口的透明化代理,而在其它层都以Ivk为中心,只有到了暴露给用户使用时,才用Pxy将Ivk转成接口,或将接口实现转成Ivk,也就是去掉Pxy层RPC是可以R的,只是不那么透明,不那么看起来像调本地服务一样调远程服务。而Rti实现是D协议的实现,如果你选择RI协议,整个Rti都不会用上,Rti内部再划为st传输层和Exc信息交换层,st层只负责单向消息传输,是对i,Ntty,izzy的抽象,它也可以扩展UDP传输,而Exc层是在传输层之上封装了RstRss语义。trStMSpctJBsWW图中小方块ProtocolCluster,ProxyServiceContainerRegistryMonitor代表层或模块,蓝色的表示与业务有交互,绿色的表示只对Dubbo内部交互。图中背景方块Consumer,Provider,Registry,Monitor代表部署逻辑拓普节点。Ivk是实体域,它是DIvk是实体域,它是D的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起ivk调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。采用ckl+Mcl,扩展点(+)如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK标准的ScitEi,通过tN;获取脚本类型的名称,但如果RyScitEi因为所依赖的jy.j不存在,导致RyScitEi类加载失败,这个失败原因被吃掉了,和y对应不起来,当用户执行y脚本时,会报不支持y,而不是真正失败的原因。packageimportpublicclassXxxProtocolimplemenetsProtocol//}packageimportpublicclassXxxProtocolimplemenetsProtocol//}packageimportpublicclassXxxProtocolWrapperimplemenets{ProtocolpublicXxxProtocol(Protocolprotocol){impl=protocol;//接口方法做一个操作后,再调用extension的方publicvoidrefer()//...一些操impl一些操}//}publicinterface{Car}publicinterface{Wheel}publicclassRaceCarMakerimplemenets{WheelMakerpublicsetWheelMaker(WheelMaker{this.wheelMaker=}publicCarmakeCar()//Wheelwheel=//returnnewRaceCar(wheel,}}}publicCarmakeCar()//Wheelwheel=//returnnewRaceCar(wheel,}}这里带来另一个问题,Extsi要注入依赖扩展点时,如何决定要注入依赖扩展点的哪个实现。在这个示例中,即是在多个Wlk的实现中要注入哪个。这个问题在下面一点Ativ实例中说明。这样依赖的扩展点也可以从UR拿到配置信息,所有的扩展点自己定好配置的Ky后,配置信息从UR上从最外层传入。URCk(造车者)、wlk造轮者)publicinterface{CarmakeCar(URLpublicinterface{WheelmakeWheel(URLpublicclassRaceCarMakerimplemenets{WheelMakerpublicsetWheelMaker(WheelMaker{this.wheelMaker=}publicCarmakeCar(URLurl)//Wheelwheel=//returnnewRaceCar(wheel,}}//Wheelwheel=//在D的Extsi的扩展点类开对应的Ativ实现是在加载扩展点里动态生成。指定提取的UR的Ky通过@Ativ注解在接口方法上提供。下面是D的st扩展点的代码:publicinterface{@Adaptive({"server",Serverbind(URLurl,ChannelHandlerhandler)throws@Adaptive({"client",Clientconnect(URLurl,ChannelHandlerhandler)throws}3.Dubbo对于集合类扩展点,比如:FilterInvokerListenerExportListenerTelnetHandlerStatusChecker等,importimport@Activate//无条件自动激publicclassXxxFilterimplementsFilter对于集合类扩展点,比如:FilterInvokerListenerExportListenerTelnetHandlerStatusChecker等,importimport@Activate//无条件自动激publicclassXxxFilterimplementsFilter//}importimport@Activate("xxx")//当配置了xxx参数,并且参数为有效值时激活,比如配了cache="lru",自动激活CacheFilterpublicclassXxxFilterimplementsFilter//}importimport@Activate(group="provider",value="xxx")//只对提供方激活,group可选"provider"或publicclassXxxFilterimplementsFilter//}实现细(+)(+)基于.j内的EAIN/si.ls配置,Si在遇到名称空间时,会回调DNscHl。所有的标签,都统一用DBDfiitiPs进行解析,基于一对一属性映射,将X标签解析为B对象。在SvicCfi.xt或RfcCfi.t初始化时,将B对象转换UR格式,所有B属性转成UR的参数。然后将URPtcl扩展点Ativ机制,根据UR的协议头,进行不同协议的服务暴露或引用。(1)<dubbo:serviceregisrty="N/A"/>or<dubbo:registryaddress="N/A"(2)基于扩展点的Ativ机制,通过UR的"isty://"协议头识别,就会调用RistyPtcl的xt方法,将xt参数中的提供者UR,先注册到注册中心,再重新传给Ptcl扩展点进行暴露:(1)(2)(2)基于扩展点的Ativ机制,通过提供者UR的"://"协议头识别,就会调用DPtcl的f方法,得到提供者引用。然后RistyPtcl将多个提供者引用,通过Clst扩展点,伪装成单个提供者引用返回。(+)作者(来自开源社区首先SvicCfi类拿到对外提供服务的实际类f如:HllWlIl然后通过Pxycty类的tIvk方法使用f生成一个AstctPxyIvk实例,到这一步就完成具体服务到Ivk的转化。接下来就是Ivk转换到Ext的过程。Dubbo的实满眼都是由于Ivk是D领域模型中非常重要的一个概念,很多设计思路都是向它靠拢。这就使得Ivk渗透在整个实现代码里,对于刚开始接触D的人,确实容易给搞混了。publicclassDemoClientActionprivateDemoServicepublicvoidsetDemoService(DemoService{this.demoService=}publicvoidstart()Stringhello=demoService.sayHello("world"+}}RmiInvokerWebServiceInvoker中的任何一个),而该Invoker实现了真正的远程服务调用。publicclassDemoServiceImplimplementsDemoServicepublicStringsayHello(Stringname)throws{return"Hello"+}}(+)}(+)all,direct,message,execution,connectionfixed,SPI参考(+)(+)(1)(2)publicinterfaceProtocol暴露远 协议在接收请求时,应记录请求来源方(2)publicinterfaceProtocol暴露远 协议在接收请求时,应记录请求来源方地 export()必须是幂等的,也就是暴露同一个URL的Invoker两次,和暴露一次没有区别。3.export()传入的Invoker由框架实现并传入,协议不需要关心。*@param<T>@paraminvoker@returnexporter暴露服务的引用,用于取消暴@throwsRpcException当暴露服务出错时抛出,比如端口已占<T>Exporter<T>export(Invoker<T>invoker)throws*引用远****当用户调用refer()所返回的Invoker对象的invoke()方法时,协议需相应执行同URL远端export()传入的Invoker对象的invoke()方法。refer()返回的Invoker由协议实现,协议通常需要在此Invoker中发送远程请求。当url中有设置check=false时,连接失败不能抛出异常,需内部自动恢复。@param<T>@paramtype@paramurl远程服务的URL@returninvoker服务的本地代@throwsRpcException当连接服务提供方失败时抛<T>Invoker<T>refer(Class<T>type,URLurl)throws}(3)<dubbo:protocolid="xxx1"name="xxx"/><!‐‐声明协议,如果没有配置id,将以name为id<dubbo:serviceprotocol="xxx1"/><!‐‐引用协议,如果没有配置protocol属性,将在ApplicationContext中自动扫描protocol配<dubbo:providerprotocol="xxx1"/><!‐‐引用协议缺省值,当<dubbo:service>没有配置prototol属性时,使用此配置(4)(5)|‐XxxProtocol.java实现Protocol接口|‐XxxExporter.java实现Exporter接口|‐XxxInvoker.java实现Invoker接口|‐com.alibaba.dubbo.rpc.Protocol(纯文本文件,内容为packageimportpublicclassXxxProtocolimplementsProtocolpublic<T>Exporter<T>export(Invoker<T>invoker)throws{returnnew}public<T>Invoker<T>refer(Class<T>type,URLurl)throws{returnnewXxxInvoker(type,public<T>Exporter<T>export(Invoker<T>invoker)throws{returnnew}public<T>Invoker<T>refer(Class<T>type,URLurl)throws{returnnewXxxInvoker(type,}}packageimportpublicclassXxxExporter<T>extendsAbstractExporter<T>publicXxxExporter(Invoker<T>invoker)RemotingException{//}publicvoid{//}}packageimportpublicclassXxxInvoker<T>extendsAbstractInvoker<T>publicXxxInvoker(Class<T>type,URLurl)RemotingException{super(type,}protectedabstractObjectdoInvoke(Invocationinvocation)throwsThrowable//}}(+)(1)服务提供方和服务消费方调用过程拦截,D比如:filt="xxx,flt,yyy",表示xxx在缺省filt之前,yyy在缺省filt之后。特殊符号,表示剔除。比如:<dubbo:providerfilter="xxx,yyy"/>和<dubbo:servicefilter="aaa,bbb,则xxx,yyy,aaa,bbb均会生效。如果要覆盖,需配置:<dubbo:servicefilter="-xxx,-yyy,aaa,bbb"/>(2)(3)<dubbo:referencefilter="xxx,yyy"/><!‐‐消费方调用过程拦截<dubbo:consumerfilter="xxx,yyy"/><!‐‐消费方调用过程缺省拦截器,将拦截所有reference<dubbo:servicefilter="xxx,yyy"/><!‐‐提供方调用过程拦截<dubbo:providerfilter="xxx,yyy"/><!‐‐提供方调用过程缺省拦截器,将拦截所有service(4)(5)|‐XxxFilter.java实现Filter接口|‐com.alibaba.dubbo.rpc.Filter(纯文本文件packageimport(5)|‐XxxFilter.java实现Filter接口|‐com.alibaba.dubbo.rpc.Filter(纯文本文件packageimportcom.alibaba.dubbo.rpc.Filter;importcom.alibaba.dubbo.rpc.Invoker;importcom.alibaba.dubbo.rpc.Invocation;importcom.alibaba.dubbo.rpc.Result;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxFilterimplementsFilterpublicResultinvoke(Invoker<?>invoker,Invocationinvocation)throwsRpcException//beforefilterResultresult=//afterfilterreturn}}(+)(1)(2)(3)<dubbo:referencelistener="xxx,yyy"/><!‐‐引用服务监听<dubbo:consumerlistener="xxx,yyy"/><!‐‐引用服务缺省监听器(4)(5)|‐XxxInvokerListener.java(实现InvokerListener接口|‐com.alibaba.dubbo.rpc.InvokerListener纯文本文件,内packageimportcom.alibaba.dubbo.rpc.InvokerListener;importcom.alibaba.dubbo.rpc.Invoker;import(5)|‐XxxInvokerListener.java(实现InvokerListener接口|‐com.alibaba.dubbo.rpc.InvokerListener纯文本文件,内packageimportcom.alibaba.dubbo.rpc.InvokerListener;importcom.alibaba.dubbo.rpc.Invoker;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxInvokerListenerimplements{publicvoidreferred(Invoker<?>invoker)throws{//}publicvoiddestroyed(Invoker<?>invoker)throwsRpcException//}}(+)(1)(2)(3)<dubbo:servicelistener="xxx,yyy"/><!‐‐暴露服务监听<dubbo:providerlistener="xxx,yyy"/><!‐‐暴露服务缺省监听器(4)(5)|‐XxxExporterListener.java(实现ExporterListener接口|‐com.alibaba.dubbo.rpc.ExporterListener纯文本文件,内packageimportcom.alibaba.dubbo.rpc.ExporterListener;importcom.alibaba.dubbo.rpc.Exporter;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxExporterListenerimplements{publicvoidexported(Exporter<?>exporter)|‐com.alibaba.dubbo.rpc.ExporterListener纯文本文件,内packageimportcom.alibaba.dubbo.rpc.ExporterListener;importcom.alibaba.dubbo.rpc.Exporter;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxExporterListenerimplements{publicvoidexported(Exporter<?>exporter)throws{//}publicvoidunexported(Exporter<?>exporter)throwsRpcException//}}(+)(1)(2)(3)<dubbo:protocolcluster="xxx"<dubbo:providercluster="xxx"/><!‐‐缺省值配置,如果<dubbo:protocol>没有配置cluster时,使用此配(4)(5)|‐XxxCluster.java实现Cluster接口|‐com.alibaba.dubbo.rpc.cluster.Cluster纯文本文件,内packageimportimportimportcom.alibaba.dubbo.rpc.cluster.Directory;importcom.alibaba.dubbo.rpc.cluster.LoadBalance;importcom.alibaba.dubbo.rpc.Invoker;importcom.alibaba.dubbo.rpc.Invocation;importcom.alibaba.dubbo.rpc.Result;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxClusterimplementsClusterpublic<T>Invoker<T>merge(Directory<T>directory)importimportimportcom.alibaba.dubbo.rpc.cluster.Directory;importcom.alibaba.dubbo.rpc.cluster.LoadBalance;importcom.alibaba.dubbo.rpc.Invoker;importcom.alibaba.dubbo.rpc.Invocation;importcom.alibaba.dubbo.rpc.Result;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxClusterimplementsClusterpublic<T>Invoker<T>merge(Directory<T>directory)throws{returnnewAbstractClusterInvoker<T>(directory)publicResultdoInvoke(Invocationinvocation,List<Invoker<T>>invokers,LoadBalanceloadbalance)throwsRpcException//}}}(+)(1)(2)(3)<dubbo:protocolrouter="xxx"<dubbo:providerrouter="xxx"<!‐‐缺省值设置,当<dubbo:protocol>没有配置loadbalance时,使用此配(4)(5)|‐XxxRouterFactory.java(实现LoadBalance接口|‐com.alibaba.dubbo.rpc.cluster.RouterFactory(纯文本文件,内packageimportimportcom.alibaba.dubbo.rpc.Invoker;importcom.alibaba.dubbo.rpc.Invocation;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxRouterFactoryimplementsRouterFactorypublic<T>List<Invoker<T>>select(List<Invoker<T>>invokers,Invocationinvocation)throwsRpcException//}}(+)(1)(2)(3)public<T>List<Invoker<T>>select(List<Invoker<T>>invokers,Invocationinvocation)throwsRpcException//}}(+)(1)(2)(3)<dubbo:protocolloadbalance="xxx"<dubbo:providerloadbalance="xxx"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置loadbalance时,使用此配(4)(5)|‐XxxLoadBalance.java(实现LoadBalance接口|‐com.alibaba.dubbo.rpc.cluster.LoadBalance纯文本文件,内容packageimportimportcom.alibaba.dubbo.rpc.Invoker;importcom.alibaba.dubbo.rpc.Invocation;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxLoadBalanceimplementsLoadBalancepublic<T>Invoker<T>select(List<Invoker<T>>invokers,Invocationinvocation)throwsRpcException//}}(+)(1)(2)(3)<dubbo:methodmerger="xxx"(4)(5)|‐XxxMerger.java实现(+)(1)(2)(3)<dubbo:methodmerger="xxx"(4)(5)|‐XxxMerger.java实现Merger接口(纯文本文件,内容packageimportpublicclassXxxMerger<T>implementsMerger<T>publicTmerge(T...results)//}}(+)(1)(2)(3)<dubbo:registryid="xxx1"address="xxx://ip:port"/><!‐‐定义注册<dubbo:registryid="xxx1"address="xxx://ip:port"/><!‐‐定义注册中心<dubbo:serviceregistry="xxx1"/><!‐‐引用注册中心,如果没有配置registry属性,将在ApplicationContext中自动扫描registry配置<dubbo:providerregistry="xxx1"/><!‐‐引用注册中心缺省值,当<dubbo:service>没有配置registry属性时,使用此配置(4)publicinterfaceRegistryFactory连接注册中心*连接注册中心需处理契约1.当设置check=false时表示不检查连接,否则在连接不上时抛出异常。2.支持URL上的username:password权限认证。3.支持backup=0备选注册中心集群地址。4.支持file=registry.cache本地磁盘文件缓存。5.支持timeout=1000请求超时设置。6.支持session=60000会话超时或过期设置。*@paramurl注册中心地址,不@return注册中心引用,总不返回RegistrygetRegistry(URL}publicinterfaceRegistryService{//Registryextends注册服务*注册需处理契 当URL设置了check=false时,注册失败后不报错,在后台定时重试,否则抛出异常。 当URL设置了dynamic=false参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。 当URL设置了category=overrides时,表示分类存储,缺省类别为providers,可按分类部分通知数据。4.当注册中心重启,网络抖动,不能丢失数据,包括断线自动删除数据。5.允许URI相同但参数不同的URL并存,不能覆盖。*@paramurl注册信息,不允许为空,如voidregister(URL取消注册服务*取消注册需处 如果是dynamic=false的持久存储数据,找不到注册数据,则抛IllegalStateException,否则忽略。2.按全URL匹配取消注册。*@paramurl注册信息,不允许为空,如voidunregister(URL订阅服务*订阅需处理契1.当URL设置了check=false时,订阅失败后不报错,在后台定时重试。 当URL设置了category=overrides,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。 允许以interface,group,version,classifier作为条件查 并且查询条件允许星号通配,订阅所有接口的所有分组的所有版本5.当注册中心重启,网络抖动,需自动恢复订阅请求。6.允许URI相同但参数不同的URL并存,不能覆盖。7.必须阻塞订阅过程,等第一次通知完后再返回。* 订阅条件,不允许为空,如@paramlistener变更事件监听器,不允许为voidsubscribe(URLurl,NotifyListener取消订阅服务*取消订阅需处1.如果没有订阅,直接忽略。2.按全URL匹配取消订阅。* 订阅条件,不允许为空,如@paramlistener变更事件监听器,不允许为voidunsubscribe(URLurl,NotifyListener查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次*@see 查询条件,不允许为空,如*@return已注册信息列表,可能为空,含义同{@linkcom.alibaba.dubbo.registry.NotifyListener#notify(List<URL>)}List<URL>lookup(URL}publicinterfaceNotifyListener当收到服务变*@return已注册信息列表,可能为空,含义同{@linkcom.alibaba.dubbo.registry.NotifyListener#notify(List<URL>)}List<URL>lookup(URL}publicinterfaceNotifyListener当收到服务变更通知时触发*通知需处理契***总是以服务接口和数据类型为维度全量通知,即不会通知一个服务的同类型的部分数据,用户不需要对比上一次通知结果。订阅时的第一次通知,必须是一个服务的所有类型数据的全量通知。中途变更时,允许不同类型的数据分开通知,比如:providers,consumers,routes,overrides,允许只通知其中一种类型,但该类型的数据必是全量的,不是增量的。 如果一种类型的数据为空,需通知一个empty协议并带category参数的标识性URL数据。 通知者(即注册中心实现)需保证通知的顺序,比如:单线程推送,队列串行化,带版本对比。*@paramurls已注册信息列表,总不为空,含义同{@linkcom.alibaba.dubbo.registry.RegistryService#lookup(URL)}的返回值voidnotify(List<URL>}(5)(6)|‐XxxRegistryFactoryjava(实现RegistryFactory接口|‐XxxRegistry.java实现Registry接口|‐com.alibaba.dubbo.registry.RegistryFactory(纯文本文件,内packageimportcom.alibaba.dubbo.registry.RegistryFactory;importcom.alibaba.dubbo.registry.Registry;importmon.URL;publicclassXxxRegistryFactoryimplements{publicRegistrygetRegistry(URLurl)returnnew}}packageimportcom.alibaba.dubbo.registry.Registry;importcom.alibaba.dubbo.registry.NotifyListener;importmon.URL;publicclassXxxRegistryimplements{publicvoidregister(URLurl)//}publicvoidunregister(URLurl)//}publicvoidsubscribe(URLurl,NotifyListenerlistener)//}publicvoidunsubscribe(URLurl,NotifyListenerlistener)//}}(+)(1)(2)(3)<dubbo:monitoraddresspublicvoidunsubscribe(URLurl,NotifyListenerlistener)//}}(+)(1)(2)(3)<dubbo:monitoraddress="xxx://ip:port"/><!‐‐定义监控中心(4)(5)|‐XxxMonitorFactoryjava(实现MonitorFactory接口|‐XxxMonitor.java实现Monitor接口|‐com.alibaba.dubbo.monitor.MonitorFactory纯文本文件,内容packageimportcom.alibaba.dubbo.monitor.MonitorFactory;importcom.alibaba.dubbo.monitor.Monitor;importmon.URL;publicclassXxxMonitorFactoryimplements{publicMonitorgetMonitor(URLurl)returnnew}}packageimportpublicclassXxxMonitorimplements{publicvoidcount(URLstatistics)//}}(+)(1)(2)(3)<dubbo:applicationcompiler="jdk"(4)(5)}}(+)(1)(2)(3)<dubbo:applicationcompiler="jdk"(4)(5)|‐XxxExtensionFactory.java(实现ExtensionFactory接口|‐mon.extension.ExtensionFactory(纯文本文件,内容packageimportpublicclassXxxExtensionFactoryimplementsExtensionFactorypublicObjectgetExtension(Class<?>type,Stringname)//}}(+)(1)(2)(3)<dubbo:protocolproxy="xxx"<dubbo:providerproxy="xxx"<!‐‐缺省值配置,当<dubbo:protocol>没有配置proxy属性时,使用此配(4)(2)(3)<dubbo:protocolproxy="xxx"<dubbo:providerproxy="xxx"<!‐‐缺省值配置,当<dubbo:protocol>没有配置proxy属性时,使用此配(4)(5)|‐XxxProxyFactory.java(实现ProxyFactory接口|‐com.alibaba.dubbo.rpc.ProxyFactory纯文本文件,内容packageimportcom.alibaba.dubbo.rpc.ProxyFactory;importcom.alibaba.dubbo.rpc.Invoker;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxProxyFactoryimplementsProxyFactorypublic<T>TgetProxy(Invoker<T>invoker)throwsRpcException//}public<T>Invoker<T>getInvoker(Tproxy,Class<T>type,URLurl)throwsRpcException//}}(+)(1)(2)(3)(4)(5)|‐XxxCompiler.java实现Compiler接口|‐piler.Compiler(纯文本文件,内packageimportpublicclassXxxCompiler(5)|‐XxxCompiler.java实现Compiler接口|‐piler.Compiler(纯文本文件,内packageimportpublicclassXxxCompilerimplementsCompilerpublicObjectgetExtension(Class<?>type,Stringname)//}}(+)(1)(2)(3)<dubbo:protocoldispatcher="xxx"<dubbo:providerdispatcher="xxx"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置dispatcher属性时,使用此配(4)(5)|‐XxxDispatcher.java(实现Dispatcher接口|‐com.alibaba.dubbo.remoting.Dispatcher纯文本文件,内packageimportpublicclassXxxDispatcherimplementsDispatcherpublicGrouplookup(URLurl)|‐XxxDispatcher.java(实现Dispatcher接口|‐com.alibaba.dubbo.remoting.Dispatcher纯文本文件,内packageimportpublicclassXxxDispatcherimplementsDispatcherpublicGrouplookup(URLurl)//}}(+)(1)(2)(3)<dubbo:protocolthreadpool="xxx"<dubbo:providerthreadpool="xxx"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置threadpool时,使用此配(4)(5)|‐XxxThreadPool.java(实现ThreadPool接口|‐mon.threadpool.ThreadPool(纯文本文件,内packageimportimportpublicclassXxxThreadPoolimplements{publicExecutorgetExecutor()//}}(+)(1)(2)(3)<dubbo:protocolserialization="xxx"/><!‐‐协议的序列化方式<dubbo:provider}(+)(1)(2)(3)<dubbo:protocolserialization="xxx"/><!‐‐协议的序列化方式<dubbo:providerserialization="xxx"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置serialization时,使用此(4)(5)|‐XxxSerialization.java(实现Serialization接口|‐XxxObjectInput.java(实现ObjectInput接口|‐XxxObjectOutput.java(实现ObjectOutput接口|‐mon.serialize.Serialization(纯文本文件,内容为packageimportmon.serialize.Serialization;importmon.serialize.ObjectInput;importmon.serialize.ObjectOutput;publicclassXxxSerializationimplementsSerializationpublicObjectOutputserialize(Parametersparameters,OutputStreamoutput)throws{returnnew}publicObjectInputdeserialize(Parametersparameters,InputStreaminput)throws{returnnew}}(+)(1)(2)(3)<dubbo:protocoltransporter="xxx"/><!‐‐服务器和客户端使用相同的传输(+)(1)(2)(3)<dubbo:protocoltransporter="xxx"/><!‐‐服务器和客户端使用相同的传输实现<dubbo:protocolserver="xxx"client="xxx"/><!‐‐服务器和客户端使用不同的传输实现<dubbo:providertransporter="xxx"server="xxx"client="xxx"<!‐‐缺省值设置,当<dubbo:protocol>没有配置transporter/server/client属性时,使用此配置‐‐>(4)(5)|‐XxxTransporter.java(实现Transporter接口(实现Client接口|‐com.alibaba.dubbo.remoting.Transporter纯文本文件,内packageimportpublicclassXxxTransporterimplementsTransporterpublicServerbind(URLurl,ChannelHandlerhandler)throws{returnnewXxxServer(url,}publicClientconnect(URLurl,ChannelHandlerhandler)throws{returnnewXxxClient(url,}}packageimportpublicclassXxxServerextendsAbstractServerpublicXxxServer(URLurl,ChannelHandlerhandler)RemotingException{super(url,}protectedvoiddoOpen()throwsThrowable//}protectedvoiddoClose()throwsThrowable//}publicCollection<Channel>getChannels()//}publicChannelgetChannel(InetSocketAddressremoteAddress)//}}packageimportpublicclass//}publicCollection<Channel>getChannels()//}publicChannelgetChannel(InetSocketAddressremoteAddress)//}}packageimportpublicclassXxxClientextendsAbstractClientpublicXxxServer(URLurl,ChannelHandlerhandler)RemotingException{super(url,}protectedvoiddoOpen()throwsThrowable//}protectedvoiddoClose()throwsThrowable//}protectedvoiddoConnect()throwsThrowable//}publicChannelgetChannel()//}}(+)(1)(2)(3)<dubbo:protocolexchanger="xxx"<dubbo:providerexchanger="xxx"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置exchanger属性时,使用此配(4)(5)|‐XxxExchanger.java实现Exchanger接口|‐XxxExchangeServer.java(实现ExchangeServer接口|‐XxxExchangeClient.java(实现ExchangeClient接口|‐com.alibaba.dubbo.remoting.exchange.Exchanger(纯文本文件packageimportpublicclassXxxExchangerimplementsExchangerpublicExchangeServerbind(URLurl,ExchangeHandlerhandler)throws{returnnew|‐com.alibaba.dubbo.remoting.exchange.Exchanger(纯文本文件packageimportpublicclassXxxExchangerimplementsExchangerpublicExchangeServerbind(URLurl,ExchangeHandlerhandler)throws{returnnewXxxExchangeServer(url,}publicExchangeClientconnect(URLurl,ExchangeHandlerhandler)throws{returnnewXxxExchangeClient(url,}}packageimportpublicclassXxxExchangeServerimpelementsExchangeServer//}packageimportpublicclassXxxExchangeClientimpelmentsExchangeClient//}(+)(1)(2)(3)<dubbo:protocolnetworker="xxx"<dubbo:providernetworker="xxx"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置networker属性时,使用此配(4)(5)|‐XxxNetworker.java实现Networker接口|‐com.alibaba.dubbo.remoting.p2p.Networker纯文本文件,内容packageimport|‐XxxNetworker.java实现Networker接口|‐com.alibaba.dubbo.remoting.p2p.Networker纯文本文件,内容packageimportpublicclassXxxNetworkerimplementsNetworkerpublicGrouplookup(URLurl)//}}(+)(1)(2)(3)<dubbo:protocoltelnet="xxx,yyy"<dubbo:providertelnet="xxx,yyy"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置telnet属性时,使用此配(4)(5)|‐XxxTelnetHandler.java(实现TelnetHandler接口|‐com.alibaba.dubbo.remoting.telnet.TelnetHandler(纯文本文件,内容为packageimport@Help(parameter="...",summary="...",publicclassXxxTelnetHandlerimplementsTelnetHandlerpublicStringtelnet(Channelchannel,Stringmessage)throwsRemotingExceptionpackageimport@Help(parameter="...",summary="...",publicclassXxxTelnetHandlerimplementsTelnetHandlerpublicStringtelnet(Channelchannel,Stringmessage)throwsRemotingException//}}telnet20880dubbo>xxxargs(+)(1)(2)(3)<dubbo:protocolstatus="xxx,yyy"<dubbo:providerstatus="xxx,yyy"/><!‐‐缺省值设置,当<dubbo:protocol>没有配置status属性时,使用此配(4)(5)|‐XxxStatusChecker.java(实现StatusChecker接口|‐mon.status.StatusChecker(纯文本文件packageimportpublicclassXxxStatusCheckerimplements{publicStatuscheck()//}}(+)(1)(2)importpublicclassXxxStatusCheckerimplements{publicStatuscheck()//}}(+)(1)(2)(3)javacom.alibaba.dubbo.container.Mainspringjetty(4)(5)|‐XxxContainer.java实现Container接口(纯文本文件,内packagepublicclassXxxContainerimplements{publicStatusstart()//}publicStatusstop()//}}(+)(1)(2)(3)<dubbo:protocolpage="xxx,yyy"<dubbo:providerpage="xxx,yyy"<!‐‐缺省值设(+)(1)(2)(3)<dubbo:protocolpage="xxx,yyy"<dubbo:providerpage="xxx,yyy"<!‐‐缺省值设置,当<dubbo:protocol>没有配置page属性时,使用此(4)(5)|‐XxxPageHandler.java(实现PageHandler接口|‐com.alibaba.dubbo.container.page.PageHandler(纯文本文件packageimportpublicclassXxxPageHandlerimplementsPageHandlerpublicGrouplookup(URLurl)//}}(+)(1)(2)(3)<dubbo:servicecache="lru"<dubbo:service><dubbo:methodcache="lru"/></dubbo:service><!‐‐方法级缓存<dubbo:providercache="xxx,yyy"/><!‐‐缺省(3)<dubbo:servicecache="lru"<dubbo:service><dubbo:methodcache="lru"/></dubbo:service><!‐‐方法级缓存<dubbo:providercache="xxx,yyy"/><!‐‐缺省值设置,当<dubbo:service>没有配置cache属性时,使用此配置(4)(5)|‐XxxCacheFactory.java(实现StatusChecker接口|‐com.alibaba.dubbo.cache.CacheFactory纯文本文件,内容packageimportpublicclassXxxCacheFactoryimplements{publicCachegetCache(URLurl,Stringname)returnnewXxxCache(url,}}packageimportpublicclassXxxCacheimplementsCachepublicCache(URLurl,Stringname)//}publicvoidput(Objectkey,Objectvalue)//}publicObjectget(Objectkey)//}}(+)(1)(2)(3)<dubbo:servicevalidation="xxx,yyy"<dubbo:providervalidation="xxx,yyy"/><!‐‐缺省值设置,当<dubbo:service>没有配置validation属性时,使用此配(4)(3)<dubbo:servicevalidation="xxx,yyy"<dubbo:providervalidation="xxx,yyy"/><!‐‐缺省值设置,当<dubbo:service>没有配置validation属性时,使用此配(4)(5)|‐XxxValidation.java(实现Validation接口|‐com.alibaba.dubbo.validation.Validation(纯文本文件packageimportpublicclassXxxValidationimplementsValidationpublicObjectgetValidator(URLurl)//}}packageimportpublicclassXxxValidatorimplementsValidatorpublicXxxValidator(URLurl)//}publicvoidvalidate(Invocationinvocation)throwsException//}}(+)(1)(2)(3)<dubbo:applicationlogger="xxx"(4)(5)|‐XxxLoggerAdapter.java(实现LoggerAdapter接口|‐mon.logger.LoggerAdapter(纯文本<dubbo:applicationlogger="xxx"(4)(5)|‐XxxLoggerAdapter.java(实现LoggerAdapter接口|‐mon.logger.LoggerAdapter(纯文本文件packageimportpublicclassXxxLoggerAdapterimplementsLoggerAdapterpublicLoggergetLogger(URLurl)//}}packageimportpublicclassXxxLoggerimplementsLoggerpublicXxxLogger(URLurl)//}publicvoidinfo(Stringmsg)//}//}技术兼容性测(+)D所以,我们需要对核心扩展点写TCKTechnologyCompatibilityKit),用户增加一种扩展实现,只需通过TCK,即可确保与框架的其它部分兼容运行,可以有效提高整体健Protocol(+)Registry(+)公共契Protocol(+)Registry(+)公共契(+)坏味(+)URL转?获取注册中心:url.setProtocol(url.getParameter("registrydubbo"))获取注册中心:url.setProtocol(url.getParameter("registrydubbo"))获取路由器:url.setProtocol(url.getParameter("router"script"))path服务路径group服务分组tokentimeout1.path服务路径group服务分组tokentimeout1.Extsi加载扩展点时,会检查扩展点的属性(通过st方法判断),如该属性是扩展点类型,则会注入扩展点对象。因为注入时不能确定使用哪个扩展点(在使用时确定),所以注入的是一个自适应扩展(一个代理)。自适应扩展点调用时,选取一个真正的扩展点,并代理到其上完成调用。D是根据调用方法参数(上面有调用哪个扩展点的信息)来选取一个真正的扩展点。在D给定所有的扩展点上调用都有UR参数(整个扩展点网的上下文信息)。自适应扩展即是从UR确定要调用哪个扩展点实现。UR哪个Ky的Vl用来确定使用哪个扩展点,这个信息通过的@Ativ注解在方法上说明。publicinterfaceCar@Adaptive({"98/wiki/display/dubbo/car.type",publicrun(URLurl,Type1arg1,Type2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 假山施工合同承包书
- 房屋建筑工程保修合同协议
- 影视制作与发行合作合同
- 三方消防施工合同
- 苗木种植土地承包合同
- 加气块砌筑合同协议书
- 劳务中介公司服务合同
- 温州浙江温州瑞安市人民医院招聘合同制工作人员笔试历年参考题库附带答案详解
- 法语独家商务代理合同
- 广州华商职业学院《典型企业云平台搭建》2023-2024学年第二学期期末试卷
- 家庭急救知识(异物卡喉的急救)共45张课件
- 机台异常处理规定
- 2021年苏州市职业大学职业适应性测试试题及答案解析
- DBJ∕T 13-253-2016 福建省耐腐蚀混凝土应用技术规程
- 电镀废水中各种重金属废水处理反应原理及控制条件
- 数据结构英文教学课件:chapter3 Linked Lists
- 《汽车文化》全套教案
- 会计英语专业词汇全
- 拆除工程检验批质量检验记录
- 怎样把握文章线索
- LED与金卤灯对比(共4页)
评论
0/150
提交评论