Dubbo是什麼?
Dubbo官網介紹Dubbo,Apache Dubbo™ 是一款高性能Java RPC框架。
RPC又是啥?
RPC就是Remote Procedure Call的簡稱,中文翻譯遠程過程調用,顧名思義遠程過程調用相對本地過程調用。說起RPC,就不能不說到分佈式----促使RPC誕生的領域。
假設有一個接口DemoService,以及它的實現類DemoServiceImpl,那麼在系統還是單體應用時,你要調用DemoService的方法來執行,直接new一個CalculatorImpl,然後調用對應方法就行了,其實就是非常普通的本地函數調用,因爲在同一個地址空間,或者說在同一塊內存,所以通過方法棧和參數棧就可以實現。現在,基於高性能和高可靠等因素的考慮,你決定將系統改造爲分佈式應用,將很多可以共享的功能都單獨拎出來,比如上面說到的DemoServiceImpl,你單獨把它放到一個服務裏頭,讓別的服務去調用它。
而RPC就是解決服務之間調用方案,RPC要能夠像本地調用一樣方便,讓調用者感知不到遠程調用的邏輯。
RPC是兩個服務器之間的調用這就涉及服務間的通信等問題,即我們在項目就要考慮RPC的高可用、複用性等問題,因此就有RPC框架的出現,而Dubbo就是一個高性能高可用的RPC框架。
Dubbo的架構
角色說明
節點 | 角色說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務註冊與發現的註冊中心 |
Monitor | 統計服務的調用次數和調用時間的監控中心 |
Container | 服務運行容器 |
調用關係
服務容器負責啓動,加載,運行服務提供者。
服務提供者在啓動時,向註冊中心註冊自己提供的服務。
服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
如何使用?
xml配置方式、multicast作爲註冊中心
項目結構
引入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
服務提供者
定義接口
public interface DubboService {
String sayHello(String name);
}
實現接口
public class DubboServiceImpl implements DubboService {
@Override
public String sayHello(String name) {
return "hello " + name;
}
}
暴露接口
<!-- 使用multicast廣播註冊中心暴露服務地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 聲明需要暴露的服務接口 -->
<dubbo:service interface="com.liao.dubbo.DubboService" ref="demoService"/>
<!-- 和本地bean一樣實現服務 -->
<bean id="demoService" class="com.liao.dubbo.provider.DubboServiceImpl"/>
xml方式啓動
public class XmlProvider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.in.read(); // 按任意鍵退出,等待消費者調用
}
}
服務消費者
定義接口
public interface DubboService {
String sayHello(String name);
}
配置註冊中心
<!-- 使用multicast廣播註冊中心暴露發現服務地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 生成遠程服務代理,可以和本地bean一樣使用demoService -->
<dubbo:reference id="demoService" interface="com.liao.dubbo.DubboService" />
xml方式啓動
public class XmlConsumer {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
DubboService demoService = (DubboService) context.getBean("demoService"); // 獲取遠程服務代理
String hello = demoService.sayHello("world"); // 執行遠程方法
System.out.println(hello); // 顯示調用結果
System.out.println();
System.out.println(demoService);
context.close();
}
}
測試效果
首先啓動Provider等待調用,然後啓動Consumer查看調用結果,如與使用本地方法調用如出一轍。
此外Dubbo還提供了API和註解等配置方式
註解方式:適用於spring應用,需要2.6.3及以上版本 ;API方式: (生產中很少使用),API方式使用範圍說明:API僅用於OpenAPI,ESB,Test,Mock等系統集成。
普通服務提供方或消費方,官方推薦採用XML配置方式使用Dubbo。
結尾
Dubbo作爲一款RPC框架,使用簡單、支持多種配置方式(API、Xml、註解),支持多種註冊中心(Multicast、Zookeeper、Redis、Simple), 使用場景(服務開發[rpc應用開發]服務軟負載均衡、服務依賴管理、服務監控、服務治理)。另外,學習資料齊全見官網文檔。