http://dubbo.apache.org/zh-cn/docs/dev/implementation.html
https://www.cnblogs.com/tiancai/p/9573912.html
1.背景
1 單一應用架構
2 應用和數據庫單獨部署
3 應用和數據庫集群部署
4 數據庫壓力變大,讀寫分離
5 使用緩存技術加快速度
6 數據庫分庫分表
7 應用分為不同的類型拆分
發展到這個階段的時候,我們發現,應用與應用之間的關系已經十分的復雜了,就會出現以下幾個問題(以下摘錄於官網):
① 當服務越來越多時,服務 URL 配置管理變得非常困難,F5 硬件負載均衡器的單點壓力也越來越大。
② 當進一步發展,服務間依賴關系變得錯蹤復雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關系。
③ 接着,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什么時候該加機器?
為了解決這由於架構的演變所產生的問題幾個問題,於是,dubbo 產生了。當然,解決這個問題的技術不止 dubbo 。
二 Dubbo的結構圖
從上圖中我們可以看到,Dubbo結構很像生產者-消費者模型,只是在上面這個模型基礎上,加了注冊中心和監控模塊,分別用於管理服務提供方的url,以及監控管理整個流程。生產者(Provider)
整個發布,訂閱流程:
- 啟動容器,加載,運行服務提供者
- 服務提供者在啟動時,在注冊中心發布注冊自己提供的服務
- 服務消費者在啟動時,在注冊中心訂閱自己所需的服務。
如果存在服務失敗或者變更的情況,Dubbo就進行如下的操作:
- 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
- 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
三Dubbo實例教程
3.1導入Maven依賴
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.ouyangsihai</groupId> 8 <artifactId>dubbo-provider</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>junit</groupId> 14 <artifactId>junit</artifactId> 15 <version>3.8.1</version> 16 <scope>test</scope> 17 </dependency> 18 <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> 19 <dependency> 20 <groupId>com.alibaba</groupId> 21 <artifactId>dubbo</artifactId> 22 <version>2.6.6</version> 23 </dependency> 24 <dependency> 25 <groupId>org.apache.zookeeper</groupId> 26 <artifactId>zookeeper</artifactId> 27 <version>3.4.10</version> 28 </dependency> 29 <dependency> 30 <groupId>com.101tec</groupId> 31 <artifactId>zkclient</artifactId> 32 <version>0.5</version> 33 </dependency> 34 <dependency> 35 <groupId>io.netty</groupId> 36 <artifactId>netty-all</artifactId> 37 <version>4.1.32.Final</version> 38 </dependency> 39 <dependency> 40 <groupId>org.apache.curator</groupId> 41 <artifactId>curator-framework</artifactId> 42 <version>2.8.0</version> 43 </dependency> 44 <dependency> 45 <groupId>org.apache.curator</groupId> 46 <artifactId>curator-recipes</artifactId> 47 <version>2.8.0</version> 48 </dependency> 49 50 </dependencies> 51 </project>
3.2定義Provider接口
首先,定義Provider的接口,並實現provider接口, Dubbo 的作用簡單來說就是給消費端提供接口。Dubbo將Provider接口在服務中心注冊,Consumer端就可以調用該注冊的接口。
/** * 定義provider接口 */ public interface ProviderService { String SayHello(String word); } /** * 定義provider接口的實現類 */ public class ProviderServiceImpl implements ProviderService{ public String SayHello(String word) { return word; } }
3.3暴露Provider接口的配置方式
包括:xml配置,api配置和注解配置。下面只介紹下xml配置的方式,這種方式比較常用。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 4 xmlns="http://www.springframework.org/schema/beans" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 6 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> 7 8 <dubbo:application name="項目名" organization="項目部門" 9 owner="san.zhang"/> 10 <dubbo:protocol port="${端口號}" threadpool="dynamic.dubbo.thread.pool"> 11 <dubbo:parameter key="threadname" value="dubbo.thread"/> 12 <dubbo:parameter key="corethreads" value="150"/> 13 <dubbo:parameter key="threads" value="250"/> 14 <dubbo:parameter key="queues" value="1000"/> 15 </dubbo:protocol> 16 17 //注冊需要暴露的服務providerServiceImp, 18 <dubbo:service ref="providerServiceImp" 19 registry="ttsi_flight_detail" 20 interface="com.api.ProviderService" 21 version="1.0.0" 22 timeout="30000"> 27 <dubbo:parameter key="qloglevel" value="${dubboLog.level:10}"/> 28 </dubbo:service> 29 <!--Bean bean定義--> 30 <bean id="providerServiceImp" class="com.dubbo.ProviderServiceImp"/> 31 //dubbo.zk.address一般指定zk地址,dubbo.group指定項目的組,id作為標識 32 <dubbo:registry address="${dubbo.zk.address}" group="${dubbo.group}" protocol="zookeeper" 33 id="oag"/> 34 35 </beans>
3.4Consumer端
3.4.1 Maven配置跟Provider端配置一樣
3.4.2 xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--當前項目在整個分布式架構里面的唯一名稱,計算依賴關系的標簽--> <dubbo:application name="consumer" owner="jie"/> <!--dubbo這個服務所要暴露的服務地址所對應的注冊中心--> <!--點對點的方式--> <!--<dubbo:registry address="N/A" />--> <dubbo:registry address="{zk.address}" port="{port}" check="false"/> <!--生成一個遠程服務的調用代理--> <dubbo:reference id="providerService" interface="Service.ProviderService"/> </beans>
未完待續。。。