Dubbo 一點點見解
一 爲什麼需要 dubbo
很多時候,其實我們使用這個技術的時候,可能都是因爲項目需要,所以,我們就用了,但是,至於爲什麼我們需要用到這個技術,可能自身並不是很瞭解的,但是,其實瞭解技術的來由及背景知識,對於理解一項技術還是有幫助的,那麼,dubbo是怎麼被提上日程的呢?
在互聯網的發展過程中,在以前,我們只需要一個服務器,將程序全部打包好就可以,但是,隨着流量的增大,常規的垂直應用架構已無法應對,所以,架構就發生了演變。
1 單一應用架構
2 應用和數據庫單獨部署
3 應用和數據庫集羣部署
4 數據庫壓力變大,讀寫分離
5 使用緩存技術加快速度
6 數據庫分庫分表
7 應用分爲不同的類型拆分
發展到這個階段的時候,我們發現,應用與應用之間的關係已經十分的複雜了,就會出現以下幾個問題(以下摘錄於官網):
① 當服務越來越多時,服務 URL 配置管理變得非常困難,F5 硬件負載均衡器的單點壓力也越來越大。
② 當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪個應用要在哪個應用之前啓動,架構師都不能完整的描述應用的架構關係。
③ 接着,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什麼時候該加機器?
爲了解決這由於架構的演變所產生的問題幾個問題,於是,dubbo 產生了。當然,解決這個問題的技術不止 dubbo 。
從上面 Dubbo 的服務治理圖我們就可以看到,Duboo 很好了解決了上面所出現的一些問題。
所以,當你的系統架構發展到了這種階段的時候,就需要考慮使用 Dubbo 了。
二 Dubbo 技術架構
我們已經非常清楚的知道爲什麼在我們的系統中需要 Dubbo 這項技術了,下面,我們接着嘮叨嘮叨 Dubbo 的架構。
看到圖之後,可能你對上面的幾個概念還是一臉懵逼,無從下手,下面,帶你看看這幾個角色到底是什麼意思?
節點角色說明
節點 角色說明
Provider 暴露服務的服務提供方
Consumer 調用遠程服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的調用次數和調用時間的監控中心
Container 服務運行容器
看了這幾個概念後似乎發現,其實 Dubbo 的架構也是很簡單的(其實現細節是複雜的),爲什麼這麼說呢,有沒有發現,其實很像生產者-消費者模型。只是在這種模型上,加上了註冊中心和監控中心,用於管理提供方提供的url,以及管理整個過程。
那麼,整個發佈-訂閱的過程就非常的簡單了。
啓動容器,加載,運行服務提供者。
服務提供者在啓動時,在註冊中心發佈註冊自己提供的服務。
服務消費者在啓動時,在註冊中心訂閱自己所需的服務。
如果考慮失敗或變更的情況,就需要考慮下面的過程。
註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
通過這番講解,我相信 Dubbo 的架構我們也輕車熟路了,那就直接入手,開車吧。
三 Dubbo 開發
3.1 服務端
定義接口
public interface EmpDubboService {
/**
* 根據 用戶Id 獲取用戶接口
* @param empId
* @return
*/
EmpInfoDto getByEmpId(Long empId);
}
接着,定義它的實現類。
@Service("empDubboService")
public class EmpDubboServiceImpl implements EmpDubboService {
@Override
public EmpInfoDto getByEmpId(Long empId) {
return null;
}
}
導入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ouyangsihai</groupId>
<artifactId>dubbo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.5</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
另外,這裏我們使用 zookeeper 作爲註冊中心。
接着 服務暴露,在資源文件下創建dubbo.xml,添加如下配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--
<dubbo:provider threads="1000" payload="67108864" />
-->
<!-- 定義監控中心 -->
<!--
<dubbo:monitor address="mxDubbo://127.0.0.1:1122"/>
-->
<!-- 提供方應用信息,用於計算依賴關係 -->
<dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}" />
<dubbo:service interface="com.meicloud.paas.muc.dubbo.organization.service.EmpDubboService"
ref="empDubboService">
</beans>
3.2消費端
在消費服務下資源文件創建消費文件dubbo-reference.xml,添加如下配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:reference id="empDubboService" interface="com.meicloud.paas.muc.dubbo.organization.service.EmpDubboService" retries="0" timeout="30000" lazy="true"/>
</beans>
依賴服務通過方接口
<dependency>
<groupId>com.meicloud.mp</groupId>
<artifactId>mdm-dubbo-interface</artifactId>
</dependency>
跟服務端一樣啓動即可