08dubbo1天02中文幫助user guide alibaba open sesame首頁用戶指南開發者管理員培訓_第1頁
08dubbo1天02中文幫助user guide alibaba open sesame首頁用戶指南開發者管理員培訓_第2頁
08dubbo1天02中文幫助user guide alibaba open sesame首頁用戶指南開發者管理員培訓_第3頁
08dubbo1天02中文幫助user guide alibaba open sesame首頁用戶指南開發者管理員培訓_第4頁
08dubbo1天02中文幫助user guide alibaba open sesame首頁用戶指南開發者管理員培訓_第5頁
已閱讀5頁,還剩98頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

首頁||||用戶指南||開發者指南||管理員指南||培訓文檔||常見問題解答||發布記錄||發展路線||社

English|

Xml配置多中心泛化API注解模型 Mavenmvndubbo:registrymvn(+)隨著互聯網的發展 應用的規模不斷擴大,常規的垂直應用架構已無法應對,分布式服務架構以及流動計算架構勢在必行,亟需一個治理系統確此時,用于簡化增刪改查工作量的數據框架(ORM)是關鍵。此時,用于加速前端頁面開發的Web框架(MVC)是關鍵。此時,用于提高機器利用率的資源調度和治理中心(SOA)當服務越來越多時,服務URL配置管理變得非常,F5硬件負載均衡器的單點壓力也越來越大。此時需要一個服務中心,動態的和發現服務,使服務的位置透明。并通過在消費方獲取服務提供方地址列表,實現軟負載均衡和Failover,降低對F5當進一步發展,服務間依賴關系變得錯蹤復雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關系。接著,服務的調用量越來越大,服務的容量問題就出來,這個服務需要多少機器支撐?什么時候該加機器?以上是Dubbo最基本的幾個需求,服務治理問題參見Provider:服務的服務提供方。Consumer:調用 Registry:服務 與發現的中心。Monitor:統計服務的調用次調和調用時間的中心服務提供者在啟動時, 中心自己提供的服務服務消費者在啟動時, 中心訂閱自己所需的服務中心返回服務提供者地址列表給消費者,如果有變更,中心將基于長連接推送變更數據給消費者服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到中心 中心交互,中心不轉發請求,壓力較小監 服務提供者 中心其提供的服務,并匯報調用時間到中心,此時間不包含網絡開 中心為對等集群,可動態增加機器部署實例,所有客戶端將自動發現新的中服務提供者無狀態,可動態增加機器部署實例,中心將推送新的服務提供者信息給消費當服務集群規模進一步擴大,帶動ITDeployer:自動部署服務的本地Repository:倉庫用于 Scheduler:調度中心基于 Admin:統一管理控制臺。<<beanid=“xxxService”class=“com.xxx.XxxServiceImpl”<beanid=“xxxAction”<propertyname=“xxxService”ref=“xxxService”在本地服務的基礎上,只需做簡單配置,即可完成化并在提供方增加服務配置<dubbo:service>,在消費方增加服務配置<dubbo:reference>。 服務<dubbo:serviceinterface=“com.xxx.XxxService”ref=“xxxService”<dubbo:referenceid=“xxxService”interface=“com.xxx.XxxService” 服務<propertyname=“xxxService”ref=“xxxService”(+)如果不想使用Spring配置,而希望通過API的方式進行調用(不推薦),請參見:API配置完整安裝步驟,請參見:示例提供者安裝(+)定義服務接口:(該接口需單獨打包,在服務提供方和消費方共享publicinterfaceDemoService{Stringsay }在服務提供方實現接口:(對服務消費方隱藏實現packagepackagepublicclassDemoServiceImplimplementsDemoServicepublicString o(String{return o"+}}用Spring配置服務<?<?xmlversion="1.0"<beans"‐ <dubbo:application o‐world‐app" 服務地址<!‐‐用dubbo協議在20880 露服務<dubbo:protocolname="dubbo"port="20880" 的服務接口和本地bean加載SpringimportimportpublicclassProviderpublicstaticvoidmain(String[]args)throwsExceptionClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext(new }}完整安裝步驟,請參見:示例消費者安裝(+)通過Spring配置服務<?<?xmlversion="1.0"<beans"‐ <dubbo:application oworld‐app" 發現服務地址<!‐‐生 加載Spring配置,并調用服務:(也可以使用IoC注入importimportimportpublicclassConsumerpublicstaticvoidmain(String[]args)throwsExceptionClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext(new DemoServicedemoService=(DemoService)context.getBean("demoService");//獲 o= o("world");//執 o}}(+)理論上Dubbo可以只依賴JDK,不依賴于任何庫運行,只需配置使用JDK相關實現策略通過mvndependency:tree>dep.log命令分析,Dubbo缺省依賴以下庫[INFO]|+‐[INFO]|+‐ [INFO]|+‐ [INFO]|+‐ [INFO]|\‐ 這里所有依賴都是換照Dubbo javassist.jarspring.jar配置解析。如果用ServiceConfig和ReferenceConfig的APInetty.jar如果<dubbo:protocolserver="mina"/>或<dubbo:protocolserver="grizzly"/>,則換成mina.jar或grizzly.jar。如果<protocolname="rmi"/>,則不需要。mina:grizzly:http:4.1.2hessian_lite:3.2.1-fixedxstream:1.4.1fastjson:zookeeper:jedis:xmemcached:jchart:hessian:jetty:hbernate-validator:4.2.0.Finalzk:0.1curator:cxf:thrift:servlet:bsf:validation-api:1.0.0.GAjcache:0.4(+)參數驗證,JSR303泛化實現,無需業務接口類實現任意接口,用于Mock通知,在調用執行前后觸需中心支需中心支需中心支需中心支JTA/XAdubbo-2.3.3以上版本(推薦使用心中去中心化,不需要安裝中Dogfooding,中心本身也是一個標準的RPC服支持JChart統計報AlRmi可與原生RMI互操作,基于TCP偶爾會連接失敗,需重建AlHessian可與原生Hessian互操作,基于HTTPJBoss的NIO框架,性能較好(推薦使用一次請求派發兩種,需無Al老牌NIOAlSun的NIO框架,應用于GlassFish線程池不可擴展,Filter性能較好,多語言支持(推薦使用HssiHssi,D嵌了ssi..的源碼AlO純文本,可跨語言解析,缺省采用FastJsonJava通過字節碼生成代替反射,性能比較好(推薦使用java-XX:PermSize=128mAlJDKFailoverAlFailfastAlFailsafeForking需要浪費服務資隨機,按權重設置隨機概率(推薦使用Al情Al基于引擎的路由規則,功能強自動加載META- 下的所有Spring配AlJetty啟動一個內嵌JettyAlLog4j用戶不能控制log4jAl(+)(+)配置項說明詳細配置項,請參見:配置參考手冊API使用說明如果不想使用Spring配置,而希望通過API的方式進行調用,請參見:API配置配置使用說明想知道如何使用配置,請參見:快速啟動<?xmlversion="1.0"<beans"‐ <dubbo:application o‐world‐app"<dubbo:protocolname="dubbo"port="20880"所有者支持自定義參數,用于不同擴展點實現的特殊配置。<<dubbo:protocol<dubbo:parameterkey="queue""或:(2.1.0開始支持注意:xmlns:p=""<<beans""<dubbo:protocolname="jms""<dubbo:service/>服務配置,用于一個服務,定義服務的元信息,一個服務可以用多個協議,一個服務也可以到多個中心<dubbo:reference/>配置,用于創建一個服務,一個可以指向多個中心<dubbo:protocol/>協議配置,用于配置提供服務的協議信息,協議由提供方指定,消費方接受<dubbo:application/><dubbo:module/> 中心配置,用于配置連 中心相關信息<dubbo:monitor/ 中心配置,用于配置連 中心相關信息,可選<dubbo:provider/>提供方的缺省值,當ProtocolConfig和ServiceConfig<dubbo:consumer/>消費方缺省配置,當ReferenceConfig<dubbo:method/>方法配置,用于ServiceConfig和ReferenceConfig<dubbo:argument/>其中,服務提供方配置,通過URL經由中心傳遞給消費方理論上ReferenceConfig的非服務標識配置,在ConsumerConfig,ServiceConfig,ProviderConfig(+)根 rors配。根 rrr,可將XML配置的名,加屬性名,用點分隔,多個屬性拆成多行比如:=foo等價于<dubbo:applicationname="foo"/>"/>如果XML有多行同名配置,可用id號區分,如果沒有id號將對所有同名生效比如:tocol.rmi.port=1234等價于<dubbo:protocolid="rmi"name="rmi"port="1099"/>(協議的id沒配時,缺省使用協議名作為比如:dubbo.registry..address=0:9090等價于<dubbo:registryid=""address="0:9090"Properties最后,相當于缺省值,只有XML沒有配置時,perties的相應配置會生效,通常用于共享公共配置,比如應用名(+)2.2.1publicclassFooServiceImplimplementsFooService//}公共信息,也可以用pertiesimport publicclassBarAction}公共信息,也可以用perties也可以使用:(等價于前面的:<dubbo:annotationpackage="com.foo.bar.service"/>) ponent‐scan 及以后版本支持 ponent-scan,如果用的是Spring2.0及以前版本,需配置<beanid="barService"class="com.foo.BarServiceImpl"(+)API使用范圍API僅用于OpenAPI,ESB,Test,Mock等系統集成,普通服務提供方或消費方,請采用配置方式使用Dubbo,請參見:Xml配置API屬性含義參考API屬性與配置項一對一,各屬性含義,請參見:配置參考手冊比如:ApplicationConfig.setName("xxx")對應<dubbo:applicationname="xxx"/>importcom.alibaba.dubbo.rpc.config.RegistryConfig;importcom.alibaba.dubbo.rpc.config.ProviderConfig;importcom.alibaba.dubbo.rpc.config.ServiceConfig;importcom.xxx.XxxService;importXxxServicexxxService=newApplicationConfigapplication=newApplicationConfig();//連 RegistryConfigregistry=newRegistryConfig();ProtocolConfigprotocol=newProtocolConfig(); ServiceConfig<XxxService>service=newServiceConfig<XxxService>();//此實例很重,封裝了與 service.setRegistry(registry);//多個 service.setProtocol(protocol);//多個協議可以用setProtocols() importcom.alibaba.dubbo.rpc.config.RegistryConfig;importcom.alibaba.dubbo.rpc.config.ConsumerConfig;importcom.alibaba.dubbo.rpc.config.ReferenceConfig;importcom.xxx.XxxService;ApplicationConfigapplication=newApplicationConfig();//連 RegistryConfigregistry=newRegistryConfig(); ReferenceConfig<XxxService>reference=newReferenceConfig<XxxService>();//此實例很重,封裝了與 reference.setRegistry(registry);//多個 XxxServicexxxService=reference.get();//注意: (3.1)List<MethodConfig>methods=newArrayList<MethodConfig>();MethodConfigmethod=newMethodConfig();ReferenceConfig<XxxService>reference=newReferenceConfig<XxxService>();//此實例很重,封裝了 中心的連接以及與//(3.2)ReferenceConfig<XxxService>reference=newReferenceConfig<XxxService>();//此實例很重,封裝了與中心的連接以及與提 // (+)想完整的運行起來,請參見:快速啟動(+),這里只列出各種場景的配置方式以下示例全部使用基于Spring的Xml配置(+)作為參考,如果不想使用Spring,而希望通過API的方式進行調用,請參見:API配置(+)(+)Dubbo缺省會在啟動時檢查依賴的服務是否可用,不可用時會拋出異常,Spring初始化完成,以便上線時,能及早發現問題,默認如果你的Spring容器是懶加載的,或者通過API編程延遲服務,請關閉check,否則服務臨時不可用時,會拋出異常,拿到null引用,如果check=false,總是會返回,當服務恢復時,能自動連上。關閉某個服務的啟動時檢查:(沒有提供者錯)關閉所有服務的啟動時檢查:(沒有提供者錯<<dubbo:consumercheck="false"關閉中心啟動時檢查:(訂閱失敗錯<<dubbo:registrycheck="false"dd也可以用-Djavajavajavajavajava注意區別dubbo.reference.check=false,強制改變所有reference的check值,就算配置中 ,也會被覆蓋dubbo.consumer.check=false,是設置check的缺省值,如果配置中有顯式 ,如:<dubbo:referencecheck="true"/>,會受影響 (+)在集群調用失敗時,Dubbo提供了多種容錯方案,缺省為failover重試。這里的Invoker是Provider的一個可調用Service的抽象,Invoker封裝了Provider地址及Service LoadBalance負責從多個Invoker可通過retries="2"來設置重試次數(不含第一次)ForkingBroadcast重試次數配置如:(failover集群模式生效<<dubbo:serviceretries="2"<<dubbo:referenceretries="2"<dubbo:methodname="findFoo"retries="2"<<dubbo:servicecluster="failsafe"<<dubbo:referencecluster="failsafe"(+)RandomRoundRobinConsistentHash一致性Hash算法參見:/wiki/Consistent_hashing。缺省只對第一個參數Hash,如果要修改,請配置<dubbo:parameterkey="hash.arguments"value="0,1"/>缺省用160份虛擬節點,如果要修改,請配置<dubbo:parameterkey="hash.nodes"value="320"/><<dubbo:service<dubbo:methodname="..."<<dubbo:reference<dubbo:methodname="..."(+)處理線程說明all所有消息都派發到線程池,包括請求,響應,連接,斷開,心跳等direct所有消息都不派發到線程池,全部在IOmessage只有請求響應消息派發到線程池,其它連接斷開,心跳等消息,直接在IO線程上執行execution只請求消息派發到線程池,不含響應,響應和其它連接斷開,心跳等消息,直接在IO線程上執行connection在IO線程上,將連接斷開放入隊列,有序逐個執行,其它消息派發到線程池cached緩存線程池,空閑一分鐘自動刪除,需要時重建。limited可伸縮線程池,但池中的線程數只會增長不會收縮。(為避免收縮時突然來了大流量引起的性能問題)<<dubbo:protocolname="dubbo"dispatcher="all"threadpool="fixed"threads="100"(+)點對點直聯方式,將以服務接口為單位,忽略中心的提供者列表,A接口配置點對點,不影響B接口從中心獲取列表在JVM啟動參數中加入-D(key為服務名,value為服務提供者url,此配置優先級最高,1.0.15及以上版本支持javajava注意為了避免復雜化線上環境,不要上使用這個功能,只應在測試階段使用javajava然后在映射文件perties(key為服務名,value為服務提供者注意為了避免復雜化線上環境,不 上使用這個功能,只應在測試階段使用(+)問題解決方案可以讓服務提供者開發方,只訂閱服務(開發的服務可能依賴其它服務),而不正在開發的服務,通過直連測試正在開發的服務禁用配置只(+)問題 的其它應用都需要依賴此服務,所以需要將服務同時到兩個 解決方案可以讓服務提供者方,只服務到另一中心,而不從另一中心訂閱服務(+)有時候希望人工管理服務提供者的上線和下線,此時需將中心標識為非動態管理模式。服務提供者初次時為禁用狀態,需人工啟用,斷線時,將不會被自動刪除,需人工禁用如果是一個 獨立提供者,比如memcached等,可以直接向中心寫入提供者地址信息,消費者正常使用(通常 中心頁面等調用Registryregistry=registryFactory.getRegistry(URL.valueOf("zookeeper://0:2181")); (+)<?xmlversion="1.0"<beansxmlns=""‐ <dubbo:applicationname="world" o1234"<dubbo:protocolname="dubbo"port="20880"<dubbo:protocolname="rmi"port="1099" 服務 oService"version="1.0.0" oService"<!‐‐使用rmi協 服務 多協議服比如:需要與http<?<?xmlversion="1.0"<beansxmlns=""‐ <dubbo:applicationname="world" o1234"<dubbo:protocolname="dubbo"port="20880"<<dubbo:protocolname="hessian"port="8080" 服務<dubbo:serviceid=" oService"interface="com.alibaba. protocol="dubbo,hessian"/>多中(+)可以自行擴展中心,參見:中心擴多中比如:中文站有些服務來不及在青島部署,只在杭州部署,而青島的其它應用需要此服務,就可以將服務同時到兩個中心<?<?xmlversion="1.0"<beansxmlns=""‐ <dubbo:applicationname="world"<!‐‐ 中心配置<!‐‐向多 <dubbo:serviceinterface="com.alibaba. oService"version="1.0.0"ref=" registry="hangzhouRegistry,qingdaoRegistry"/>比如:有些服務是專門為國際站設計的,有些服務是專門為中文站設計的<?<?xmlversion="1.0"<beansxmlns=""‐ <dubbo:applicationname="world"<!‐‐ 中心配置 <dubbo:serviceinterface="com.alibaba. oService"version="1.0.0"ref=" Registry"/> <dubbo:serviceinterface="com.alibaba. registry="intlRegistry"/>多中心比如:需同時調用中文站和國際站的PC2服務,PC2在中文站和國際站均有部署,接口及版本號都一樣,但連的數據庫不一樣<?<?xmlversion="1.0"<beansxmlns=""‐ <dubbo:applicationname="world"<!‐‐ 中心配置 中文站服務<dubbo:referenceid=" Registry"/> registry="intlRegistry"/>oService" oService"如果只是測試環境臨時需要連接兩個不同中心,使用豎號分隔多個不同中心地址<?xmlversion="1.0" ‐ <dubbo:applicationname="world"<!‐‐服務(+)當一個接口有多種實現時,可以用group區分。任意組:(2.2.0以上版本支持,總是只調一個可用組的實現(+)當一個接口實現,出現不兼容升級時,可以用版本號過渡,版本號不同的服務相互間 不區分版本:(2.2.0以上版本支持(+)從2.1.0版本開始支持代碼參見 /albaba/dubbo/tree/master/dubbo-test/dubbo-test- /al配置如:(搜索所有分組<<dubbo:reference Service"group="*"merger="true"或:(合并指定分組 或:(指定方法合并結果,其它未指定的方法,將只調用一個 Service"<dubbo:method Items"merger="true"或:(某個方法不合并結果,其它都合并結果 Service"group="*"<dubbo:method Items"merger="false" Service"<dubbo:method Items"merger="mymerge"或:(指定合并方法,將調用返回結果的指定方法進行合并,合并方法的參數類型必須是返回結果類型本身 Service"<dubbo:method Items"merger=".addAll"(+)參數驗證功能是基于JSR303實現的,用戶只需標識JSR303標準的驗證Annotation,并通過filter來實現驗證。2.1.0以上版本支持完整示例代碼參見 /alibaba/dubbo/tree/master/dubbo-test/dubbo-test- importimportjavax.validation.constraints.Future;importjavax.validation.constraints.Max;importjavax.validation.constraints.Min;importjavax.validation.constraints.Past;importjavax.validation.constraints.Size;publicclassValidationParameterimplementsSerializableprivatestaticfinallongserialVersionUID= @NotNull//不允許為空@Size(min1max20privateString@NotNull(groups=ValidationService.Save.class)//保存時不允許為空,更新時允許為空,表示不更新該字段privateString;@Min(18)//最小值privateintage;privateDateprivateDatepublicString{return}publicvoidsetName(String{=};public ;{}publicvoid (String{ }publicint{return}publicvoidsetAge(int{this.age=}}publicDate{return}publicvoidsetLoginDate(Date{this.loginDate=}publicDate{return}publicvoidsetExpiryDate(Date{this.expiryDate=}}publicpublicinterfaceValidationService缺省可按服務接口區分驗證場景,如:@NotNull(groupsValidationService.class)@interfaceSave{}//與方法同名接口,首字母大寫,用于區分驗證場景,如:@NotNull(groups=voidsave(ValidationParameter}publicinterfaceValidationService{@interfacevoidsave(ValidationParameter@interfacevoidupdate(ValidationParameter}importimportpublicinterfaceValidationServicevoidsave(@NotNullValidationParameterparameter);voiddelete(@Min(1intid);}validation="true"/>validation="true"/>importimportimportimportimportcom.alibaba.dubbo.examples.validation.api.ValidationService;importcom.alibaba.dubbo.rpc.RpcException;publicclassValidationConsumerpublicstaticvoidmain(String[]args)throwsExceptionStringconfig= ce('.','/')+ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext(config);ValidationServicevalidationService=//tryparameter=newValidationParameter();catch(RpcExceptione)拋出的是=)//}}}(+)結果緩存,用于加速熱門數據的速度,Dubbo提供式緩存,以減少用戶加緩存的工作量。2.1.0以上版本支持 /albaba/dubbo/tree/master/dubbo-test/dubbo-test-examples/ lru基于最近最少使用原則刪除多余緩存,保持最熱的數據被緩存。threadlocal當前線程緩存,比如一個頁面渲染,用到很多portal,每個portal都要去查用戶信息,通過線程緩存,可以減少這種多余<<dubbo:reference<dubbo:methodname="findBar"cache="lru"泛化(+)泛接口調用方式主要用于客戶端沒有API接口及模型類元的情況,參數及返回值中的所有POJO均用Map表示,通常用于框架集成,比GenericServicebarService=(GenericService)Objectresult= o",newString[]{"java.lang.String"},newObject[]{"World"importReferenceConfig<GenericService>referencenewReferenceConfig<GenericService>(該實例很重量,里面封裝了所有與reference.setGeneric(true);// =();//Objectresult= o",newString[]{"java.lang.String"},newObject[]//用Map表示POJO參數,如果返回值為POJO也將自動轉成MapMap<String,Object> =newHashMap<String,Object>();.put("name",Objectresult=",new"new 假設存在POJOpackagepackagepublic Impl{privateStringname;privateStringpassword;publicStringgetName(){return}publicvoidsetName(String{=}publicString{return}publicvoidsetPassword(String{this.password=}}則POJO== 可用下面MapMap<String,Map<String,Object>map=newHashMap<String,, map.put("name",(+)泛接口實現方式主要用于服務器端沒有API接口及模型類元的情況,參數及返回值中的所有POJO均用Map表示,通常用于框架集成,packagepublicclassMyGenericServiceimplementsGenericServicepublicObject$invoke(StringmethodName,String[]parameterTypes,Object[]args)throws{if o".equals(methodName))return e"+}}}GenericServicexxxServicenewXxxGenericService用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口ServiceConfig<GenericService>service=newServiceConfig<GenericService>();//該實例很重量,里面封裝了所有與 (+)回聲測試用于檢測服務是否可用,回聲測試按照正常請求流程執行,能夠測試整個調用是否通暢,可用于。所有服務自動實現EchoService接口,只需將任意服務強制為EchoService,即可使用。MemberServicememberService=ctx.getBean("memberService");// EchoServiceechoService=(EchoService)memberService;//強制 Stringstatus=echoService.$echo("OK");//回聲測試可用性(+)上下文中存放的是當前調用過程中所需的環境信息。所有配置信息都將轉換為URL的參數,參見《配置項一覽表》中的“對應URL參數”注意RpcContext是一個ThreadLocal的臨時狀態記錄器,當接收到RPC請求,或發起RPC請求時,RpcContext比如:A調B,B再調C,則B機器上,在B調C之前,RcCtxt記錄的是A調B的信息,在B調C之后,RcCtxt記錄的是B調C的信息。xxxService.xxxxxxService.xxx booleanisConsumerSideRpcContext.getContext().isConsumerSide本端是否為消費端,這里會返回trueStringserverIP=RpcContext.getContext().getRemoteHost();//獲取最后一次調用的提供方IP地址StringapplicationRpcContext.getContext().getUrl().getParameter("application"獲取當前服務配置信息,所有配置信息////publicpublicclassXxxServiceImplimplementspublicvoidxxx()//booleanisProviderSide=RpcContext.getContext().isProviderSide();//本端是否為提供端,這里會返回true IP=RpcContext.getContext().getRemoteHost();//獲取調用方IP地址StringapplicationRpcContext.getContext().getUrl().getParameter("application"獲取當前服務配置信息,所//booleanisProviderSideRpcContext.getContext().isProviderSide此時本端變成消費端,這里會返回//}}(+)注:path,group,version,dubbo,token,timeout幾個key有特殊處理,請使用其它key值。 ent("index","1");//隱式傳參,后面 xxxService.xxx //【注】setAttaent設置的KV,在完成下面一次調用會被清空。即多次調用要多次設置publicpublicclassXxxServiceImplimplementspublicvoidxxx()//Stringindex=RpcContext.getContext().getAtta ent("index"獲取客戶端隱式傳入的參數,用于框架集成,不建議//}}}(+)基于NIO的非阻塞實現并行調用,客戶端不需要啟動多線程即可完成并行調用多個服務,相對多線程開銷較小。2.0.6及其以上版本支持//// // =();//BarbarbarFuture.get同理等待bar<<dubbo:referenceid="fooService"<dubbo:methodname="findFoo"async="true"<dubbo:referenceid="barService"<dubbo:methodname="findBar"async="true"sent="false"不等待消息發出,將消息放入IO<<dubbo:methodname="findFoo"async="true"sent="true"如果你只是想異步,完全忽略返回值,可以配置return="false",以減少Future<<dubbo:methodname="findFoo"async="true"return="false"(+)本地調用,使用了Injvm協議,是一個偽協議,它不開啟端口,不發起調用,只在JVM內直接關聯,但執行Dubbo的Filter鏈Defineinjvm<<dubbo:protocolname="injvm"Setdefault<<dubbo:providerprotocol="injvm"Setservice<<dubbo:serviceprotocol="injvm"Useinjvm<<dubbo:consumerinjvm="true"<dubbo:providerinjvm="true"或<<dubbo:referenceinjvm="true"<dubbo:serviceinjvm="true"注意:服務與服務都需要injvm="true"自動、本地服<dubbo:reference...scope="remote"(+)生成反向,這樣就可以從服務器端調用客戶端邏輯。2.0.6及其以上版本支持代碼參見 /albaba/dubbo/tree/master/dubbo-test/dubbo-test- /alpackagepublicinterfaceCallbackServicevoidaddListener(Stringkey,CallbackListener}packagepackagepublicinterface{voidchanged(String}packagepackageimportimportimportimportpublicclassCallbackServiceImplimplementsCallbackServiceprivatefinalMap<String,CallbackListener>listeners=newConcurrentHashMap<String,publicCallbackServiceImpl()Threadt=newThread(new{publicvoidrun(){tryfor(Map.Entry<String,CallbackListener>entry:listeners.entrySet()){try{}catch(Throwable{}}catch(Throwablet)}}}}publicvoidaddListener(Stringkey,CallbackListener{listeners.put(key,listener);listener.changed(getChanged(key)發送變更通知}privateStringgetChanged(Stringkey)return"Changed:"+newSimpleDateFormat("yyyy‐MM‐ddHH:mm:ss").format(new}}<dubbo:method<dubbo:argumentindex="1"callback="true"ClassPathXmlApplicationContextClassPathXmlApplicationContextcontext=newCallbackServicecallbackService=(CallbackService)publicvoidchanged(String{System.out.println("callback1:"+}",new(+)在調用之前,調用之后,出現異常時,會觸發oninvoke,onreturn,onthrow三個,可以配置當發生時,通知哪個類的哪個方支持版本:2.0.7interface{public }classNormalDemoServiceimplements{ get(intid)return (id,"charles`son",}}<dubbo:registry"服務消費者CallbackinterfaceinterfaceNofifypublicvoidmsg,Integerpublicvoidonthrow(Throwableex,Integer}classNofifyImplimplementsNofifypublic =newpublicMap<Integer,Throwable>errors=newHashMap<Integer,publicvoidonreturn( msg,Integerid){System.out.println("onreturn:"+msg);ret.put(id,ret.put(id,}publicvoidonthrow(Throwableex,Integer{errors.put(id,}}服務消費者Callback<beanid="demoCallback"class="com.alibaba.dubbo.callback.implicit.NofifyImpl"group="cn"><dubbo:methodname="get"async="true"onreturn="demoCallback.onreturn"onthrow="demoCallback.onthrow"注:onreturn表示是否需要回調.組合情況:(async=false默認異步回調模式:async=trueonreturn="xxx"同步回調模式:async=falseonreturn="xxx"異步無回調:async=trueTESTIDemoServicedemoService=(IDemoService)NofifyImplnotify=(NofifyImpl)intrequestId=ret=demoService.get(requestId);Assert.assertEquals(null,ret);for(inti=0;i<10;i++)if{}else}}(+)存,提前驗證參數,調用失敗后容錯數據等等,此時就需要在API中帶上Stub,客戶端生成實,會把通過構造函數傳給Stub,然后把Stub組給用戶,Stub可以決定要不要去調。Stub必須有可傳入的構造函數 packagepublicclassBarServiceStubimplements{privatefinalBarServicepublic(BarService{this.barService=}publicString o(Stringname)tryreturn }catch(Exceptione) return"容錯數據}}}(+)Mock通常用于服務降級,比如某驗權服務,當服務提供方全部掛掉后,客戶端不拋出異常,而是通過Mock數據返回失敗。Mock是Stub的一個子集,便于服務提供方在客戶端執行容錯邏輯,因經常需要在出現pcException(比如網絡失敗,超時等)時進行容錯,而在出現業務異常(比如登錄用戶名錯誤)時不需要容錯,如果用b,可能就需要捕獲并依賴n類,而用k就npackagepublicclassBarServiceMockimplementsBarServicepublicString o(Stringname)//你可 return"容錯數據}}如果服務的消費方經常需要try-catchOfferOfferoffer=null;try{offer=}catch(RpcException{}請考慮改為Mock實現,并在Mock中returnnull如果只是想簡單的忽略異常,在2.0.11<<dubbo:serviceinterface="com.foo.BarService"mock="returnnull"(+)<dubbo:servicedelay="5000"<dubbo:servicedelay="5000"延Spring初始化完成后,再服務:(基于Spring的ContextRefreshedEvent觸發<<dubbo:servicedelay="‐1"Spring2.x初始化死鎖問題nren。r。規避辦法強烈建議不要在服務的實現類中有applicationContext.getBean()的調用,全部采用IoC注入的方式使用Spring的Bean如果實在要調getBean(),可以將Dubbo的配置放在Spring如果不想依賴配置順序,可以使用<dubbo:providerdey=”-1”/>,使Dubbo在Spring容器初始化完后,再服務如果大量使用getBean(),相當于已經把Spring為工廠模式在用,可以將Dubbo的服務單獨的Spring容器(+)限制com.foo.BarService的每個方法,服務器端并發執行(或占用線程池線程數)過10個限制com.foo.BarService的sayo方法,服務器端并發執行(或占用線程池線程數)過10個<<dubbo:service<dubbo:method o"executes="10"限制com.foo.BarService的每個方法,每客戶端并發執行(或占用連接的請求數)過10個限制com.foo.BarService的sayo方法,每客戶端并發執行(或占用連接的請求數)過10個<<dubbo:service<dubbo:method o"actives="10"<<dubbo:reference<dubbo:method o"actives="10"如果<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>LoadBalance配置服務的客戶端的loadbalance屬性為leastactive,此Loadbalance會調用并發數最小的Provider(Consumer端并發數)(+)限務器端接受的連接過10個:(以連接在Server上,所以配置在Provider上<dubbo:provider<dubbo:providerprotocol="dubbo"accepts="10"<dubbo:protocolname="dubbo"accepts="10"限制客戶端服務使用連接連接數:(如果是長連接,比如Dubbo協議,connections表示該服務對每個提供者建立的長連接數如果<dubbo:service>和<dubbo:reference>都配了connections,<dubbo:reference>(+)延遲連接,用于減少長連接數,當有調用發起時,再創建長連接。只對使用長連接的dubbo協議生效。<<dubbo:protocolname="dubbo"lazy="true"(+)粘滯連接用于有狀態服務,盡可能讓客戶端總是向同一提供者發起調用,除非該提供者掛了,再連另一臺。粘滯連接將自動開啟延遲連接,以減少長連接數,參見:延遲連接<<dubbo:protocolname="dubbo"sticky="true"(+)防止消費者繞過中心提供 <dubbo:protocolname="dubbo"token="true" <dubbo:protocolname="dubbo"token="123456"(+)2.2.0以上版本支持路由規則擴展點:路由擴展向中心寫入路由規則:(通常由中心或治理中心的頁面完成Registryregistry=registryFactory.getRegistry(URL.valueOf("zookeeper://0:2181")); .foo.BarService?category=routers&dynamic=false&rule="+ =0=>host=1")+"));表示路由規則的類型,支持條件路由規則 路由規則,可擴展,必填表示對所有IP地址生效,如果只想對某個IP的生效,請填入具體IP表示該數據為持久數據,當方退出時,數據依然保存在中心,必填當路由結果為空時,是否強制執行,如果不強制執行,路由結果為空的路由規則將自動失效,可不填,缺省為flase路由規則的優先級,用于排序,優先級越大越靠前執行,可不填,缺省為0rule=URL.encode("host=0=>host=hosthost=0=>host=如果匹配條件為空,表示對所有消費方應用,如:=>host!=如果過濾條件為空,表示,如:host=0服務調用信息,如:method,argument(暫不支持參數路由URL本身的字段,如:protocol,host,port等號"="表示"匹配",如:host不等號"!="表示"不匹配",如:host以逗號","分隔多個值,如:host以星號"*"結尾,表示通配,如:host!=以符"$"開頭,表示消費者參數,如:host==>=>host!=白:(注意:一個服務只能有一條白規則,否則兩條規則交叉,就都被篩選掉了hosthost!=0,1:hosthost=0,1服務寄宿在應用上,只一部分的機器,防止整個集群掛掉=>=>host=applicationapplication!=kylin=>host!=methodmethod=find*,list*,get*,is*=>host=method!=find*,list*,get*,is*=>host=前分離applicationapplication=bops=>host=application!=bops=>host=hosthost!=172.22.3.*=>host!=提供者與消費者部署在同集群內,本機只本機的服務=>=>host=支持JDK引擎的所有,比如:javascript,jruby,groovy等,通過type=javascript參數設置類型,缺省為javascript。 ...}基于引擎的路由規則,如functionfunctionroute(invokers)varresult=newfor(i=0;i<invokers.size();i++)if{}}returninvokers(+)2.2.0以上版本支持向中心寫入動態配置覆蓋規則:(通常由中心或治理中心的頁面完成Registryregistry=registryFactory.getRegistry(URL.valueOf("zookeeper://0:2181")); 表示數據采用覆蓋方式,支持override和absent表示對所有IP地址生效,如果只想覆蓋某個IP的數據,請填入具體IP表示該數據為持久數據,當方退出時,數據依然保存在中心,必填禁用提供者:(通常用于臨時踢除某臺提供者機器,相似的,消費者請使用路由規則調整權重:(通常用于容量評估,缺省權重為 調整負載均衡策略:(缺省負載均衡策略為 服務降級:(通常用于臨時某個出錯的非關鍵服務 (+)2.2.0以上版本支持向中心寫入動態配置覆蓋規則:(通過由中心或治理中心的頁面完成Registryregistry=registryFactory.getRegistry(URL.valueOf("zookeeper://0:2181")); (+)Dubbo是通過JDK的ShutdownHook來完成優雅停機的,所以如果用戶使用"kill9PID"等強制關閉指令,是不會執行優雅停機的,只有通過"killPID"時,才會執行。<dubbo:parameterkey=<dubbo:parameterkey="shutdown.timeoutvalue="60000"如果ShutdownHook(+)缺省主機IP通過LocalHost.getLocalHost()如果是127.*等loopback地址,則掃描各網卡,獲取網卡IP的地址如果獲取不正確,比如需要公網地址,可以可以在/etc/hosts中加入:機器名公網IPtest1test1在dubbo.xml<<dubbo:protocol或在pertiesdubbo:rmi:http:hessian:webservice:memcached:redis:在dubbo.xml<<dubbo:protocolname="dubbo"3.或在perties(+)2.2.1以上版本支持擴展點:日志適配擴展javajava<dubbo:applicationlogger="log4j"(+)如果你想記錄每一次請求信息,可開啟日志,類似于apache的日志。將日志輸出到當前應用的log4j日志<<dubbo:protocolaccesslog="true"將日志輸出到指定文件<<dubbo:protocol"(+)服務容器只是一個簡單的Main方法,并加載一個簡單的Spring容器,用于服務。服務容器的加載內容可以擴展,內置了spring,jetty,log4j等加載,可通過Container擴展點進行擴展,參見:ContainerSpring dubbo.spring.config=classpath*:META- 配置springJetty啟動一個內嵌Jetty dubbo.jetty.directory=/foo/bar配置可通過jetty直接 ,用于存放靜態文 Log4j dubbo.log4j.subdirectory=20880配置日志 ,用于多進程啟動,避如:(缺省只加載javajava或:(通過main函數參數傳入要加載的容器javajavacom.alibaba.dubbo.container.Mainspringjetty或:(通過JVM啟動參數傳入要加載的容器javajavacom.alibaba.dubbo.container.Main或:(通過classpath下的perties配置傳入要加載的容器ReferenceConfig(+)o0rgReferenceConfig<XxxService>ReferenceConfig<XxxService>reference=newReferenceConfig<XxxService>();ReferenceConfigCachecache=XxxServicexxxServicecache.get(referencecache.get方法中會CacheReference對象,并且調用ReferenceConfig.get方法 消除Cache中的ReferenceConfig,銷毀ReferenceConfigReferenceConfigCacheReferenceConfigCachecache=ReferenceConfigCache.getCache();r。KeyGeneratorKeyGeneratorkeyGenerator=newReferenceConfigCachecache=ReferenceConfigCache.getCache(keyGenerator(+)基于JTA/XA規范實現。暫未實現。(+)Dubbo的常規功能,都保持零侵入,但有些功能不得不用API侵入才能實現。Dubbo中除這里以外的接口或類,都是內部接口或擴展接口,普通用戶請不要直接依賴,否則升級版本可能出現不兼容。API配置com.albaba.dubbo.config.ServiceConfigcom.albaba.dubbo.config.ProtocolConfigcom.albaba.dubbo.config.RegistryConfigcom.albaba.dubbo.config.MonitorConfigcom.albaba.dubbo.config.ApplicationConfigcom.albaba.dubbo.config.ModuleConfigcom.albaba.dubbo.config.ProviderConfigcom.albaba.dubbo.config.MethodConfigcom.albaba.dubbo.config.ArgumentConfig參見:API注解com.albaba.dubbo.config.annotation.Servicecom.albaba.dubbo.config.annotation.Reference模型 com.alcom.al服務com.albaba.dubbo.rpc.service.GenericServicecom.albaba.dubbo.rpc.service.GenericException參見:泛化&泛化實com.al(+)這里以Xml配置為準,列舉所有配置項,其它配置方式,請參見相應轉換關系:屬性配置,注解配置,API配置服務發現:表示該配置項用于服務的與發現,目的是讓消費方找到提供方。所有配置最終將轉換為UR表示,并由服務供方生成,經中心傳遞給費方,各屬性應UR的參數,參見配置項一表中的"對應UR參數"列。URLSchema:(+)服務提供者服務配置對應URL服務對象實現0延遲服務時間(毫秒),設為-1時,表示延容器初始化完成時服服務調用超時時間(毫秒優2對每個提供者的最大連接數,ri、p、n等短連ore, 類名,即:接口名+Local XxxServiceLocal(XxxServicexxxService)向指定中心,在多 中心時使用,值 服務,用于服務治理,請填寫公司郵箱前服務文檔0優0生成動態方式,可選服務提供方導出服務器名稱,多個名稱用逗號分使用指定的協議服務,在多協議時使用,值<dubbo:protocol>的id屬性,多個協議ID服務提供者所在的分層。如:biz、dao、intl:web:acton該協議的服務是否到中(+)服務消費者服務配置對應URL服務的服務方法調用超時時間(毫秒的優的的的的的該本地類的構造函數必須允許傳入選:lru,threadlocal,jcache等選擇動態實現策略,可選javassist,客戶端傳輸類型設置,如Dubbonetty或mina 0可性2.0.5選本服務調用者所在的分層。如:bizdao、intl:web、:acton2.0.10(+)說明:如果需要支持多協議,可以多個<dubbo:protocol>,并在<dubbo:service>中通過protocol屬性指定使用的協議如果配置為-1或者沒有配置的端口。Dubbo2.4.0+,分配自動查找本機線類型,可選服務線大小(固定大小cpu個數io線大小(固定大小可0性選 以及http協議的json提供者上下文路徑,為服務pathdubbo協議缺省為dubbo協議缺省為dubbo協議缺省為message,execution,connection等0UTF-0該協議的服務是否到中(+)rrr中對應URL中心BeanId,可以在<dubbo:serviceregistry=""><dubbo:referenceregistry="">中此中心,請配置多個中心缺省端口,當address值登錄中心用戶名,如果中心不需要驗證可不登錄中心,如果中心不需要驗證可不網絡傳輸方式,可選中心請求超時時間(毫秒0停止時等待通知完成時間(毫秒是否向此中心服務,如果設為false,將只訂閱,是否向此中心訂閱服務,如果設為false,將只,不訂(+)URL數rr監。2.0.9直連中心服務器地址(+)對應URL應用,用于服務治理,請填寫公司郵箱前化(+)對應URL當前模塊名稱,用于中算模塊間依賴關模塊,用于服務治理,請填寫公司郵箱前(+)說明:該為<dubbo:service>和<dubbo:protocol>的缺省值設置對應URL自動查找本機服務主機名,多網卡選擇或指定VIP服務線大小(固定大小提供者上下文路徑,為服務path優 線類型,可選01.00 服務調用超時時間(毫秒20可服設為true,表示使用缺省類名,即:選+Local口名+Mock后綴。向指定中心,在多個中心時使用,值為r>的d屬性,多個注冊中心D用逗號分隔,如果不想將該服務注r/A設為true,將向logger中輸出日志,也可填寫日志文件路徑,直接把日志輸服務文檔00生成動態方式,可選0UTF-CPU+所支持的net命令,多個命令用逗號分服務提供者所在的分層。如:biz、daointl:web、:acton(+)說明:該為<dubbo:reference>的缺省值設置對應URL服務調用超時時間(毫秒1.0.16生成動態方式,可選.502.0.5failover/failfast/failsafe/fai.52.0.5 2.0.5服務調用者所在的分層。如:biz、daointl:web、:acton.10threadlocal,jcache等(+)說明:該為<dubbo:service>或<dubbo:reference>的子,用于控制到方法級對應URL1.0.8缺省為的方法調用超時時間(毫秒1.0.8的2.0.02.0.0的.602.0.50制,此屬性只在<dubbo:service>子時有2.0.5<dubbo:service>子時有2.0.5設置true該接口上的所有方法使.6方法執行前.62.0.6果,可選:lru,threadlocal,<<dubbo:reference<dubbo:methodname="findXxx"timeout="3000"retries="2"(+)說明:該為<dubbo:method>的子,用于方法參數的特征描述,比如<<dubbo:methodname="findXxx"timeout="3000"<dubbo:argumentindex="0"callback="true"對應URL通過參數類型查找參數的 向,可以從服務提供方反向調用消費方,通常用 推送(+)該rr子該對應URL2.0.02.0.0<<dubbo:protocol"value="xxx"<<dubbo:protocolname="jms"p:queue="xxx"(+)推薦使用Dubbo協議性能測試報告各協議的性能情況,請參見:性能測試報告(+)Dubbo缺省協議不適合傳送大數據量的服務,比如傳文

溫馨提示

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

評論

0/150

提交評論