Dubbo 高性能 RPC 框架實(shí)踐
?Dubbo 介紹
Dubbo 是什么?
介紹:Apache Dubbo 是一款微服務(wù)框架,為大規(guī)模微服務(wù)實(shí)踐提供高性能 RPC 通信、流量治理、可觀測性等解決方案,涵蓋 Java、Golang 等多種語言 SDK 實(shí)現(xiàn)。
特征:RPC 通訊框架,服務(wù)注冊(cè)中心,支持原生云(Dubbo3.0)
主流版本:2.7.x , 3.0 **SDK: **官方 SDK 支持開發(fā)語言:Java、Golang
使用廠家:阿里巴巴、餓了么、釘釘、工商銀行、小米等
注:本文后續(xù)主要基于 2.7.x 版本展開。
Dubbo 和 Eureka 對(duì)比
對(duì)比 | Dubbo | Eureka(Spring-Cloud-Netflix) |
注冊(cè)中心 | ZK | Eureka |
CAP | CP | AP |
容錯(cuò)機(jī)制 | 支持 | 通過 Hytrix 支持 |
負(fù)載均衡 | 支持 | 通過 Ribbon 支持 |
服務(wù)注冊(cè)和發(fā)現(xiàn)協(xié)議 | 封裝 NettyClient 實(shí)現(xiàn) | 使用 HttpClient |
社區(qū)支持 | Apache | 不更新 |
總結(jié):Dubbo 對(duì)比 Eureka 來說的話,其實(shí)一個(gè)打包的微服務(wù)中間件,并且定制化了 RPC 通訊 dubbo 協(xié)議對(duì)比 HTTP 協(xié)議來說性能上會(huì)有一定的提高。但是我們對(duì)于微服務(wù)本身來說應(yīng)該是一個(gè)細(xì)粒度的,可以定制的組件對(duì)于 Eureka 來說這方面更強(qiáng)。
Dubbo 使用案例
下面是一個(gè)通過 dubbo 作為 RPC 通訊的一個(gè)例子,一般在生產(chǎn)中會(huì)使用 zk 或者 redis 等,作為服務(wù)注冊(cè)中心來保存服務(wù)信息。一個(gè)大致的交互圖如下:
三個(gè)角色
- Zookeeper 作為一個(gè)服務(wù)注冊(cè)中心,管理和維護(hù)服務(wù)列表;
- Provider 服務(wù)提供者,發(fā)布服務(wù);
- Consumer 服務(wù)消費(fèi)者,通過 API stub 可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程的方法;
服務(wù)提供者
服務(wù)接口定義
public interface OrderService {
String createOrder(String request);
}
服務(wù)提供者實(shí)現(xiàn)
public class OrderServiceImpl implements OrderService {
@Override
public String createOrder(String request) {
return "create order success, request : " + request;
}
}
服務(wù)啟動(dòng)類
public class RpcDubboProvidorApp {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo.xml"});
context.start();
System.in.read(); // 按任意鍵退出
}
}
配置文件
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系 -->
<dubbo:application name="rpc-dubbo-provider"/>
<!-- 使用 zookeeper 注冊(cè)中心暴露服務(wù)地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 用dubbo協(xié)議在20880端口暴露服務(wù) -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 聲明需要暴露的服務(wù)接口 -->
<dubbo:service interface="io.zhengsh.rpc.api.OrderService" ref="orderService" />
<!-- 和本地bean一樣實(shí)現(xiàn)服務(wù) -->
<bean id="orderService" class="io.zhengsh.rpc.provider.OrderServiceImpl" />
</beans>
服務(wù)消費(fèi)者
服務(wù)配置
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 配置應(yīng)用名稱 -->
<dubbo:application name="rpc-dubbo-consumer" />
<!-- 配置 zookeeper 注冊(cè)中心的位置 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 配置dubbo的通訊方式,即使用的協(xié)議及使用的端口 -->
<dubbo:protocol name="dubbo" port="20890" />
<!-- 生成遠(yuǎn)程服務(wù)代理,可以和本地bean一樣使用 orderService -->
<dubbo:reference id="orderService" interface="io.zhengsh.rpc.api.OrderService" />
</beans>
服務(wù)調(diào)用方代碼
public class RpcDubboConsumerApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo.xml"});
context.start();
// 獲取遠(yuǎn)程服務(wù)代理
OrderService demoService = (OrderService) context.getBean("orderService");
// 執(zhí)行遠(yuǎn)程方法
String hello = demoService.createOrder("iPhone 19");
// 顯示調(diào)用結(jié)果
System.out.println(hello);
}
}
運(yùn)行一下:
- 我們首先啟動(dòng)RpcDubboProvidorApp
- 然后啟動(dòng)RpcDubboConsumerApp
- 控制臺(tái)輸出如下:
你如果也能獲得如下的輸出表示實(shí)驗(yàn)成功。恭喜。
Dubbo 監(jiān)控
Dubbo Admin 安裝
- 下載代碼:git clone https://github.com/apache/dubbo-admin.git
- 在dubbo-admin-server/src/main/resources/application.properties中指定注冊(cè)中心地址
構(gòu)建
mvn clean package -Dmaven.test.skip=true
啟動(dòng)
- mvn --projects dubbo-admin-server spring-boot:run 或者
- cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.4.0.jar
訪問 http://localhost:8080
默認(rèn)密碼是 root/root
Dubbo Admin 使用
找到自己注冊(cè)服務(wù)
模擬請(qǐng)求服務(wù)
點(diǎn)擊上一個(gè)頁面的 測試? 按鈕,進(jìn)入如下頁面,測試服務(wù)接口,如下圖:
我傳遞參數(shù),下面成功返回,可以在開發(fā)期間做一個(gè)簡單的測試。
服務(wù)提供者和服務(wù)消費(fèi)者查詢?nèi)缦聢D所示。
雙擊服務(wù)列表中的服務(wù)即可進(jìn)入。
參考文檔
https://dubbo.apache.org/zh/docsv2.7/user/quick-start/
https://github.com/apache/dubbo-admin/blob/develop/README_ZH.md