高并發(fā)分布式-018 -dubbo應(yīng)用jack java vip_第1頁
高并發(fā)分布式-018 -dubbo應(yīng)用jack java vip_第2頁
高并發(fā)分布式-018 -dubbo應(yīng)用jack java vip_第3頁
高并發(fā)分布式-018 -dubbo應(yīng)用jack java vip_第4頁
高并發(fā)分布式-018 -dubbo應(yīng)用jack java vip_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本課講師:Jack老師講師介紹動腦學(xué)院-Jack老師系統(tǒng)架構(gòu)師、項目經(jīng)理◆十余年Java行業(yè)經(jīng)驗?!粼吐毴A為、亞信科技、分享通信等上市公司。◆從事互聯(lián)網(wǎng)、電商平臺等開發(fā)和運營?!羰炀氄莆辗植际健⒋髷?shù)據(jù)、物聯(lián)網(wǎng)平臺、高并發(fā)、高可用等技術(shù)架構(gòu)?!舯尘半S著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴大,常規(guī)的垂直應(yīng)用架構(gòu)已無法應(yīng)對,分布式服務(wù)架構(gòu)以及流動計算架構(gòu)勢在必行,亟需一個治理系統(tǒng)確保架構(gòu)有條不紊的演進。單一應(yīng)用架構(gòu)當網(wǎng)站流量很小時,只需一個應(yīng)用,將所有功能都部署在一起,以減少部署節(jié)點和成本。此時,用于簡化增刪改查工作量的數(shù)據(jù)訪問框架(ORM)是關(guān)鍵。垂直應(yīng)用架構(gòu)當訪問量逐漸增大,單一應(yīng)用增加機器帶來的加速度越來越小,將應(yīng)用拆成互不相干的幾個應(yīng)用,以提升效率。此時,用于加速前端頁面開發(fā)的Web框架(MVC)是關(guān)鍵。分布式服務(wù)架構(gòu)當垂直應(yīng)用越來越多,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來,作為獨立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,使前端應(yīng)用能更快速的響應(yīng)多變的市場需求。此時,用于提高業(yè)務(wù)復(fù)用及整合的分布式服務(wù)框架(RPC)是關(guān)鍵。流動計算架構(gòu)當服務(wù)越來越多,容量的評估,小服務(wù)資源的浪費等問題逐漸顯現(xiàn),此時需增加一個調(diào)度中心基于訪問壓力實時管理集群容量,提高集群利用率。此時,用于提高機器利用率的資源調(diào)度和治理中心(SOA)是關(guān)鍵。架構(gòu)provider.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns=""xmlns:xsi=""xmlns:dubbo=""xsi:schemaLocation="./schema/beans/spring-beans.xsdchema/dubbo/dubbo.xsd"><!--提供方應(yīng)用信息,用于計算依賴關(guān)系--><dubbo:applicationname="hello-world-app"/><!--使用multicast廣播注冊中心暴露服務(wù)地址--><dubbo:registryaddress="zookeeper://:2181"/><!--用dubbo協(xié)議在20880端口暴露服務(wù)--><dubbo:protocolname="dubbo"port="20880"/><!--聲明需要暴露的服務(wù)接口--><dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoService"ref="demoService"/><!--和本地bean一樣實現(xiàn)服務(wù)--><beanid="demoService"class="vider.DemoServiceImpl"/></beans>consumer.xml00304<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns=""xmlns:xsi=""xmlns:dubbo=""xsi:schemaLocation="./schema/beans/spring-beans.xsdchema/dubbo/dubbo.xsd"><!--消費方應(yīng)用名,用于計算依賴關(guān)系,不是匹配條件,不要與提供方一樣--><dubbo:applicationname="consumer-of-helloworld-app"/><!--使用multicast廣播注冊中心暴露發(fā)現(xiàn)服務(wù)地址--><dubbo:registryaddress="zookeeper://:2181"/><!--生成遠程服務(wù)代理,可以和本地bean一樣使用demoService--><dubbo:referenceid="demoService"interface="com.alibaba.dubbo.demo.DemoService"/></beans>注解配置00304服務(wù)提供方importcom.alibaba.dubbo.config.annotation.Service;@Service(version="1.0.0")publicclassFooServiceImplimplementsFooService{//...}XML配置<!--掃描注解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類--><dubbo:annotationpackage="com.dongnao.jack.service"/>注解配置00304服務(wù)消費方XML配置<!--掃描注解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類--><dubbo:annotationpackage="com.dongnao.jack.controller"/>importcom.alibaba.dubbo.config.annotation.Reference;importponent;ponentpublicclassBarAction{@Reference(version="1.0.0")privateFooServicefooService;}啟動時檢查00304Dubbo缺省會在啟動時檢查依賴的服務(wù)是否可用,不可用時會拋出異常,阻止Spring初始化完成,以便上線時,能及早發(fā)現(xiàn)問題,默認check="true"??梢酝ㄟ^check="false"關(guān)閉檢查,比如,測試時,有些服務(wù)不關(guān)心,或者出現(xiàn)了循環(huán)依賴,必須有一方先啟動。另外,如果你的Spring容器是懶加載的,或者通過API編程延遲引用服務(wù),請關(guān)閉check,否則服務(wù)臨時不可用時,會拋出異常,拿到null引用,如果check="false",總是會返回引用,當服務(wù)恢復(fù)時,能自動連上。關(guān)閉某個服務(wù)的啟動時檢查(沒有提供者時報錯):<dubbo:referenceinterface="com.foo.BarService"check="false"/>關(guān)閉所有服務(wù)的啟動時檢查(沒有提供者時報錯):<dubbo:consumercheck="false"/>集群容錯00304在集群調(diào)用失敗時,Dubbo提供了多種容錯方案,缺省為failover重試。FailoverCluster失敗自動切換,當出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會帶來更長延遲。可通過retries="2"來設(shè)置重試次數(shù)(不含第一次)。重試次數(shù)配置如下:<dubbo:serviceretries=“2”/>或<dubbo:referenceretries=“2”/>或<dubbo:reference><dubbo:methodname="findFoo"retries="2"/></dubbo:reference>

FailfastCluster快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。FailsafeCluster失敗安全,出現(xiàn)異常時,直接忽略。通常用于寫入審計日志等操作。FailbackCluster失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。ForkingCluster并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源??赏ㄟ^forks="2"來設(shè)置最大并行數(shù)。BroadcastCluster廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。<dubbo:servicecluster="failsafe"/>集群容錯003041、FailoverCluster:失敗自動切換缺省值<dubbo:serviceretries="2"/>或:<dubbo:referenceretries="2"/>2、FailfastCluster:快速失敗通常用于非冪等性的寫操作,比如新增記錄。<dubbo:servicecluster="failfast"/>或:<dubbo:referencecluster="failfast"/>3、FailsafeCluster:失敗安全失敗安全,出現(xiàn)異常時,直接忽略。通常用于寫入審計日志等操作。<dubbo:servicecluster="failsafe"/>或:<dubbo:referencecluster="failsafe"/>4、FailbackCluster:失敗自動恢復(fù)失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。<dubbo:servicecluster="failback"/>或:<dubbo:referencecluster="failback"/>5、ForkingCluster:并行調(diào)用并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源??赏ㄟ^forks="2"來設(shè)置最大并行數(shù)。<dubbo:servicecluster=“forking"/>或:<dubbo:referencecluster=“forking"/>負載均衡003041、RandomLoadBalance隨機,按權(quán)重設(shè)置隨機概率。在一個截面上碰撞的概率高,但調(diào)用量越大分布越均勻,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重。2、RoundRobinLoadBalance輪循,按公約后的權(quán)重設(shè)置輪循比率。存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調(diào)到第二臺時就卡在那,久而久之,所有請求都卡在調(diào)到第二臺上。3、ConsistentHashLoadBalance一致性Hash,相同參數(shù)的請求總是發(fā)到同一提供者。當某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點,平攤到其它提供者,不會引起劇烈變動。缺省只對第一個參數(shù)Hash,如果要修改,請配置

<dubbo:parameter

key="hash.arguments"value="0,1"

/>缺省用160份虛擬節(jié)點,如果要修改,請配置

<dubbo:parameter

key="hash.nodes"

value="320"

/>hash.arguments

:當進行調(diào)用時候根據(jù)調(diào)用方法的哪幾個參數(shù)生成key,并根據(jù)key來通過一致性hash算法來選擇調(diào)用結(jié)點。例如調(diào)用方法invoke(Strings1,Strings2);若hash.arguments為1(默認值),則僅取invoke的參數(shù)1(s1)來生成hashCode。hash.nodes:為結(jié)點的副本數(shù)4、LeastActiveLoadBalance最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機,活躍數(shù)指調(diào)用前后計數(shù)差。使慢的提供者收到更少請求,因為越慢的提供者的調(diào)用前后計數(shù)差會越大。服務(wù)分組00304當一個接口有多種實現(xiàn)時,可以用group區(qū)分。服務(wù)<dubbo:servicegroup="feedback"interface="com.xxx.IndexService"/><dubbo:servicegroup="member"interface="com.xxx.IndexService"/>引用<dubbo:referenceid="feedbackIndexService"group="feedback"interface="com.xxx.IndexService"/><dubbo:referenceid="memberIndexService"group="member"interface="com.xxx.IndewxService"/>多版本00304當一個接口實現(xiàn),出現(xiàn)不兼容升級時,可以用版本號過渡,版本號不同的服務(wù)相互間不引用??梢园凑找韵碌牟襟E進行版本遷移:1.在低壓力時間段,先升級一半提供者為新版本2.再將所有消費者升級為新版本3.然后將剩下的一半提供者升級為新版本老版本服務(wù)提供者配置:<dubbo:serviceinterface="com.foo.BarService"version="1.0.0"/>新版本服務(wù)提供者配置:<dubbo:serviceinterface="com.foo.BarService"version="2.0.0"/>老版本服務(wù)消費者配置:<dubbo:referenceid="barService"interface="com.foo.BarService"version="1.0.0"/>新版本服務(wù)消費者配置:<dubbo:referenceid="barService"interface="com.foo.BarService"version="2.0.0"/>如果不需要區(qū)分版本,可以按照以下的方式配置:<dubbo:referenceid="barService"interface="com.foo.BarService"version="*"/>參數(shù)驗證00304Maven依賴<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.0.0.GA</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.2.0.Final</version></dependency>結(jié)果緩存00304緩存類型lru基于最近最少使用原則刪除多余緩存,保持最熱的數(shù)據(jù)被緩存。使用泛化調(diào)用00304泛化接口調(diào)用方式主要用于客戶端沒有API接口及模型類元的情況,參數(shù)及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:實現(xiàn)一個通用的服務(wù)測試框架,可通過GenericService調(diào)用所有服務(wù)實現(xiàn)。在Spring配置申明generic="true":<dubbo:referenceid="barService"interface="com.foo.BarService"generic="true"/>在Java代碼獲取barService并開始泛化調(diào)用:GenericServicebarService=(GenericService)applicationContext.getBean("barService");Objectresult=barService.$invoke("sayHello",newString[]{"java.lang.String"},newObject[]{"World"});實現(xiàn)泛化調(diào)用00304泛接口實現(xiàn)方式主要用于服務(wù)器端沒有API接口及模型類元的情況,參數(shù)及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:實現(xiàn)一個通用的遠程服務(wù)Mock框架,可通過實現(xiàn)GenericService接口處理所有服務(wù)請求。在Java代碼中實現(xiàn)GenericService接口:packagecom.foo;publicclassMyGenericServiceimplementsGenericService{publicObject$invoke(StringmethodName,String[]parameterTypes,Object[]args)throwsGenericException{if("sayHello".equals(methodName)){return"e"+args[0];}}}通過Spring暴露泛化實現(xiàn)在Spring配置申明服務(wù)的實現(xiàn):<beanid="genericService"class="com.foo.MyGenericService"/><dubbo:serviceinterface="com.foo.BarService"ref="genericService"/>回聲測試00304回聲測試用于檢測服務(wù)是否可用,回聲測試按照正常請求流程執(zhí)行,能夠測試整個調(diào)用是否通暢,可用于監(jiān)控。所有服務(wù)自動實現(xiàn)EchoService接口,只需將任意服務(wù)引用強制轉(zhuǎn)型為EchoService,即可使用。代碼://遠程服務(wù)引用MemberServicememberService=ctx.getBean("memberService");EchoServiceechoService=(EchoService)memberService;//強制轉(zhuǎn)型為EchoService//回聲測試可用性Stringstatus=echoService.$echo("OK");assert(status.equals("OK"));異步調(diào)用00304基于NIO的非阻塞實現(xiàn)并行調(diào)用,客戶端不需要啟動多線程即可完成并行調(diào)用多個遠程服務(wù),相對多線程開銷較小。在consumer.xml中配置:<dubbo:referenceid="fooService"interface="com.alibaba.foo.FooService"><dubbo:methodname="findFoo"async="true"/></dubbo:reference><dubbo:referenceid="barService"interface="com.alibaba.bar.BarService"><dubbo:methodname="findBar"async="true"/></dubbo:reference>參數(shù)回調(diào)00304參數(shù)回調(diào)方式與調(diào)用本地callback或listener相同,只需要在Spring的配置文件中聲明哪個參數(shù)是callback類型即可。Dubbo將基于長連接生成反向代理,這樣就可以從服務(wù)器端調(diào)用客戶端邏輯服務(wù)提供者配置示例<beanid="callbackService"class="com.callback.impl.CallbackServiceImpl"/><dubbo:serviceinterface="com.callback.CallbackService"ref="callbackService"connections="1"callbacks="1000"><dubbo:methodname="addListener"><dubbo:argumentindex="1"callback="true"/><!--也可以通過指定類型的方式--><!--<dubbo:argumenttype="com.demo.CallbackListener"callback="true"/>--></dubbo:method></dubbo:service>事件通知00304在調(diào)用之前、調(diào)用之后、出現(xiàn)異常時,會觸發(fā)oninvoke、onreturn、onthrow三個事件,可以配置當事件發(fā)生時,通知哪個類的哪個方法。服務(wù)消費者Callback接口interfaceNotify{publicvoidonreturn(Personmsg,Integerid);publicvoidonthrow(Throwableex,Integerid);}服務(wù)消費者Callback配置<beanid="demoCallback"class="com.alibaba.dubbo.callback.implicit.NofifyImpl"/><dubbo:referenceid="demoService"interface="com.alibaba.dubbo.callback.implicit.IDemoService"version="1.0.0"group="cn"><dubbo:methodname="get"async="true"onreturn="demoCallback.onreturn"onthrow="demoCallback.onthrow"/></dubbo:reference>本地存根00304遠程服務(wù)后,客戶端通常只剩下接口,而實現(xiàn)全在服務(wù)器端,但提供方有些時候想在客戶端也執(zhí)行部分邏輯,比如:做ThreadLocal緩存,提前驗證參數(shù),調(diào)用失敗后偽造容錯數(shù)據(jù)等等,此時就需要在API中帶上Stub,客戶端生成Proxy實例,會把Proxy通過構(gòu)造函數(shù)傳給Stub,然后把Stub暴露給用戶,Stub可以決定要不要去調(diào)Proxy。在spring配置文件中按以下方式配置:<dubbo:serviceinterface="com.foo.BarService"stub="com.foo.BarServiceStub"/>1、Stub必須有可傳入Proxy的構(gòu)造函數(shù)。?2、

在interface旁邊放一個Stub實現(xiàn),它實現(xiàn)BarService接口,并有一個傳入遠程BarService實例的構(gòu)造函數(shù)?本地偽裝00304本地偽裝通常用于服務(wù)降級,比如某驗權(quán)服務(wù),當服務(wù)提供方全部掛掉后,客戶端不拋出異常,而是通過Mock數(shù)據(jù)返回授權(quán)失敗。在spring配置文件中按以下方式配置:<dubbo:serviceinterface="com.foo.BarService"mock="com.foo.BarServiceMock"/>1、Mock是Stub的一個子集,便于服務(wù)提供方在客戶端執(zhí)行容錯邏輯,因經(jīng)常需要在出現(xiàn)RpcException(比如網(wǎng)絡(luò)失敗,超時等)時進行容錯,而在出現(xiàn)業(yè)務(wù)異常(比如登錄用戶名密碼錯誤)時不需要容錯,如果用Stub,可能就需要捕獲并依賴RpcException類,而用Mock就可以不依賴RpcException,因為它的約定就是只有出現(xiàn)RpcException時才執(zhí)行。?2、在interface旁放一個Mock實現(xiàn),它實現(xiàn)BarService接口,并有一個無參構(gòu)造函數(shù)?延遲暴露00304延遲到Spring初始化完成后,再暴露服務(wù)<dubbo:servicedelay="-1"/><dubbo:providerdeplay=”-1”/>規(guī)避spring的加載死鎖問題并發(fā)控制00304限制com.foo.BarService的每個方法,服務(wù)器端并發(fā)執(zhí)行(或占用線程池線程數(shù))不能超過10個:<dubbo:serviceinterface="com.foo.BarService"executes="10"/>限制com.foo.BarService的sayHello方法,服務(wù)器端并發(fā)執(zhí)行(或占用線程池線程數(shù))不能超過10個:<dubbo:serviceinterface="com.foo.BarService"><dubbo:methodname="sayHello"executes="10"/></dubbo:service>限制com.foo.BarService的每個方法,每客戶端并發(fā)執(zhí)行(或占用連接的請求數(shù))不能超過10個:<dubbo:serviceinterface="com.foo.BarService"actives="10"/><dubbo:referenceinterface="com.foo.BarService"actives="10"/>限制com.foo.BarService的sayHello方法,每客戶端并發(fā)執(zhí)行(或占用連接的請求數(shù))不能超過10個:<dubbo:serviceinterface="com.foo.BarService"><dubbo:methodname="sayHello"actives="10"/></dubbo:service><dubbo:referenceinterface="com.foo.BarService"><dubbo:methodname="sayHello"actives="10"/></dubbo:service>如果<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>優(yōu)先連接控制00304服務(wù)端連接控制限制服務(wù)器端接受的連接不能超過10個<dubbo:providerprotocol="dubbo"accepts="10"/><dubbo:protocolname="dubbo"accepts="10"/>客戶端連接控制限制客戶端服務(wù)使用連接不能超過10個<dubbo:referenceinterface="com.foo.BarService"connections="10"/><dubbo:serviceinterface="com.foo.BarService"connections="10"/>延遲連接延遲連接用于減少長連接數(shù)。當有調(diào)用發(fā)起時,再創(chuàng)建長連接。<dubbo:protocolname="dubbo"lazy="true"/>注意:該配置只對使用長連接的dubbo協(xié)議生效。粘滯連接粘滯連接用于有狀態(tài)服務(wù),盡可能讓客戶端總是向同一提供者發(fā)起調(diào)用,除非該提供者掛了,再連另一臺。粘滯連接將自動開啟延遲連接,以減少長連接數(shù)。<dubbo:protocolname="dubbo"sticky="true"/>令牌驗證00304通過令牌驗證在注冊中心控制權(quán)限,以決定要不要下發(fā)令牌給消費者,可以防止消費者繞過注冊中心訪問提供者,另外通過注冊中心可靈活改變授權(quán)方式,而不需修改或升級提供者可以全局設(shè)置開啟令牌驗證:<!--隨機token令牌,使用UUID生成--><dubbo:providerinterface="com.foo.BarService"token="true"/><!--固定token令牌,相當于密碼--><dubbo:providerinterface="com.foo.BarService"token="123456"/><!--隨機token令牌,使用UUID生成--><dubbo:serviceinterface="com.foo.BarService"token="true"/><!--固定token令牌,相當于密碼--><dubbo:serviceinterface="com.foo.BarService"token="123456"/>路由規(guī)則00304路由規(guī)則決定一次dubbo服務(wù)調(diào)用的目標服務(wù)器,分為條件路由規(guī)則和腳本路由規(guī)則,并且支持可擴展。向注冊中心寫入路由規(guī)則的操作通常由監(jiān)控中心或治理中心的頁面完成registry.register(URL.valueOf(".foo.BarService?category=routers&dynamic=false&rule="+URL.encode("host=0=>host=1")+"));condition://表示路由規(guī)則的類型,支持條件路由規(guī)則和腳本路由規(guī)則,可擴展,必填。表示對所有IP地址生效,如果只想對某個IP的生效,請?zhí)钊刖唧wIP,必填。com.foo.BarService表示只對指定服務(wù)生效,必填。category=routers表示該數(shù)據(jù)為動態(tài)配置類型,必填。dynamic=false表示該數(shù)據(jù)為持久數(shù)據(jù),當注冊方退出時,數(shù)據(jù)依然保存在注冊中心,必填。enabled=true覆蓋規(guī)則是否生效,可不填,缺省生效。force=false當路由結(jié)果為空時,是否強制執(zhí)行,如果不強制執(zhí)行,路由結(jié)果為空的路由規(guī)則將自動失效,可不填,缺省為flase。runtime=false是否在每次調(diào)用時執(zhí)行路由規(guī)則,否則只在提供者地址列表變更時預(yù)先執(zhí)行并緩存結(jié)果,調(diào)用時直接從緩存中獲取路由結(jié)果。如果用了參數(shù)路由,必須設(shè)為true,需要注意設(shè)置會影響調(diào)用的性能,可不填,缺省為flase。priority=1路由規(guī)則的優(yōu)先級,用于排序,優(yōu)先級越大越靠前執(zhí)行,可不填,缺省為0。rule=URL.encode("host=0=>host=1")表示路由規(guī)則的內(nèi)容,必填。路由規(guī)則00304條件路由規(guī)則基于條件表達式的路由規(guī)則,如:host=10.20.1

溫馨提示

  • 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

提交評論