私塾高級(jí)軟件架構(gòu)師階段三配套dubbo快速上手_第1頁
私塾高級(jí)軟件架構(gòu)師階段三配套dubbo快速上手_第2頁
私塾高級(jí)軟件架構(gòu)師階段三配套dubbo快速上手_第3頁
私塾高級(jí)軟件架構(gòu)師階段三配套dubbo快速上手_第4頁
私塾高級(jí)軟件架構(gòu)師階段三配套dubbo快速上手_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余72頁可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡介

1、網(wǎng)本部分課程概覽根據(jù)實(shí)際應(yīng)用需要,學(xué)習(xí)Dubbo的相關(guān)知識(shí),以快速上手、理解并掌握Dubbo,大致包括:1:Dubbo簡介、服務(wù)治理和架構(gòu)2:使用Dubbo的oWorld3:Dubbo基礎(chǔ):支持的協(xié)議、中心、Dubbo配置基礎(chǔ)4:具體的去講述Dubbo的各種高級(jí)特性,比如:啟動(dòng)時(shí)檢查、集群容錯(cuò)、負(fù)載均衡、線程模 型、直連提供者、只訂閱、只、靜態(tài)服務(wù)、多協(xié)議、多中心、服務(wù)分組、多版 本、分、聚合、泛化、泛化實(shí)現(xiàn)、回聲測試、上下文信息、隱式傳參、異步調(diào)用、本地調(diào)用、參數(shù)回調(diào)、事件通知、本地存根、本地、延遲、并發(fā)控制、連接控制、延遲連接、粘滯連接、令牌驗(yàn)證、優(yōu)雅停機(jī)、主機(jī)綁定、日志適配、日志、路由規(guī)

2、 則、配置規(guī)則、服務(wù)降級(jí)、服務(wù)容器用法5:Dubbo的管理控制臺(tái)和中心6:服務(wù)化最佳實(shí)踐 和 Dubbo的7:Dubbox的簡介和安裝配置8:Dubbox的RESTful的oWorld 9:Dubbox的RESTful的服務(wù)端、消費(fèi)端的開發(fā)10:Dubbox的RESTful和SpringMVC的選擇做最好的學(xué)習(xí)社區(qū)做最好的學(xué)習(xí)社區(qū)Dubbo簡介是什么和能干什么Dubbo是一個(gè)分布式服務(wù)框架,以及SOA治理方案,還是一種高性能和透明化的RPC服務(wù)調(diào)用方案。其部分包含:1. :通訊: 提供對(duì)多種基于長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請(qǐng)求-響過程調(diào)用,包括多協(xié)議支持,以及軟

3、負(fù)載均衡,失敗容錯(cuò),應(yīng)”模式的信息交換方式2:集群容錯(cuò): 提供基于接口方法的透明地址路由,動(dòng)態(tài)配置等集群支持。3:自動(dòng)發(fā)現(xiàn): 基于中心服務(wù),使服務(wù)消費(fèi)方能動(dòng)態(tài)的查找服務(wù)提供方,使地址透明,使服務(wù)提供方可以平滑增加或減少機(jī)器。特點(diǎn)1:透明化的方法調(diào)用:可以像調(diào)用本地方法一樣調(diào)用方法2:簡單易用,無侵入:只需簡單配置,沒有任何API侵入3:軟負(fù)載均衡:可在內(nèi)網(wǎng)替代nginx lvs等硬件負(fù)載均衡器。4:良好的容錯(cuò)機(jī)務(wù)中心自動(dòng)不需要寫死服務(wù)提供者地址,和 配置管理中心基于接口名自動(dòng)查詢提供者ip使用類似zookeeper等分布式協(xié)調(diào)服務(wù)作為服務(wù)中心,可以將絕大部分項(xiàng)目配置移入ZK集群5:服務(wù)接口與治

4、理:Dubbo-admin與Dubbo-monitor提供了服務(wù)接口管理與功能,針對(duì)不同應(yīng)用的行不同接口,可以進(jìn),多協(xié)議,多中心網(wǎng)管理Dubbo服務(wù)治理具體說明參見文檔,圖示如下:Dubbo服務(wù)治理網(wǎng)做最好的學(xué)習(xí)社區(qū)Dubbo架構(gòu)具體說明參見文檔,圖示如下:Dubbo的架構(gòu)網(wǎng)做最好的學(xué)習(xí)社區(qū)和mons-logging日志輸出包 、javassist字節(jié)碼生成 、spring的依準(zhǔn)備開發(fā)環(huán)境1:最基本的dubbo只依賴于:賴包、netty網(wǎng)絡(luò)傳輸?shù)囊蕾嚢?,基本的示例如下?:當(dāng)然你需要根據(jù)你應(yīng)用的需要,來添加com.101teczkclient0.9.apache.zookeeperzookee

5、per3.4.9pomcom.alibabadubbo2.5.3tynetty-all4.1.6.Finalcommons-loggingcommons-logging1.2網(wǎng)最好的學(xué)習(xí)社區(qū)oWorld-1.javassistjavassist3.21.0-GAlog4jlog4j1.2.17.springframeworkspring-context4.3.3.RELEASE.springframeworkspring-context-support4.3.3.RELEASEjunitjunit4.12test服務(wù)端接口服務(wù)端服務(wù)實(shí)現(xiàn)oWorld-2網(wǎng)做最好的學(xué)習(xí)社區(qū)User模塊其它應(yīng)用模塊

6、或自己的web層User業(yè)務(wù)邏輯實(shí)現(xiàn)ServicedaoService接口vo網(wǎng)做最好的學(xué)習(xí)社區(qū)服務(wù)端配置1:在Spring的配置xml里面添加dubbo的schema的,如下:xmlns:dubbo=/schema/dubbo . al i babatech. com/ schema/ dubboht tp:/ code. al i babatech. com/schema/ dubbo/ dubbo.xsd2:基本配置示例如下:服務(wù)端啟動(dòng)類public static void main(String args) ClassPathXmlApplicationContext context

7、= new ClassPathXmlApplicationContext(new String applicationContext-o-sp.xml );context.start();try System.in.read(); catch (IOException e) e.printStackTrace();oWorld-3網(wǎng)做最好的學(xué)習(xí)社區(qū)客戶端配置1:同樣要在Spring的配置xml里面添加dubbo的schema的2:配置示例如下:,可以和本地bean一樣使用demoService -oService interface=com.sishuok.dubbo.o.api.oServi

8、ce!- 生成服務(wù)dubbo:reference id=客戶端測試類public static void main(String args) ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String applicationContext-o-client.xml );context.start();oServiceoService = (oService) context.getBean(oService); int ret =oService.add(5, 6);System

9、.out.println(test result= + ret);測試運(yùn)行要先啟動(dòng)Zookeeper,然后運(yùn)行服務(wù)端,然后再運(yùn)行客戶端,就能看到效果了oWorld-4網(wǎng)做最好的學(xué)習(xí)社區(qū)概述Dubbo支持很多協(xié)議,使用Dubbo協(xié)議,還有很多,比如:rmi、hessian、http、webservice、thrift、memcached、redis等。Dubbo協(xié)議使用說明1:Dubbo缺省協(xié)議采用單一長連接和NIO異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,傳入傳出參數(shù)數(shù)據(jù)包較小(建議小于100K) ,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況2:Dubbo協(xié)議不適合傳送大數(shù)據(jù)量的服務(wù),比

10、如傳文件,傳等,除非請(qǐng)求量很低3:Dubbo協(xié)議缺省每服務(wù)每提供者每消費(fèi)者使用單一長連接,如果數(shù)據(jù)量較大,可以使用多個(gè)連接,比如:1或表示該服務(wù)使用JVM共享長連接。(缺省)2或表示該服務(wù)使用獨(dú)立長連接3或表示該服務(wù)使用獨(dú)立兩條長連接4:為防止被大量連接撐掛,可在服務(wù)提供方限制大接收連接數(shù),以實(shí)現(xiàn)服務(wù)提供方自我保護(hù):支持的協(xié)議網(wǎng)做最好的學(xué)習(xí)社區(qū)中心,使用Zookeeper,還有很多,比如:multicast、simple、概述Dubbo支持多種redis等。Zookeeper中心使用說明1:支持以下功能當(dāng)提供者出現(xiàn)斷電等異常停機(jī)時(shí),當(dāng)中心重啟時(shí),能自動(dòng)恢復(fù)中心能自動(dòng)刪除提供者信息數(shù)據(jù),以及訂閱

11、請(qǐng)求1234和訂閱請(qǐng)求,定時(shí)當(dāng)會(huì)話過期時(shí),能自動(dòng)恢復(fù)數(shù)據(jù),以及訂閱請(qǐng)求當(dāng)設(shè)置時(shí),記錄失敗重試567可通過設(shè)置zookeeper登錄信息可通過設(shè)置zookeeper的根節(jié)點(diǎn),不設(shè)置將使用無根樹支持*號(hào)通配符,可訂閱服務(wù)的所有分組和所有版本的提供者中心-1網(wǎng)做最好的學(xué)習(xí)社區(qū)中心-22:需要在服務(wù)端和客戶端工程的pom里面,添加Zookeeper的jar的依賴,還有zkClient的依賴3:Zookeeper單機(jī)配置:或4:Zookeeper集群配置:或5:同一Zookeeper,分成多組中心:網(wǎng)做最好的學(xué)習(xí)社區(qū)xml配置概述dubbo可以通過xml進(jìn)行配置,也可以用API進(jìn)行配置,使用xml配置,

12、xml配置提供如下配置元素:,一個(gè)服務(wù)也可以到多個(gè)中心。1: 服務(wù)配置,一個(gè)服務(wù)可以用多個(gè)協(xié)議2:配置,用于創(chuàng)建一個(gè)服務(wù),一個(gè)可以指向多個(gè)中心。3: 協(xié)議配置,用于配置提供服務(wù)的協(xié)議信息,協(xié)議由提供方指定,消費(fèi)方接受。4: 應(yīng)用配置,用于配置當(dāng)前應(yīng)用信息,不管該應(yīng)用是提供者還是消費(fèi)者。 5: 模塊配置,用于配置當(dāng)前模塊信息,可選。6: 7:中心配置,用于配置連接中心配置,用于配置連接中心相關(guān)信息。中心相關(guān)信息,可選。8: 提供方的缺省值,當(dāng)ProtocolConfig和ServiceConfig某屬性沒有配置時(shí),采用此缺省值,可選。9: 消費(fèi)方缺省配置,當(dāng)ReferenceConfig某屬性沒

13、有配置時(shí),采用此缺省值,可選。10: 方法配置,用于ServiceConfig和ReferenceConfig指定方法級(jí)的配置信息。 11: 用于指定方法參數(shù)配置。說明:所有者支持自定義參數(shù),用于不同擴(kuò)展點(diǎn)實(shí)現(xiàn)的特殊配置xml配置的查找順序,也就是優(yōu)先級(jí)1:方法級(jí)優(yōu)先,接口級(jí)次之,全局配置再次之2:如果級(jí)別一樣,則消費(fèi)方優(yōu)先,提供方次之配置基礎(chǔ)-1網(wǎng)做最好的學(xué)習(xí)社區(qū)配置基礎(chǔ)-2xml配置查找順序示例如下圖所示:網(wǎng)做最好的學(xué)習(xí)社區(qū)配置基礎(chǔ)-3properties配置1:可以使用perties作為缺省配置2:Dubbo將自動(dòng)加載classpath根下的perties,可以通過JVM啟動(dòng)參數(shù):-Dp

14、erties.file=.properties 改變?nèi)笔∨渲梦恢?:如果classpath根下存在多個(gè)perties,比如多個(gè)jar包中有perties,Dubbo會(huì)任意加載,并打印Error日志,后續(xù)可能改為拋異常規(guī)則:4:1將XML配置的名,加屬性名,用點(diǎn)分隔,多個(gè)屬性拆成多行:比如:=foo等價(jià)于比如:dubbo.registry.address=:9090等價(jià)于2如果XML有多行同名配置,可用id號(hào)區(qū)分,如果沒有id號(hào)將對(duì)所有同名生效:比如:tocol.rmi.port=1234等價(jià)于 (協(xié)議的id沒配時(shí),缺省使用協(xié)議名作為id)比如:dubbo.registry.china.addr

15、ess=0:9090等價(jià)于5:配置示例: tocol=zookeeper dubbo.registry.address=:2181 tocol.host=30網(wǎng)做最好的學(xué)習(xí)社區(qū)配置基礎(chǔ)-4多種配置的查找順序1:JVM啟動(dòng)-D參數(shù)優(yōu)先,這樣可以使用戶在部署和啟動(dòng)時(shí)進(jìn)行參數(shù)重寫,比如在啟動(dòng)時(shí)需改變協(xié)議的端口。2:XML次之,如果在XML中有配置,則perties中的相應(yīng)配置項(xiàng)無效。會(huì)生效,通常3:Properties最后,相當(dāng)于缺省值,只有XML沒有配置時(shí),perties的相應(yīng)配置用于共享公共配置,比如應(yīng)用名。4:示例如下圖:網(wǎng)做最好的學(xué)習(xí)社區(qū)注解配置1:服務(wù)提供方注解,在類上使用Service2

16、:服務(wù)提供方配置:!-3:消費(fèi)方注解,在類上使用Component ,然后使用Reference 來注入屬性4:消費(fèi)方配置:!-配置基礎(chǔ)-5網(wǎng)做最好的學(xué)習(xí)社區(qū)概述SpringDubbo缺省會(huì)在啟動(dòng)時(shí)檢查依賴的服務(wù)是否可用,不可用時(shí)會(huì)拋出異常,初始化完成,以便上線時(shí),能及早發(fā)現(xiàn)問題,默認(rèn)check=true使用說明1:如果check=false,總是會(huì)返回,當(dāng)服務(wù)恢復(fù)時(shí),能自動(dòng)連上2:如果你的Spring容器是懶加載的,或者通過API編程延遲服務(wù),請(qǐng)關(guān)閉check,否則服務(wù)臨時(shí)不可用時(shí),會(huì)拋出異常,拿到null配置示例參見文檔注意幾種check配置的區(qū)別關(guān)于初始化1:缺省是延遲初始化的,只有被注

17、入到其它Bean,或被getBean()獲取,才會(huì)初始化2:如果需要裝載的時(shí)候初始化,可以設(shè)置init=“true”,例如:啟動(dòng)時(shí)檢查網(wǎng)做最好的學(xué)習(xí)社區(qū)集群容錯(cuò)模式配置示例集群容錯(cuò)機(jī)制,如下圖所示集群容錯(cuò)網(wǎng)做最好的學(xué)習(xí)社區(qū)負(fù)載均衡策略配置示例負(fù)載均衡網(wǎng)做最好的學(xué)習(xí)社區(qū)Dispatcher的選項(xiàng)Threool的選項(xiàng)直接使用I/O線程處理請(qǐng)求 或 使用線處理請(qǐng)求配置示例線程模型線程模型網(wǎng)做最好的學(xué)習(xí)社區(qū)概述中心,只測試指定服務(wù)提供者,這時(shí)候可在開發(fā)及測試環(huán)境下,經(jīng)常需要繞過能需要點(diǎn)對(duì)點(diǎn)直連。說明1:點(diǎn)對(duì)點(diǎn)直聯(lián)方式,將以服務(wù)接口為單位,忽略中心的提供者列表2:A接口配置點(diǎn)對(duì)點(diǎn),不影響B(tài)接口從中心獲取

18、列表配置示例直連提供者網(wǎng)做最好的學(xué)習(xí)社區(qū)場景問題為方便開發(fā)測試,經(jīng)常會(huì)個(gè)正在開發(fā)中的服務(wù)提供者下共用一個(gè)所有服務(wù)可用的中心,這時(shí),如果一,可能會(huì)影響消費(fèi)者不能正常運(yùn)行。正在開發(fā)解決方案可以讓服務(wù)提供者,只訂閱服務(wù)(開發(fā)的服務(wù)可能依賴其它服務(wù)),而不的服務(wù),通過直連測試正在開發(fā)的服務(wù)配置示例只訂閱網(wǎng)做最好的學(xué)習(xí)社區(qū)場景問題如果有兩個(gè)中心,有一個(gè)服務(wù)只在其中一個(gè)中心有部署,另一個(gè)中心中心的其它應(yīng)用都需要依賴此服務(wù),這需要將服務(wù)同時(shí)還沒來得及部署,而兩個(gè)到兩個(gè)中心。另外不能讓此服務(wù)同時(shí)依賴兩個(gè)中心的其它服務(wù)。解決方案可以讓服務(wù)提供方,只服務(wù)到某一中心,而不從這個(gè)中心訂閱服務(wù)配置示例只網(wǎng)做最好的學(xué)習(xí)社

19、區(qū)概述如果希望人工管理服務(wù)提供者的上線和下線,可以將中心標(biāo)識(shí)為非動(dòng)態(tài)管理模式,這么設(shè)置過后,服務(wù)提供者初次時(shí)為禁用狀態(tài),需人工啟用,斷線時(shí),將不會(huì)被自動(dòng)刪除,需人工禁用。配置示例靜態(tài)服務(wù)網(wǎng)做最好的學(xué)習(xí)社區(qū)多協(xié)議不同服務(wù)不同協(xié)議不同服務(wù)在性能上適用不同協(xié)議進(jìn)行傳輸,比如大數(shù)據(jù)用短連接協(xié)議,小數(shù)據(jù)大并發(fā)用長連接協(xié)議。具體配置示例參見文檔多協(xié)議服務(wù)有時(shí)候,同一個(gè)服務(wù),需要以不同的協(xié)議方式提供出去,以供不同的客戶端。具體配置示例參見文檔網(wǎng)做最好的學(xué)習(xí)社區(qū)多中心多中心同一服務(wù)到多個(gè)具體配置示例參見中心。文檔不同服務(wù)使用不同中心有時(shí)候,同一個(gè)服務(wù)應(yīng)用,會(huì)針對(duì)不同的客戶應(yīng)用而提供專門的實(shí)現(xiàn),也就是不同的服務(wù)

20、了,然后把這些不同的服務(wù)到不同的中心具體配置示例參見文檔多中心有時(shí)候,同一個(gè)服務(wù),在不同的中心都有,當(dāng)然,他們具體的實(shí)現(xiàn)并不完這多個(gè)中心的這個(gè)同一服務(wù)。全一樣,此時(shí),客戶端根據(jù)應(yīng)用需要,需要同時(shí)去具體配置示例參見文檔網(wǎng)做最好的學(xué)習(xí)社區(qū)概述當(dāng)一個(gè)接口有多種實(shí)現(xiàn)時(shí),可以用group區(qū)分配置示例服務(wù)分組網(wǎng)做最好的學(xué)習(xí)社區(qū)概述當(dāng)一個(gè)接口實(shí)現(xiàn),出現(xiàn)不兼容升級(jí)時(shí),可以用版本號(hào)過渡,版本號(hào)不同的服務(wù)相互間不使用建議1:在低壓力時(shí)間段,先升級(jí)一半提供者為新版本2:再將所有消費(fèi)者升級(jí)為新版本3:然后將剩下的一半提供者升級(jí)為新版本配置示例多版本網(wǎng)做最好的學(xué)習(xí)社區(qū)概述按組合并返回結(jié)果,比如菜單服務(wù),接口一樣,但有多

21、種實(shí)現(xiàn),用group區(qū)分,現(xiàn)在消費(fèi)方需從每種group中調(diào)用一次返回結(jié)果,合并結(jié)果返回,這樣就可以實(shí)現(xiàn)聚合菜單項(xiàng)配置示例分組聚合網(wǎng)做最好的學(xué)習(xí)社區(qū)概述泛接口調(diào)用方式主要用于客戶端沒有API接口及模型類元的情況,參數(shù)及返回值中的所有POJO均用Map表示,通常用于框架集成使用說明1:客戶端使用dubbo提供的GenericService來調(diào)用2:要注意傳入傳出的數(shù)據(jù)對(duì)象,也就是用來代替具體POJO的Map,里面的基本格式,要有一個(gè)key為class的值,這個(gè)指定了具體的類配置示例泛化網(wǎng)做最好的學(xué)習(xí)社區(qū)概述泛化實(shí)現(xiàn)方式主要用于服務(wù)器端沒有API接口及模型類元的情況,參數(shù)及返回值中的所有POJO均用

22、Map表示,通常用于框架集成,比如:實(shí)現(xiàn)一個(gè)通用的服務(wù)Mock框架,可通過實(shí)現(xiàn)GenericService接口處理所有服務(wù)請(qǐng)求。使用說明1:注意和泛化的區(qū)別2:要注意傳入傳出的數(shù)據(jù)對(duì)象,也就是用來代替具體POJO的Map,里面的基本格式,要有一個(gè)key為class的值,這個(gè)指定了具體的類配置示例泛化實(shí)現(xiàn)網(wǎng)做最好的學(xué)習(xí)社區(qū)概述回聲測試用于檢測服務(wù)是否可用,回聲測試按照正常請(qǐng)求流程執(zhí)行,能夠測試整個(gè)調(diào)用是否通暢,可用于。強(qiáng)制為所有服務(wù)自動(dòng)實(shí)現(xiàn)EchoService接口,只需將任意服務(wù)EchoService,即可使用。使用示例在客戶端調(diào)用的時(shí)候,把得到的Bean強(qiáng)制造型成EchoService,然后

23、調(diào)用$echo方法,例如:EchoService es = (EchoService) oService; String status = (String) es.$echo(is Ok); System.out .println(echo status=+status);返回的結(jié)果就是傳入$echo方法的參數(shù)值?;芈暅y試網(wǎng)做最好的學(xué)習(xí)社區(qū)概述Dubbo把當(dāng)前調(diào)用過程中所需的環(huán)境信息,封裝到上下文對(duì)象RpcContext中,所有的配置信息都轉(zhuǎn)換成URL的參數(shù)。RpcContext是一個(gè)ThreadLocal的臨時(shí)狀態(tài)記錄器,當(dāng)接收到RPC請(qǐng)求,或發(fā)起RPC請(qǐng)求時(shí),RpcContext的狀態(tài)都會(huì)

24、變化。比如:A調(diào)B,B再調(diào)C,則B機(jī)器上,在B調(diào)C之前,RpcContext記錄的是A調(diào)B的信息,在B調(diào)C之后,RpcContext記錄的是B調(diào)C的信息。使用示例RpcContext.get Context ().()上下文信息網(wǎng)做最好的學(xué)習(xí)社區(qū)概述調(diào)用中會(huì)隱式將Dubbo里面可以通過上下文對(duì)象RpcContext來進(jìn)行隱式傳參,在這些參數(shù)發(fā)送到服務(wù)器端。使用示例消費(fèi)方:ent( “key”,”value”);ent(“key”);RpcContext.getContext().setAtta服務(wù)方:RpcContext.getContext().getAtta使用說明1:隱式傳參到服務(wù)器端,

25、類似,用于框架集成,不建議常規(guī)業(yè)務(wù)使用2:有幾個(gè)保留的key:path,group,version,dubbo,token,timeout3:注意每次調(diào)用過后,RpcContext會(huì)重置,附加的參數(shù)也自然沒有了,如果想要每次遠(yuǎn)程調(diào)用的時(shí)候都要隱式傳參,那么每次調(diào)用前都要重新設(shè)置參數(shù)隱式傳參網(wǎng)做最好的學(xué)習(xí)社區(qū)概述客戶端可以采用異步的方式調(diào)用的服務(wù)。Dubbo是基于NIO的非阻塞實(shí)現(xiàn)并行調(diào)用,客戶端不需要啟動(dòng)多線程即可完成并行調(diào)用多個(gè)服務(wù),相對(duì)多線程開銷較小。使用示例1:注意async=“true”的配置,可以設(shè)置在dubbo:reference上,也可在dubbo:method 上2:客戶端調(diào)用

26、后通過Future來獲取返回的結(jié)果3:可以設(shè)置是否等待消息發(fā)出:(異步總是不等待返回)sent=“true” 等待消息發(fā)出,消息發(fā)送失敗將拋出異常。sent=“false” 不等待消息發(fā)出,將消息放入IO隊(duì)列,即刻返回。例如:4:如果只是想異步,完全忽略返回值,可以配置return=“false”,以減少Future對(duì)象的創(chuàng)建和管理成本,例如:異步調(diào)用網(wǎng)做最好的學(xué)習(xí)社區(qū)概述發(fā)起Dubbo支持使用Injvm協(xié)議來實(shí)現(xiàn)本地調(diào)用,Injvm是一個(gè)偽協(xié)議,它不開啟端口,不調(diào)用,只在JVM內(nèi)直接關(guān)聯(lián),但執(zhí)行Dubbo的Filter鏈。服務(wù)的時(shí)候,默認(rèn)優(yōu)服務(wù),如下:使用示例從 dubbo 2.2.0 開始

27、,每個(gè)服務(wù)默認(rèn)都會(huì)在本地;在先本地服務(wù);如果希望服務(wù)可以使用一下配置強(qiáng)制本地調(diào)用網(wǎng)做最好的學(xué)習(xí)社區(qū)概述參數(shù)回調(diào)方式能夠讓你實(shí)現(xiàn)從服務(wù)端去調(diào)用客戶端的功能。參數(shù)回調(diào)方式與調(diào)用本地callback或listener相同,只需要在Spring的配置文件中哪個(gè)參數(shù)是callback類型即可,Dubbo將基于長連接生成反向。使用示例參數(shù)回調(diào)網(wǎng)做最好的學(xué)習(xí)社區(qū)概述在客戶端調(diào)用服務(wù)端之前、之后、或是出現(xiàn)異常時(shí),會(huì)觸發(fā)oninvoke, onreturn,onthrow三個(gè)事件,可以配置當(dāng)事件發(fā)生時(shí),通知哪個(gè)類的哪個(gè)方法。使用說明件通知的實(shí)現(xiàn)方法,例如:1:在客戶端添加自己的Notify實(shí)現(xiàn)類2:在客戶端配置

28、中,設(shè)定每個(gè)方法調(diào)用class=com.si shuok.dubbo. not i fy. cl i ent.MyNoti f yServiceonreturn=myNoti fy. onreturn/dubbo:method name=addasync=true3:注意:oninvoke不好用,spring報(bào)錯(cuò) 4:onreturn和onthrow方法定義的基本格式:onreturn(返回值,參數(shù)列表) onthrow(Throwable ex,參數(shù)列表)事件通知網(wǎng)做最好的學(xué)習(xí)社區(qū)概述應(yīng)用程序進(jìn)行服務(wù)化后,客戶端通常只剩下接口,而實(shí)現(xiàn)全在服務(wù)器端,但提供方有些時(shí)候想在客戶端也執(zhí)行部分邏輯,比

29、如:做ThreadLocal緩存,提前驗(yàn)證參數(shù),調(diào)用失敗后容錯(cuò)數(shù)據(jù)等等。此時(shí)就需要在API中帶上Stub,客戶端生成Proxy實(shí)現(xiàn),會(huì)把Proxy通過構(gòu)造函數(shù)傳給Stub,然后把Stub組給用戶,Stub可以決定要不要去調(diào)Proxy。使用說明1:本地存根是在服務(wù)端實(shí)現(xiàn)并提供給客戶端2:本地存根是在客戶端運(yùn)行的本地存根網(wǎng)做最好的學(xué)習(xí)社區(qū)概述Mock是Stub的一個(gè)子集,便于服務(wù)提供方在客戶端執(zhí)行容錯(cuò)邏輯,因經(jīng)常需要在出現(xiàn)RpcException(比如網(wǎng)絡(luò)失敗,超時(shí)等)時(shí)進(jìn)行容錯(cuò),而在出現(xiàn)業(yè)務(wù)異常(比如登錄用戶名錯(cuò)誤)時(shí)不需要容錯(cuò),如果用Stub,可能就需要捕獲并依賴RpcException類,而

30、用Mock就可以不依賴RpcException,因?yàn)樗募s定就是只有出現(xiàn)RpcException時(shí)才執(zhí)行 。Mock通常用于服務(wù)降級(jí),比如某驗(yàn)權(quán)服務(wù),當(dāng)服務(wù)提供方全部掛掉后,客戶端不拋出異常,而是通過Mock數(shù)據(jù)返回失敗。使用說明1:Mock實(shí)現(xiàn)類,不需要傳入Proxy了,要求有一個(gè)空參的構(gòu)造方法2:Mock的方法,只是在調(diào)用出現(xiàn)RpcException時(shí)才運(yùn)行3:文檔的方式有些問題,實(shí)際應(yīng)用中,Mock的配置通常在服務(wù)消費(fèi)方,而且check設(shè)置為false,因?yàn)樵诜?wù)端不可的時(shí)候,如果check為true,那就會(huì)報(bào)例外,而不是運(yùn)行 mock了,示例如下: 4:如果只是想簡單的忽略異常,可以設(shè)

31、置mock=“return null”本地網(wǎng)做最好的學(xué)習(xí)社區(qū)概述如果你的服務(wù)需要Warmup時(shí)間,比如初始化緩存,等待相關(guān)資源就位等,可以使用delay進(jìn)行延遲配置示例延遲5秒服務(wù):延Spring初始化完成后,再服務(wù) (基于Spring的ContextRefreshedEvent事件觸發(fā)):使用說明了服務(wù),1:可能會(huì)導(dǎo)致Spring初始化死鎖的問題:在Spring解析到時(shí),就已經(jīng)向外而Spring還在接著初始化其它Bean;如果這時(shí)有請(qǐng)求進(jìn)來,并且服務(wù)的實(shí)現(xiàn)類里有調(diào)用 applicationContext.getBean()的用法,從而導(dǎo)致死鎖。其實(shí)這個(gè)問題是Spring使用的問題,并不是du

32、bbo的問題。2:建議的解決方法1234強(qiáng)烈建議不要在服務(wù)的實(shí)現(xiàn)類中有g(shù)etBean()的調(diào)用,全部采用IoC注入的方式使用Spring的Bean。如果實(shí)在要調(diào)getBean(),可以將Dubbo的配置放在Spring的最后加載。如果不想依賴配置順序,可以使用,使Dubbo在Spring容器初始化完后,再服務(wù)。如果大量使用getBean(),相當(dāng)于已經(jīng)把Spring為工廠模式在用,可以將Dubbo的服務(wù)單獨(dú)的Spring容器。延遲網(wǎng)做最好的學(xué)習(xí)社區(qū)配置示例使用說明1:測試executes配置時(shí),在服務(wù)端方法里面sleep一段時(shí)間,造成并發(fā)運(yùn)行,然后配置里面除了設(shè)置executes=“1”外,添

33、加timeout=“5000”。然后多啟動(dòng)幾個(gè)客戶端就可以看到效果了2:測試actives配置的時(shí)候,要模擬每客戶端并發(fā)執(zhí)行,例如: public static void main(String args) ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String applicationContext-o-client.xml );oService);context.start();finaloServiceoService = (oService) context.getBea

34、n(for(int i=0;i10;i+)Thread t = new Thread(new Runnable() public void run() int ret =oService.add(5, 6);System.out.println(Thread.currentThread().getId()+=result= + ret););t.start();并發(fā)控制網(wǎng)做最好的學(xué)習(xí)社區(qū)連接控制配置示例參見文檔網(wǎng)做最好的學(xué)習(xí)社區(qū)概述延遲連接,用于減少長連接數(shù),當(dāng)有調(diào)用發(fā)起時(shí),再創(chuàng)建長連接。注意:只對(duì)使用長連接的dubbo協(xié)議生效配置示例延遲連接網(wǎng)做最好的學(xué)習(xí)社區(qū)概述粘滯連接用于有狀態(tài)的服務(wù),盡

35、可能讓客戶端總是向同一提供者發(fā)起調(diào)用,除非該提供者掛了,再連另一臺(tái)。注意:粘滯連接將自動(dòng)開啟延遲連接,以減少長連接數(shù)配置示例粘滯連接網(wǎng)做最好的學(xué)習(xí)社區(qū)概述中心可這個(gè)功能主要是用來防止消費(fèi)者繞過中心提供者。其實(shí)現(xiàn)是在中心控制權(quán)限,以決定要不要下發(fā)令牌給消費(fèi)者;當(dāng)然靈活改變方式,而不需修改或升級(jí)提供者,調(diào)用示意圖如下:配置示例令牌驗(yàn)證網(wǎng)做最好的學(xué)習(xí)社區(qū)概述Dubbo是通過JDK的ShutdownHook來完成優(yōu)雅停機(jī)的,所以如果用戶使用“kill -9PID”等強(qiáng)制關(guān)閉指令,是不會(huì)執(zhí)行優(yōu)雅停機(jī)的,只有通過“kill PID”時(shí),才會(huì)執(zhí)行。1:服務(wù)提供方:12停止時(shí),先標(biāo)記為不接收新請(qǐng)求,新請(qǐng)求過來

36、時(shí)直接報(bào)錯(cuò),讓客戶端重試其它機(jī)器然后,檢測線中的線程是否正在運(yùn)行,如果有,等待所有線程執(zhí)行完成,除非超時(shí),則強(qiáng)制關(guān)閉2:服務(wù)消費(fèi)方:12停止時(shí),不再發(fā)起新的調(diào)用請(qǐng)求,所有新的調(diào)用在客戶端即報(bào)錯(cuò)。然后,檢測有沒有請(qǐng)求的響應(yīng)還沒有返回,等待響應(yīng)返回,除非超時(shí),則強(qiáng)制關(guān)閉配置示例1:設(shè)置優(yōu)雅停機(jī)超時(shí)時(shí)間,缺省超時(shí)時(shí)間是10秒:(超時(shí)則強(qiáng)制關(guān)閉),示例如下: 2:如果ShutdownHook不能生效,可以自行調(diào)用:ProtocolConfig.destroyAll();優(yōu)雅停機(jī)網(wǎng)做最好的學(xué)習(xí)社區(qū)概述這個(gè)功能是用來設(shè)置服務(wù)端跟主機(jī)的綁定,以及設(shè)置端口。主機(jī)綁定1:缺省主機(jī)IP查找順序1通過LocalHo

37、st.getLocalHost()獲取本機(jī)地址2如果是127.*等loopback地址,則掃描各網(wǎng)卡,獲取網(wǎng)卡IP2:如的地址如果獲取不正確,比如需要公網(wǎng)地址,可以:果343可以在/etc/hosts中加入:機(jī)器名 公網(wǎng)IP,比如:test1 01也可以在dubbo.xml中加入主機(jī)地址的配置,例如:或在perties中加入主機(jī)地址的配置:tocol.host=01端口設(shè)置1:缺省主機(jī)端口與協(xié)議:dubbo: 20880、rmi: 1099、http: 80、hessian: 80、webservice: 80、 memcached: 11211、redis: 63792:主機(jī)端口配置12在d

38、ubbo.xml中加入主機(jī)地址的配置:或在perties中加入主機(jī)地址的配置:tocol.dubbo.port=20880主機(jī)綁定網(wǎng)做最好的學(xué)習(xí)社區(qū)概述這個(gè)功能是用來設(shè)置具體要采用的記錄日志的方式。缺省自動(dòng)查找log4j slf4j jcl jdk指定日志策略1:java方式:java -Ddubbo.application.logger=log4j2:perties:dubbo.application.logger=log4j3:dubbo.xml:日志適配網(wǎng)做最好的學(xué)習(xí)社區(qū)日志。概述這個(gè)功能是用來記錄每一次請(qǐng)求信息,類似于apache的注意:此日志量比較大,請(qǐng)注意磁盤容量配置示例1:將日志

39、輸出到當(dāng)前應(yīng)用的log4j日志:2:將日志輸出到指定文件:日志網(wǎng)做最好的學(xué)習(xí)社區(qū)概述安裝使用管理控制臺(tái)網(wǎng)做最好的學(xué)習(xí)社區(qū)概述安裝使用1:在配置dubbo.jetty.directory的時(shí)候,注意dubbo是不會(huì)自動(dòng)給創(chuàng)建這個(gè)monitor的 2:要使用monitor,需要在服務(wù)上進(jìn)行配置,例如: 3:通常要多個(gè)消費(fèi)端,才會(huì)生成以對(duì)比展示中心網(wǎng)做最好的學(xué)習(xí)社區(qū)概述配置語法配置示例路由規(guī)則網(wǎng)做最好的學(xué)習(xí)社區(qū)概述配置示例配置規(guī)則網(wǎng)做最好的學(xué)習(xí)社區(qū)概述配置示例服務(wù)降級(jí)網(wǎng)做最好的學(xué)習(xí)社區(qū)概述Dubbo支持以net的方式操作服務(wù)?;臼褂?:連接上服務(wù)端,比如:net ip地址 端口如208802:具體

40、令參看文檔net命令網(wǎng)做最好的學(xué)習(xí)社區(qū)服務(wù)容器Dubbo服務(wù)的運(yùn)行方式 1:使用Web服務(wù)器缺點(diǎn):因?yàn)榉?wù)不需要Tomcat等Web容器的功能,如果硬要用Web容器去加載服務(wù)提供方,增加復(fù)雜性,也浪費(fèi)資源。2:自己寫Main方法來運(yùn)行,可用在本地調(diào)試缺點(diǎn):沒有使用上Dubbo的很多高級(jí)特性;另外一個(gè)自己編寫的啟動(dòng)類可能會(huì)有功能缺陷3:使用Dubbo提供的服務(wù)容器服務(wù)容器是一個(gè)standalone的啟動(dòng)程序,只是一個(gè)簡單的Main方法,并加載一個(gè)簡單的Spring容器,用于服務(wù)。服務(wù)容器的加載內(nèi)容內(nèi)置了spring, jetty, log4j等加載,可通過Container擴(kuò)展點(diǎn)進(jìn)行擴(kuò)展??蓪?shí)現(xiàn)

41、優(yōu)雅關(guān)機(jī)。各個(gè)容器的配置示例容器啟動(dòng)通過Maven來構(gòu)建Dubbo服務(wù)的jar網(wǎng)做最好的學(xué)習(xí)社區(qū)Web 容器Web應(yīng)用表現(xiàn)層邏輯層數(shù)據(jù)層dubboWeb容器網(wǎng)做最好的學(xué)習(xí)社區(qū)分層1:服務(wù)可以分成多層,比如:公共基礎(chǔ)服務(wù)、業(yè)務(wù)基礎(chǔ)服務(wù)、業(yè)務(wù)服務(wù)等,下層為上層服務(wù)提供支撐2:服務(wù)應(yīng)盡量無狀態(tài),這樣能提高系統(tǒng)的可伸縮性,隨著系統(tǒng)的負(fù)載變化來提供服務(wù)能力分包1:建議將服務(wù)接口,服務(wù)模型,服務(wù)異常等均放在API包中,因?yàn)榉?wù)模型及異常也是API的一部分,同時(shí),這樣做也符合分包原則:重用發(fā)布等價(jià)原則(REP),共同重用原則(CRP)2:如果需要,也可以考慮在API包中放置一份spring的配置,這樣使用方

42、,只需在Spring加載過程中引下,以免,如:com/alibaba/china/dubbo-用此配置即可,配置建議放在模塊的包reference.xml粒度分布式帶來工作1:服務(wù)接口盡可能大粒度,每個(gè)服務(wù)方法應(yīng)代表一個(gè)功能,而不是某功能的一個(gè)步驟,否則事務(wù)問題,Dubbo暫未提供分布式事務(wù)支持。2:服務(wù)接口建議以業(yè)務(wù)場景為單位劃分,并對(duì)相近業(yè)務(wù)做抽象,防止接口數(shù)量3:不建議使用過于抽象的通用接口,如:Mapquery(Map),這樣的接口沒有明確語義,會(huì)給后期不便。4:對(duì)于服務(wù)的數(shù)量要仔細(xì)考慮,過多可能是劃分過細(xì),從而破壞業(yè)務(wù)子系統(tǒng)的獨(dú)立性,導(dǎo)致部署量大,運(yùn)行期獨(dú)立進(jìn)程占用內(nèi)存過多5:過少可

43、能是沒有很好的解耦,從而導(dǎo)致開發(fā)不好分工,而且升級(jí)服務(wù)化最佳實(shí)踐-1網(wǎng)做最好的學(xué)習(xí)社區(qū)公共的基礎(chǔ)層業(yè)務(wù)基礎(chǔ)層服務(wù)1服務(wù)1服務(wù)服務(wù)業(yè)務(wù)應(yīng)用層服務(wù)服務(wù)網(wǎng)做最好的學(xué)習(xí)社區(qū)Controller Trycatch對(duì)例行處理服務(wù)Throw exception網(wǎng)做最好的學(xué)習(xí)社區(qū)版本1:每個(gè)接口都應(yīng)定義版本號(hào),為后續(xù)不兼容升級(jí)提供可能,如:2:建議使用兩位版本號(hào),因?yàn)榈谌话姹咎?hào)通常表示兼容升級(jí),只有不兼容時(shí)才需要變更服務(wù)版本。3:當(dāng)不兼容時(shí),先升級(jí)一半提供者為新版本,再將消費(fèi)者全部升為新版本,然后將剩下的一半提供者升為新版本。兼容性1:服務(wù)接口增加方法,或服務(wù)模型增加字段,可向后兼容,刪除方法或刪除字段,將

44、不兼容,枚舉類型新增字段也不兼容,需通過變更版本號(hào)升級(jí)。2:各協(xié)議的兼容性不同,參見: 服務(wù)協(xié)議枚舉值1:如果是完備集,可以用Enum,比如:ENABLE, DISABLE。2:如果是業(yè)務(wù)種類,以后明顯會(huì)有類型增加,不建議用Enum,可以用String代替。3:如果是在返回值中用了Enum,并新增了Enum值,建議先升級(jí)服務(wù)消費(fèi)方,這樣服務(wù)提供方不會(huì)返回新值。4:如果是在傳入?yún)?shù)中用了Enum,并新增了Enum值,建議先升級(jí)服務(wù)提供方,這樣服務(wù)消費(fèi)方不會(huì)傳入新值。服務(wù)化最佳實(shí)踐-2網(wǎng)做最好的學(xué)習(xí)社區(qū)序列化1:服務(wù)參數(shù)及返回值建議使用POJO對(duì)象,即通過set,get方法表示屬性的對(duì)象。2:服務(wù)

45、參數(shù)及返回值不建議使用接口,因?yàn)閿?shù)據(jù)模型抽象的意義不大,并且序列化需要接口實(shí)現(xiàn)類的元信息,并不能起到隱藏實(shí)現(xiàn)的意圖。3:服務(wù)參數(shù)及返回值都必需是byValue的,而不能是byRef的,消費(fèi)方和提供方的參數(shù)或返回值并不是同一個(gè),只是值相同,Dubbo不支持對(duì)象。異常1:建議使用異常匯報(bào)錯(cuò)誤,而不是返回錯(cuò)誤碼,異常信息能攜帶信息,以及語義更友好2:如果擔(dān)心性能問題,在必要時(shí),可以通過override掉異常類的fillInStackTrace()方法為空方法,使其不拷貝棧信息3:查詢方法不建議拋出checked異常,否則調(diào)用方在查詢時(shí)將過多的try.catch,并且不能進(jìn)行有效處理4:服務(wù)提供方不應(yīng)

46、將DAO或SQL等異常拋給消費(fèi)方,應(yīng)在服務(wù)實(shí)現(xiàn)中對(duì)消費(fèi)方不關(guān)心的異常進(jìn)行包裝,否則可能出現(xiàn)消費(fèi)方無法反序列化相應(yīng)異常。調(diào)用1:不要只是因?yàn)槭荄ubbo調(diào)用,而把調(diào)用Try-Catch起來。Try-Catch應(yīng)該加上合適的回滾邊界上。2:對(duì)于輸入?yún)?shù)的校驗(yàn)邏輯在Provider端要有。性能上的考慮,服務(wù)實(shí)現(xiàn)者可以考慮在API包上加上服務(wù)Stub類來完成檢驗(yàn)。服務(wù)化最佳實(shí)踐-3網(wǎng)做最好的學(xué)習(xí)社區(qū)Dubbo的用法-1在Provider上盡量多配置Consumer端屬性在Provider可以配置的Consumer端屬性有:1:timeout,方法調(diào)用超時(shí)2:retries,失敗重試次數(shù),缺省是2(表示

47、加上第一次調(diào)用,會(huì)調(diào)用3次)3:loadbalance,負(fù)載均衡算法,缺省是隨機(jī)(random)。還可以有輪訓(xùn)(roundrobin)、最不活躍優(yōu)先(leastactive)4:actives,消費(fèi)者端,最大并發(fā)調(diào)用限制,即當(dāng)Consumer對(duì)一個(gè)服務(wù)的并發(fā)調(diào)用到上限后,新調(diào)用會(huì)Wait直到超時(shí)。在方法上配置則并發(fā)限制針對(duì)方法,在dubbo:service上配置,則并發(fā)限制針對(duì)服務(wù)。Provider上配置合理的Provider端屬性Provider上可以配置的Provider端屬性有:1:threads,服務(wù)線大小2:executes,一個(gè)服務(wù)提供者并行執(zhí)行請(qǐng)求上限,即當(dāng)Provider對(duì)一個(gè)

48、服務(wù)的并發(fā)調(diào)用到上限后,新調(diào)用會(huì)Wait(Consumer可能會(huì)超時(shí))。配置上管理信息可以在配置上配上和組織的信息,以備有問題的時(shí)候能聯(lián)系到人。如:owner=“,”??梢耘渲迷赿ubbo:service、dubbo:reference 和dubbo:application里面。如果dubbo:service、dubbo:reference沒有配置,則使用dubbo:application設(shè)置的網(wǎng)做最好的學(xué)習(xí)社區(qū)Dubbo的用法-2配置上Dubbo緩存文件配置方法如:1:文件的路徑,應(yīng)用可以根據(jù)需要調(diào)整,保證這個(gè)文件不會(huì)在發(fā)布過程中被清除。2:如果有多個(gè)應(yīng)用進(jìn)程注意不要使用同一個(gè)文件,避免內(nèi)容

49、被覆蓋。3:這個(gè)文件會(huì)緩存:12中心的列表服務(wù)提供者列表4:有了這項(xiàng)配置后,當(dāng)應(yīng)用重啟過程中,Dubbo中心不可用時(shí)則應(yīng)用會(huì)從這個(gè)緩存文件讀取服務(wù)提供者列表的信息,進(jìn)一步保證應(yīng)用可靠性。露服務(wù),而不要使用隨機(jī)端口中心推送有延遲的情況下,消費(fèi)者通過緩存列表也能調(diào)用到原地址,保使用固定端這樣在證調(diào)用成功不要使用perties文件配置,使用對(duì)應(yīng)XML配置網(wǎng)做最好的學(xué)習(xí)社區(qū)Dubbox簡介是什么和能干什么Dubbox是在Dubbo2基礎(chǔ)上的一個(gè)擴(kuò)展版本,完全兼容Dubbo2,由當(dāng)當(dāng)網(wǎng)開源出來。主要做了如下功能:1:支持REST風(fēng)格調(diào)用(HTTP + JSON/XML)2:支持基于Kryo和FST的Java高效序列化實(shí)現(xiàn)3:支持基于Jackson的JSON序列化4:支持基于Tomcat的HTTP remoting體系5:升級(jí)Spring6:升級(jí)ZooKeeper客戶端7:支持完全基于Java代碼的Dubbo配置8:調(diào)整Demo應(yīng)用9:修正了dubbo的bug具體的描述參見:/dubbox網(wǎng)做最好的學(xué)習(xí)社區(qū)Dubbox 的RESTful=Http+json/xml調(diào)用殼 +Dubbo服務(wù)(真正實(shí)現(xiàn)功能)Dubbo服務(wù)PCAPPTV網(wǎng)做最好的學(xué)習(xí)社區(qū)restful Dubbo具體的服務(wù)Faade權(quán)限調(diào)用次數(shù)Service服務(wù)路由。DubboclientSpri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論