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

下載本文檔

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

文檔簡介

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

評論

0/150

提交評論