首頁(yè)用戶指南開發(fā)者文案_第1頁(yè)
首頁(yè)用戶指南開發(fā)者文案_第2頁(yè)
首頁(yè)用戶指南開發(fā)者文案_第3頁(yè)
首頁(yè)用戶指南開發(fā)者文案_第4頁(yè)
首頁(yè)用戶指南開發(fā)者文案_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

English|首頁(yè)||下載||用戶指南||開發(fā)者指南||管理員指南||培訓(xùn)文檔||常見問題解答||發(fā)布記錄||發(fā)展路線||English|首頁(yè)||下載||用戶指南||開發(fā)者指南||管理員指南||培訓(xùn)文檔||常見問題解答||發(fā)布記錄||發(fā)展路線||ProtocolTCKRegistryCallback功能sticky參(+)修改后通過PushRequest高高高高高高高高低低低高高高高低低低高低高高高高高高高高修改后通過PushRequest高高高高高高高高低低低高高高高低低低高低高高高高高高高高低低低低低版本管(+)2個(gè)版本并行開#版本管(+)2個(gè)版本并行開#這個(gè)版本可放在SVN的Trunk#如何可行,可以推進(jìn)應(yīng)用在期望的時(shí)間點(diǎn)內(nèi)升級(jí)到GA源碼構(gòu)(+)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框架設(shè)(+)圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關(guān)系,每一層都可以剝離上層被復(fù)用,其中,Svic和Cfi層為API均為SPI。,,,serialize,數(shù)據(jù)序列化層,可復(fù)用的一些工具,擴(kuò)展接口為Serialization,ObjectInput,ObjectOutput,ThreadPool在RPC中,Protocol是核心層,也就是只要有ProtocolInvokerExporter就可以完成非透明的RPC調(diào)用,然后在Invoker的主過程上Filterserialize,數(shù)據(jù)序列化層,可復(fù)用的一些工具,擴(kuò)展接口為Serialization,ObjectInput,ObjectOutput,ThreadPool在RPC中,Protocol是核心層,也就是只要有ProtocolInvokerExporter就可以完成非透明的RPC調(diào)用,然后在Invoker的主過程上Filter,,,而Clst是外圍概念,所以Clst的目的是將多個(gè)Ivk偽裝成一個(gè)Ivk,這樣其它人只要關(guān)注Ptcl層Ivk即可,加上Clst或者去掉Clst對(duì)其它層都不會(huì)造成影響,因?yàn)橹挥幸粋€(gè)提供者時(shí),是不需要Clst的。Pxy層封裝了所有接口的透明化代理,而在其它層都以Ivk為中心,只有到了暴露給用戶使用時(shí),才用Pxy將Ivk轉(zhuǎn)成接口,或?qū)⒔涌趯?shí)現(xiàn)轉(zhuǎn)成Ivk,也就是去掉Pxy層RPC是可以R的,只是不那么透明,不那么看起來像調(diào)本地服務(wù)一樣調(diào)遠(yuǎn)程服務(wù)。而Rti實(shí)現(xiàn)是D協(xié)議的實(shí)現(xiàn),如果你選擇RI協(xié)議,整個(gè)Rti都不會(huì)用上,Rti內(nèi)部再劃為st傳輸層和Exc信息交換層,st層只負(fù)責(zé)單向消息傳輸,是對(duì)i,Ntty,izzy的抽象,它也可以擴(kuò)展UDP傳輸,而Exc層是在傳輸層之上封裝了RstRss語(yǔ)義。trStMSpctJBsWW圖中小方塊ProtocolCluster,ProxyServiceContainerRegistryMonitor代表層或模塊,藍(lán)色的表示與業(yè)務(wù)有交互,綠色的表示只對(duì)Dubbo內(nèi)部交互。圖中背景方塊Consumer,Provider,Registry,Monitor代表部署邏輯拓普節(jié)點(diǎn)。Ivk是實(shí)體域,它是DIvk是實(shí)體域,它是D的核心模型,其它模型都向它靠擾,或轉(zhuǎn)換成它,它代表一個(gè)可執(zhí)行體,可向它發(fā)起ivk調(diào)用,它有可能是一個(gè)本地的實(shí)現(xiàn),也可能是一個(gè)遠(yuǎn)程的實(shí)現(xiàn),也可能一個(gè)集群實(shí)現(xiàn)。采用ckl+Mcl,擴(kuò)展點(diǎn)(+)如果擴(kuò)展點(diǎn)加載失敗,連擴(kuò)展點(diǎn)的名稱都拿不到了。比如:JDK標(biāo)準(zhǔn)的ScitEi,通過tN?獲取腳本類型的名稱,但如果RyScitEi因?yàn)樗蕾嚨膉y.j不存在,導(dǎo)致RyScitEi類加載失敗,這個(gè)失敗原因被吃掉了,和y對(duì)應(yīng)不起來,當(dāng)用戶執(zhí)行y腳本時(shí),會(huì)報(bào)不支持y,而不是真正失敗的原因。packageimportpublicclassXxxProtocolimplemenetsProtocol//}packageimportpublicclassXxxProtocolimplemenetsProtocol//}packageimportpublicclassXxxProtocolWrapperimplemenets{ProtocolpublicXxxProtocol(Protocolprotocol){impl=protocol;//接口方法做一個(gè)操作后,再調(diào)用extension的方publicvoidrefer()//...一些操impl一些操}//}publicinterface{Car}publicinterface{Wheel}publicclassRaceCarMakerimplemenets{WheelMakerpublicsetWheelMaker(WheelMaker{this.wheelMaker=}publicCarmakeCar()//Wheelwheel=//returnnewRaceCar(wheel,}}}publicCarmakeCar()//Wheelwheel=//returnnewRaceCar(wheel,}}這里帶來另一個(gè)問題,Extsi要注入依賴擴(kuò)展點(diǎn)時(shí),如何決定要注入依賴擴(kuò)展點(diǎn)的哪個(gè)實(shí)現(xiàn)。在這個(gè)示例中,即是在多個(gè)Wlk的實(shí)現(xiàn)中要注入哪個(gè)。這個(gè)問題在下面一點(diǎn)Ativ實(shí)例中說明。這樣依賴的擴(kuò)展點(diǎn)也可以從UR拿到配置信息,所有的擴(kuò)展點(diǎn)自己定好配置的Ky后,配置信息從UR上從最外層傳入。URCk(造車者)、wlk造輪者)publicinterface{CarmakeCar(URLpublicinterface{WheelmakeWheel(URLpublicclassRaceCarMakerimplemenets{WheelMakerpublicsetWheelMaker(WheelMaker{this.wheelMaker=}publicCarmakeCar(URLurl)//Wheelwheel=//returnnewRaceCar(wheel,}}//Wheelwheel=//在D的Extsi的擴(kuò)展點(diǎn)類開對(duì)應(yīng)的Ativ實(shí)現(xiàn)是在加載擴(kuò)展點(diǎn)里動(dòng)態(tài)生成。指定提取的UR的Ky通過@Ativ注解在接口方法上提供。下面是D的st擴(kuò)展點(diǎn)的代碼:publicinterface{@Adaptive({"server",Serverbind(URLurl,ChannelHandlerhandler)throws@Adaptive({"client",Clientconnect(URLurl,ChannelHandlerhandler)throws}3.Dubbo對(duì)于集合類擴(kuò)展點(diǎn),比如:FilterInvokerListenerExportListenerTelnetHandlerStatusChecker等,importimport@Activate//無條件自動(dòng)激publicclassXxxFilterimplementsFilter對(duì)于集合類擴(kuò)展點(diǎn),比如:FilterInvokerListenerExportListenerTelnetHandlerStatusChecker等,importimport@Activate//無條件自動(dòng)激publicclassXxxFilterimplementsFilter//}importimport@Activate("xxx")//當(dāng)配置了xxx參數(shù),并且參數(shù)為有效值時(shí)激活,比如配了cache="lru",自動(dòng)激活CacheFilterpublicclassXxxFilterimplementsFilter//}importimport@Activate(group="provider",value="xxx")//只對(duì)提供方激活,group可選"provider"或publicclassXxxFilterimplementsFilter//}實(shí)現(xiàn)細(xì)(+)(+)基于.j內(nèi)的EAIN/si.ls配置,Si在遇到名稱空間時(shí),會(huì)回調(diào)DNscHl。所有的標(biāo)簽,都統(tǒng)一用DBDfiitiPs進(jìn)行解析,基于一對(duì)一屬性映射,將X標(biāo)簽解析為B對(duì)象。在SvicCfi.xt或RfcCfi.t初始化時(shí),將B對(duì)象轉(zhuǎn)換UR格式,所有B屬性轉(zhuǎn)成UR的參數(shù)。然后將URPtcl擴(kuò)展點(diǎn)Ativ機(jī)制,根據(jù)UR的協(xié)議頭,進(jìn)行不同協(xié)議的服務(wù)暴露或引用。(1)<dubbo:serviceregisrty="N/A"/>or<dubbo:registryaddress="N/A"(2)基于擴(kuò)展點(diǎn)的Ativ機(jī)制,通過UR的"isty://"協(xié)議頭識(shí)別,就會(huì)調(diào)用RistyPtcl的xt方法,將xt參數(shù)中的提供者UR,先注冊(cè)到注冊(cè)中心,再重新傳給Ptcl擴(kuò)展點(diǎn)進(jìn)行暴露:(1)(2)(2)基于擴(kuò)展點(diǎn)的Ativ機(jī)制,通過提供者UR的"://"協(xié)議頭識(shí)別,就會(huì)調(diào)用DPtcl的f方法,得到提供者引用。然后RistyPtcl將多個(gè)提供者引用,通過Clst擴(kuò)展點(diǎn),偽裝成單個(gè)提供者引用返回。(+)作者(來自開源社區(qū)首先SvicCfi類拿到對(duì)外提供服務(wù)的實(shí)際類f如:HllWlIl然后通過Pxycty類的tIvk方法使用f生成一個(gè)AstctPxyIvk實(shí)例,到這一步就完成具體服務(wù)到Ivk的轉(zhuǎn)化。接下來就是Ivk轉(zhuǎn)換到Ext的過程。Dubbo的實(shí)滿眼都是由于Ivk是D領(lǐng)域模型中非常重要的一個(gè)概念,很多設(shè)計(jì)思路都是向它靠攏。這就使得Ivk滲透在整個(gè)實(shí)現(xiàn)代碼里,對(duì)于剛開始接觸D的人,確實(shí)容易給搞混了。publicclassDemoClientActionprivateDemoServicepublicvoidsetDemoService(DemoService{this.demoService=}publicvoidstart()Stringhello=demoService.sayHello("world"+}}RmiInvokerWebServiceInvoker中的任何一個(gè)),而該Invoker實(shí)現(xiàn)了真正的遠(yuǎn)程服務(wù)調(diào)用。publicclassDemoServiceImplimplementsDemoServicepublicStringsayHello(Stringname)throws{return"Hello"+}}(+)}(+)all,direct,message,execution,connectionfixed,SPI參考(+)(+)(1)(2)publicinterfaceProtocol暴露遠(yuǎn) 協(xié)議在接收請(qǐng)求時(shí),應(yīng)記錄請(qǐng)求來源方(2)publicinterfaceProtocol暴露遠(yuǎn) 協(xié)議在接收請(qǐng)求時(shí),應(yīng)記錄請(qǐng)求來源方地 export()必須是冪等的,也就是暴露同一個(gè)URL的Invoker兩次,和暴露一次沒有區(qū)別。3.export()傳入的Invoker由框架實(shí)現(xiàn)并傳入,協(xié)議不需要關(guān)心。*@param<T>@paraminvoker@returnexporter暴露服務(wù)的引用,用于取消暴@throwsRpcException當(dāng)暴露服務(wù)出錯(cuò)時(shí)拋出,比如端口已占<T>Exporter<T>export(Invoker<T>invoker)throws*引用遠(yuǎn)****當(dāng)用戶調(diào)用refer()所返回的Invoker對(duì)象的invoke()方法時(shí),協(xié)議需相應(yīng)執(zhí)行同URL遠(yuǎn)端export()傳入的Invoker對(duì)象的invoke()方法。refer()返回的Invoker由協(xié)議實(shí)現(xiàn),協(xié)議通常需要在此Invoker中發(fā)送遠(yuǎn)程請(qǐng)求。當(dāng)url中有設(shè)置check=false時(shí),連接失敗不能拋出異常,需內(nèi)部自動(dòng)恢復(fù)。@param<T>@paramtype@paramurl遠(yuǎn)程服務(wù)的URL@returninvoker服務(wù)的本地代@throwsRpcException當(dāng)連接服務(wù)提供方失敗時(shí)拋<T>Invoker<T>refer(Class<T>type,URLurl)throws}(3)<dubbo:protocolid="xxx1"name="xxx"/><!‐‐聲明協(xié)議,如果沒有配置id,將以name為id<dubbo:serviceprotocol="xxx1"/><!‐‐引用協(xié)議,如果沒有配置protocol屬性,將在ApplicationContext中自動(dòng)掃描protocol配<dubbo:providerprotocol="xxx1"/><!‐‐引用協(xié)議缺省值,當(dāng)<dubbo:service>沒有配置prototol屬性時(shí),使用此配置(4)(5)|‐XxxProtocol.java實(shí)現(xiàn)Protocol接口|‐XxxExporter.java實(shí)現(xiàn)Exporter接口|‐XxxInvoker.java實(shí)現(xiàn)Invoker接口|‐com.alibaba.dubbo.rpc.Protocol(純文本文件,內(nèi)容為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)服務(wù)提供方和服務(wù)消費(fèi)方調(diào)用過程攔截,D比如:filt="xxx,flt,yyy",表示xxx在缺省filt之前,yyy在缺省filt之后。特殊符號(hào),表示剔除。比如:<dubbo:providerfilter="xxx,yyy"/>和<dubbo:servicefilter="aaa,bbb,則xxx,yyy,aaa,bbb均會(huì)生效。如果要覆蓋,需配置:<dubbo:servicefilter="-xxx,-yyy,aaa,bbb"/>(2)(3)<dubbo:referencefilter="xxx,yyy"/><!‐‐消費(fèi)方調(diào)用過程攔截<dubbo:consumerfilter="xxx,yyy"/><!‐‐消費(fèi)方調(diào)用過程缺省攔截器,將攔截所有reference<dubbo:servicefilter="xxx,yyy"/><!‐‐提供方調(diào)用過程攔截<dubbo:providerfilter="xxx,yyy"/><!‐‐提供方調(diào)用過程缺省攔截器,將攔截所有service(4)(5)|‐XxxFilter.java實(shí)現(xiàn)Filter接口|‐com.alibaba.dubbo.rpc.Filter(純文本文件packageimport(5)|‐XxxFilter.java實(shí)現(xiàn)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"/><!‐‐引用服務(wù)監(jiān)聽<dubbo:consumerlistener="xxx,yyy"/><!‐‐引用服務(wù)缺省監(jiān)聽器(4)(5)|‐XxxInvokerListener.java(實(shí)現(xiàn)InvokerListener接口|‐com.alibaba.dubbo.rpc.InvokerListener純文本文件,內(nèi)packageimportcom.alibaba.dubbo.rpc.InvokerListener;importcom.alibaba.dubbo.rpc.Invoker;import(5)|‐XxxInvokerListener.java(實(shí)現(xiàn)InvokerListener接口|‐com.alibaba.dubbo.rpc.InvokerListener純文本文件,內(nèi)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"/><!‐‐暴露服務(wù)監(jiān)聽<dubbo:providerlistener="xxx,yyy"/><!‐‐暴露服務(wù)缺省監(jiān)聽器(4)(5)|‐XxxExporterListener.java(實(shí)現(xiàn)ExporterListener接口|‐com.alibaba.dubbo.rpc.ExporterListener純文本文件,內(nèi)packageimportcom.alibaba.dubbo.rpc.ExporterListener;importcom.alibaba.dubbo.rpc.Exporter;importcom.alibaba.dubbo.rpc.RpcException;publicclassXxxExporterListenerimplements{publicvoidexported(Exporter<?>exporter)|‐com.alibaba.dubbo.rpc.ExporterListener純文本文件,內(nèi)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時(shí),使用此配(4)(5)|‐XxxCluster.java實(shí)現(xiàn)Cluster接口|‐com.alibaba.dubbo.rpc.cluster.Cluster純文本文件,內(nèi)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"<!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置loadbalance時(shí),使用此配(4)(5)|‐XxxRouterFactory.java(實(shí)現(xiàn)LoadBalance接口|‐com.alibaba.dubbo.rpc.cluster.RouterFactory(純文本文件,內(nèi)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"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置loadbalance時(shí),使用此配(4)(5)|‐XxxLoadBalance.java(實(shí)現(xiàn)LoadBalance接口|‐com.alibaba.dubbo.rpc.cluster.LoadBalance純文本文件,內(nèi)容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實(shí)現(xiàn)(+)(1)(2)(3)<dubbo:methodmerger="xxx"(4)(5)|‐XxxMerger.java實(shí)現(xiàn)Merger接口(純文本文件,內(nèi)容packageimportpublicclassXxxMerger<T>implementsMerger<T>publicTmerge(T...results)//}}(+)(1)(2)(3)<dubbo:registryid="xxx1"address="xxx://ip:port"/><!‐‐定義注冊(cè)<dubbo:registryid="xxx1"address="xxx://ip:port"/><!‐‐定義注冊(cè)中心<dubbo:serviceregistry="xxx1"/><!‐‐引用注冊(cè)中心,如果沒有配置registry屬性,將在ApplicationContext中自動(dòng)掃描registry配置<dubbo:providerregistry="xxx1"/><!‐‐引用注冊(cè)中心缺省值,當(dāng)<dubbo:service>沒有配置registry屬性時(shí),使用此配置(4)publicinterfaceRegistryFactory連接注冊(cè)中心*連接注冊(cè)中心需處理契約1.當(dāng)設(shè)置check=false時(shí)表示不檢查連接,否則在連接不上時(shí)拋出異常。2.支持URL上的username:password權(quán)限認(rèn)證。3.支持backup=0備選注冊(cè)中心集群地址。4.支持file=registry.cache本地磁盤文件緩存。5.支持timeout=1000請(qǐng)求超時(shí)設(shè)置。6.支持session=60000會(huì)話超時(shí)或過期設(shè)置。*@paramurl注冊(cè)中心地址,不@return注冊(cè)中心引用,總不返回RegistrygetRegistry(URL}publicinterfaceRegistryService{//Registryextends注冊(cè)服務(wù)*注冊(cè)需處理契 當(dāng)URL設(shè)置了check=false時(shí),注冊(cè)失敗后不報(bào)錯(cuò),在后臺(tái)定時(shí)重試,否則拋出異常。 當(dāng)URL設(shè)置了dynamic=false參數(shù),則需持久存儲(chǔ),否則,當(dāng)注冊(cè)者出現(xiàn)斷電等情況異常退出時(shí),需自動(dòng)刪除。 當(dāng)URL設(shè)置了category=overrides時(shí),表示分類存儲(chǔ),缺省類別為providers,可按分類部分通知數(shù)據(jù)。4.當(dāng)注冊(cè)中心重啟,網(wǎng)絡(luò)抖動(dòng),不能丟失數(shù)據(jù),包括斷線自動(dòng)刪除數(shù)據(jù)。5.允許URI相同但參數(shù)不同的URL并存,不能覆蓋。*@paramurl注冊(cè)信息,不允許為空,如voidregister(URL取消注冊(cè)服務(wù)*取消注冊(cè)需處 如果是dynamic=false的持久存儲(chǔ)數(shù)據(jù),找不到注冊(cè)數(shù)據(jù),則拋IllegalStateException,否則忽略。2.按全URL匹配取消注冊(cè)。*@paramurl注冊(cè)信息,不允許為空,如voidunregister(URL訂閱服務(wù)*訂閱需處理契1.當(dāng)URL設(shè)置了check=false時(shí),訂閱失敗后不報(bào)錯(cuò),在后臺(tái)定時(shí)重試。 當(dāng)URL設(shè)置了category=overrides,只通知指定分類的數(shù)據(jù),多個(gè)分類用逗號(hào)分隔,并允許星號(hào)通配,表示訂閱所有分類數(shù)據(jù)。 允許以interface,group,version,classifier作為條件查 并且查詢條件允許星號(hào)通配,訂閱所有接口的所有分組的所有版本5.當(dāng)注冊(cè)中心重啟,網(wǎng)絡(luò)抖動(dòng),需自動(dòng)恢復(fù)訂閱請(qǐng)求。6.允許URI相同但參數(shù)不同的URL并存,不能覆蓋。7.必須阻塞訂閱過程,等第一次通知完后再返回。* 訂閱條件,不允許為空,如@paramlistener變更事件監(jiān)聽器,不允許為voidsubscribe(URLurl,NotifyListener取消訂閱服務(wù)*取消訂閱需處1.如果沒有訂閱,直接忽略。2.按全URL匹配取消訂閱。* 訂閱條件,不允許為空,如@paramlistener變更事件監(jiān)聽器,不允許為voidunsubscribe(URLurl,NotifyListener查詢注冊(cè)列表,與訂閱的推模式相對(duì)應(yīng),這里為拉模式,只返回一次*@see 查詢條件,不允許為空,如*@return已注冊(cè)信息列表,可能為空,含義同{@linkcom.alibaba.dubbo.registry.NotifyListener#notify(List<URL>)}List<URL>lookup(URL}publicinterfaceNotifyListener當(dāng)收到服務(wù)變*@return已注冊(cè)信息列表,可能為空,含義同{@linkcom.alibaba.dubbo.registry.NotifyListener#notify(List<URL>)}List<URL>lookup(URL}publicinterfaceNotifyListener當(dāng)收到服務(wù)變更通知時(shí)觸發(fā)*通知需處理契***總是以服務(wù)接口和數(shù)據(jù)類型為維度全量通知,即不會(huì)通知一個(gè)服務(wù)的同類型的部分?jǐn)?shù)據(jù),用戶不需要對(duì)比上一次通知結(jié)果。訂閱時(shí)的第一次通知,必須是一個(gè)服務(wù)的所有類型數(shù)據(jù)的全量通知。中途變更時(shí),允許不同類型的數(shù)據(jù)分開通知,比如:providers,consumers,routes,overrides,允許只通知其中一種類型,但該類型的數(shù)據(jù)必是全量的,不是增量的。 如果一種類型的數(shù)據(jù)為空,需通知一個(gè)empty協(xié)議并帶category參數(shù)的標(biāo)識(shí)性URL數(shù)據(jù)。 通知者(即注冊(cè)中心實(shí)現(xiàn))需保證通知的順序,比如:?jiǎn)尉€程推送,隊(duì)列串行化,帶版本對(duì)比。*@paramurls已注冊(cè)信息列表,總不為空,含義同{@linkcom.alibaba.dubbo.registry.RegistryService#lookup(URL)}的返回值voidnotify(List<URL>}(5)(6)|‐XxxRegistryFactoryjava(實(shí)現(xiàn)RegistryFactory接口|‐XxxRegistry.java實(shí)現(xiàn)Registry接口|‐com.alibaba.dubbo.registry.RegistryFactory(純文本文件,內(nèi)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"/><!‐‐定義監(jiān)控中心(4)(5)|‐XxxMonitorFactoryjava(實(shí)現(xiàn)MonitorFactory接口|‐XxxMonitor.java實(shí)現(xiàn)Monitor接口|‐com.alibaba.dubbo.monitor.MonitorFactory純文本文件,內(nèi)容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(實(shí)現(xiàn)ExtensionFactory接口|‐mon.extension.ExtensionFactory(純文本文件,內(nèi)容packageimportpublicclassXxxExtensionFactoryimplementsExtensionFactorypublicObjectgetExtension(Class<?>type,Stringname)//}}(+)(1)(2)(3)<dubbo:protocolproxy="xxx"<dubbo:providerproxy="xxx"<!‐‐缺省值配置,當(dāng)<dubbo:protocol>沒有配置proxy屬性時(shí),使用此配(4)(2)(3)<dubbo:protocolproxy="xxx"<dubbo:providerproxy="xxx"<!‐‐缺省值配置,當(dāng)<dubbo:protocol>沒有配置proxy屬性時(shí),使用此配(4)(5)|‐XxxProxyFactory.java(實(shí)現(xiàn)ProxyFactory接口|‐com.alibaba.dubbo.rpc.ProxyFactory純文本文件,內(nèi)容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實(shí)現(xiàn)Compiler接口|‐piler.Compiler(純文本文件,內(nèi)packageimportpublicclassXxxCompiler(5)|‐XxxCompiler.java實(shí)現(xiàn)Compiler接口|‐piler.Compiler(純文本文件,內(nèi)packageimportpublicclassXxxCompilerimplementsCompilerpublicObjectgetExtension(Class<?>type,Stringname)//}}(+)(1)(2)(3)<dubbo:protocoldispatcher="xxx"<dubbo:providerdispatcher="xxx"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置dispatcher屬性時(shí),使用此配(4)(5)|‐XxxDispatcher.java(實(shí)現(xiàn)Dispatcher接口|‐com.alibaba.dubbo.remoting.Dispatcher純文本文件,內(nèi)packageimportpublicclassXxxDispatcherimplementsDispatcherpublicGrouplookup(URLurl)|‐XxxDispatcher.java(實(shí)現(xiàn)Dispatcher接口|‐com.alibaba.dubbo.remoting.Dispatcher純文本文件,內(nèi)packageimportpublicclassXxxDispatcherimplementsDispatcherpublicGrouplookup(URLurl)//}}(+)(1)(2)(3)<dubbo:protocolthreadpool="xxx"<dubbo:providerthreadpool="xxx"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置threadpool時(shí),使用此配(4)(5)|‐XxxThreadPool.java(實(shí)現(xiàn)ThreadPool接口|‐mon.threadpool.ThreadPool(純文本文件,內(nèi)packageimportimportpublicclassXxxThreadPoolimplements{publicExecutorgetExecutor()//}}(+)(1)(2)(3)<dubbo:protocolserialization="xxx"/><!‐‐協(xié)議的序列化方式<dubbo:provider}(+)(1)(2)(3)<dubbo:protocolserialization="xxx"/><!‐‐協(xié)議的序列化方式<dubbo:providerserialization="xxx"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置serialization時(shí),使用此(4)(5)|‐XxxSerialization.java(實(shí)現(xiàn)Serialization接口|‐XxxObjectInput.java(實(shí)現(xiàn)ObjectInput接口|‐XxxObjectOutput.java(實(shí)現(xiàn)ObjectOutput接口|‐mon.serialize.Serialization(純文本文件,內(nèi)容為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"/><!‐‐服務(wù)器和客戶端使用相同的傳輸(+)(1)(2)(3)<dubbo:protocoltransporter="xxx"/><!‐‐服務(wù)器和客戶端使用相同的傳輸實(shí)現(xiàn)<dubbo:protocolserver="xxx"client="xxx"/><!‐‐服務(wù)器和客戶端使用不同的傳輸實(shí)現(xiàn)<dubbo:providertransporter="xxx"server="xxx"client="xxx"<!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置transporter/server/client屬性時(shí),使用此配置‐‐>(4)(5)|‐XxxTransporter.java(實(shí)現(xiàn)Transporter接口(實(shí)現(xiàn)Client接口|‐com.alibaba.dubbo.remoting.Transporter純文本文件,內(nèi)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"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置exchanger屬性時(shí),使用此配(4)(5)|‐XxxExchanger.java實(shí)現(xiàn)Exchanger接口|‐XxxExchangeServer.java(實(shí)現(xiàn)ExchangeServer接口|‐XxxExchangeClient.java(實(shí)現(xiàn)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"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置networker屬性時(shí),使用此配(4)(5)|‐XxxNetworker.java實(shí)現(xiàn)Networker接口|‐com.alibaba.dubbo.remoting.p2p.Networker純文本文件,內(nèi)容packageimport|‐XxxNetworker.java實(shí)現(xiàn)Networker接口|‐com.alibaba.dubbo.remoting.p2p.Networker純文本文件,內(nèi)容packageimportpublicclassXxxNetworkerimplementsNetworkerpublicGrouplookup(URLurl)//}}(+)(1)(2)(3)<dubbo:protocoltelnet="xxx,yyy"<dubbo:providertelnet="xxx,yyy"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置telnet屬性時(shí),使用此配(4)(5)|‐XxxTelnetHandler.java(實(shí)現(xiàn)TelnetHandler接口|‐com.alibaba.dubbo.remoting.telnet.TelnetHandler(純文本文件,內(nèi)容為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"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置status屬性時(shí),使用此配(4)(5)|‐XxxStatusChecker.java(實(shí)現(xiàn)StatusChecker接口|‐mon.status.StatusChecker(純文本文件packageimportpublicclassXxxStatusCheckerimplements{publicStatuscheck()//}}(+)(1)(2)importpublicclassXxxStatusCheckerimplements{publicStatuscheck()//}}(+)(1)(2)(3)javacom.alibaba.dubbo.container.Mainspringjetty(4)(5)|‐XxxContainer.java實(shí)現(xiàn)Container接口(純文本文件,內(nèi)packagepublicclassXxxContainerimplements{publicStatusstart()//}publicStatusstop()//}}(+)(1)(2)(3)<dubbo:protocolpage="xxx,yyy"<dubbo:providerpage="xxx,yyy"<!‐‐缺省值設(shè)(+)(1)(2)(3)<dubbo:protocolpage="xxx,yyy"<dubbo:providerpage="xxx,yyy"<!‐‐缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置page屬性時(shí),使用此(4)(5)|‐XxxPageHandler.java(實(shí)現(xiàn)PageHandler接口|‐com.alibaba.dubbo.container.page.PageHandler(純文本文件packageimportpublicclassXxxPageHandlerimplementsPageHandlerpublicGrouplookup(URLurl)//}}(+)(1)(2)(3)<dubbo:servicecache="lru"<dubbo:service><dubbo:methodcache="lru"/></dubbo:service><!‐‐方法級(jí)緩存<dubbo:providercache="xxx,yyy"/><!‐‐缺省(3)<dubbo:servicecache="lru"<dubbo:service><dubbo:methodcache="lru"/></dubbo:service><!‐‐方法級(jí)緩存<dubbo:providercache="xxx,yyy"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:service>沒有配置cache屬性時(shí),使用此配置(4)(5)|‐XxxCacheFactory.java(實(shí)現(xiàn)StatusChecker接口|‐com.alibaba.dubbo.cache.CacheFactory純文本文件,內(nèi)容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"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:service>沒有配置validation屬性時(shí),使用此配(4)(3)<dubbo:servicevalidation="xxx,yyy"<dubbo:providervalidation="xxx,yyy"/><!‐‐缺省值設(shè)置,當(dāng)<dubbo:service>沒有配置validation屬性時(shí),使用此配(4)(5)|‐XxxValidation.java(實(shí)現(xiàn)Validation接口|‐com.alibaba.dubbo.validation.Validation(純文本文件packageimportpublicclassXxxValidationimplementsValidationpublicObjectgetValidator(URLurl)//}}packageimportpublicclassXxxValidatorimplementsValidatorpublicXxxValidator(URLurl)//}publicvoidvalidate(Invocationinvocation)throwsException//}}(+)(1)(2)(3)<dubbo:applicationlogger="xxx"(4)(5)|‐XxxLoggerAdapter.java(實(shí)現(xiàn)LoggerAdapter接口|‐mon.logger.LoggerAdapter(純文本<dubbo:applicationlogger="xxx"(4)(5)|‐XxxLoggerAdapter.java(實(shí)現(xiàn)LoggerAdapter接口|‐mon.logger.LoggerAdapter(純文本文件packageimportpublicclassXxxLoggerAdapterimplementsLoggerAdapterpublicLoggergetLogger(URLurl)//}}packageimportpublicclassXxxLoggerimplementsLoggerpublicXxxLogger(URLurl)//}publicvoidinfo(Stringmsg)//}//}技術(shù)兼容性測(cè)(+)D所以,我們需要對(duì)核心擴(kuò)展點(diǎn)寫TCKTechnologyCompatibilityKit),用戶增加一種擴(kuò)展實(shí)現(xiàn),只需通過TCK,即可確保與框架的其它部分兼容運(yùn)行,可以有效提高整體健Protocol(+)Registry(+)公共契Protocol(+)Registry(+)公共契(+)壞味(+)URL轉(zhuǎn)?獲取注冊(cè)中心:url.setProtocol(url.getParameter("registrydubbo"))獲取注冊(cè)中心:url.setProtocol(url.getParameter("registrydubbo"))獲取路由器:url.setProtocol(url.getParameter("router"script"))path服務(wù)路徑group服務(wù)分組tokentimeout1.path服務(wù)路徑group服務(wù)分組tokentimeout1.Extsi加載擴(kuò)展點(diǎn)時(shí),會(huì)檢查擴(kuò)展點(diǎn)的屬性(通過st方法判斷),如該屬性是擴(kuò)展點(diǎn)類型,則會(huì)注入擴(kuò)展點(diǎn)對(duì)象。因?yàn)樽⑷霑r(shí)不能確定使用哪個(gè)擴(kuò)展點(diǎn)(在使用時(shí)確定),所以注入的是一個(gè)自適應(yīng)擴(kuò)展(一個(gè)代理)。自適應(yīng)擴(kuò)展點(diǎn)調(diào)用時(shí),選取一個(gè)真正的擴(kuò)展點(diǎn),并代理到其上完成調(diào)用。D是根據(jù)調(diào)用方法參數(shù)(上面有調(diào)用哪個(gè)擴(kuò)展點(diǎn)的信息)來選取一個(gè)真正的擴(kuò)展點(diǎn)。在D給定所有的擴(kuò)展點(diǎn)上調(diào)用都有UR參數(shù)(整個(gè)擴(kuò)展點(diǎn)網(wǎng)的上下文信息)。自適應(yīng)擴(kuò)展即是從UR確定要調(diào)用哪個(gè)擴(kuò)展點(diǎn)實(shí)現(xiàn)。UR哪個(gè)Ky的Vl用來確定使用哪個(gè)擴(kuò)展點(diǎn),這個(gè)信息通過的@Ativ注解在方法上說明。publicinterfaceCar@Adaptive({"98/wiki/display/dubbo/car.type",publicrun(URLurl,Type1arg1,Type2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論