- 高可用可伸縮微服務架構:基于Dubbo、Spring Cloud和Service Mesh
- 程超 梁桂釗 秦金衛 方志斌 張逸等
- 1315字
- 2019-07-26 18:51:00
3.1 Dubbo框架的選型與使用
3.1.1 Dubbo框架的選型
通過表3-1可以看出不同的微服務框架各有優缺點,從分類上來說可以分為兩類:服務治理型和多語言型。
表3-1

服務治理型框架包括Dubbo、Dubbox、Motan、Spring Cloud。
多語言型框架包括gRPC、Thrift。
Dubbo是阿里開源的一個高性能優秀的Java服務框架,使應用可通過RPC實現服務的輸出和輸入功能,同時可以和Spring框架進行無縫集成。
3.1.2 Dubbo框架的使用
在我們正式使用之前,先簡單介紹一下Dubbo的架構,對其有一個整體的了解(架構圖可參考Dubbo官網)。
通過架構圖可以看到,Dubbo提供了三個關鍵功能:
● 基于接口的遠程調用;
● 容錯和負載均衡;
● 自動服務注冊和發現。
從本章開始我們將正式以支付場景為案例和大家一起探討微服務從0到1的過程,下面將以一個具體的例子來說明。
1.搭建項目工程結構
項目工程結構分為兩個子模塊,分別是superpay-tradecenter-core和superpay-tradecenter-facade,這個工程的命名代表支付場景中的交易,具體工程結構如圖3-1所示。

圖3-1
在圖3-1中,我們計劃將Dubbo服務的實現類寫在superpay-tradecenter-core的facade.impl包中,將接口類寫入super-tradecenter-facade工程,這樣就將依賴與核心分開了,
2.編寫Dubbo服務代碼
注:本章約定所有的Dubbo服務類都以facade作為后綴。
建立Dubbo服務前需要先創建服務的接口類,在super-tradecenter-facade模塊中寫入接口類PayTradeFacade,該接口類目前只有一個支付請求方法payRequest:
public interface PayTradeFacade { /** * 支付請求 * @param payRequestDto * @return */ public PayResponseDto payRequest(PayRequestDto payRequestDto); }
在payRequest方法中有一個入參PayRequestDto,里面主要包括商戶支付請求的一些數據,方便后續支付業務進行校驗;還有一個參數PayResponseDto,主要是將支付請求的結果返回給調用方,包括返回碼和錯誤描述,代碼如下所示。
public class PayRequestDto { private static final long serialVersionUID = -723763178242138577L; //商戶訂單號 private Long merchantOrderNo; //用戶電話 private String phone; //用戶姓名 private String userName; //支付金額 private BigDecimal payAmount; //商戶號 private String merchantNo; //商戶請求時間 private Date merchantReqTime; //訂單幣種 private String orderCurrency; } public class PayResponseDto { private static final long serialVersionUID = -723763178242138577L; //返回碼 private String returnCode; //返回信息 private String returnMsg; }
在superpay-tradecenter-core模塊中寫入PayTradeFacade接口的實現類,代碼如下:
public class PayTradeFacadeImpl implements PayTradeFacade { @Override public PayResponseDto payRequest(PayRequestDto payRequestDto){ PayResponseDto payResponseDto = new PayResponseDto(); payResponseDto.setReturnCode("200"); return payResponseDto; } }
在代碼中,為了演示Dubbo使用的效果,我們暫時先將payRequest的返回碼設置為200,可以把PayTradeFacade接口類看作支付交易的核心子域,而接口類中的payRequest方法是這個核心子域的內聚方法,向上游提供支付請求服務。
服務代碼寫完以后,接下來要做的就是如何將服務發布出去,為了項目清晰更容易閱讀,我們依然采用配置文件的方式發布服務。現在Dubbo的最新版本是2.5.7,也是本示例中使用的版本,Spring配置文件如下所示。
<! -- 應用名 --> <dubbo:application name="superpay"/> <! -- Dubbo掃描類路徑 --> <dubbo:annotation package="com.superpay.core.facade" /> <! -- 連接到哪個本地注冊中心 --> <dubbo:registry id="dubbo-registry" address="zookeeper://localhost:2181"/> <! -- 用Dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="28080"/> <! -- 聲明需要暴露的服務接口 --> <dubbo:service registry="dubbodemo" timeout="3000" interface="com.tradecenter.facade.PayTradeFacade" ref="payTradeFacade"/> <! -- 服務類定義 --> <bean id="payTradeFacade" class="com.tradecenter.facade.impl.PayTradeFacadeImpl"/>
最終支付交易工程結構的全貌如圖3-2所示,這樣基于Dubbo的服務提供者代碼就已經實現了,接下來寫服務調用端代碼和配置。

圖3-2
3.編寫Dubbo調用端代碼
調用端的Dubbo Spring配置內容如下:
<! -- 應用名 --> <dubbo:application name="superpay"/> <! -- 連接到哪個本地注冊中心 --> <dubbo:registry id="dubbo-registry" address="zookeeper://localhost:2181"/> <! -- 用Dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="28080"/> <! -- 掃描注解包路徑,多個包用逗號分隔,不填pacakge則表示掃描當前ApplicationContext中所有的類 --> <dubbo:annotation package="com.superpay.core.facade" /> <dubbo:reference interface="com.tradecenter.facade.PayTradeFacade" timeout="2000"/>
在調用端假定支付網關業務邏輯調用交易服務的支付請求接口,代碼邏輯如下:
@Service public class PayGatewayBizImpl implements PayGatewayBiz { private static final Logger logger = LoggerFactory.getLogger(PayGatewayBizImpl.class); @Autowired private PayTradeFacade payTradeFacade; public void payRequest(PayRequestDto payRequestDto){ PayResponseDto payResponseDto = payTradeFacade.payRequest(payRequestDto); logger.info("打印Dubbo返回響應編碼:" + payResponseDto.getReturnCode()); } }
最終打印結果是:
打印Dubbo返回響應編碼:200
- Instant Testing with CasperJS
- Learning NServiceBus(Second Edition)
- Microsoft Exchange Server PowerShell Cookbook(Third Edition)
- Java 9 Concurrency Cookbook(Second Edition)
- 少年輕松趣編程:用Scratch創作自己的小游戲
- Programming ArcGIS 10.1 with Python Cookbook
- aelf區塊鏈應用架構指南
- 實戰Java高并發程序設計(第3版)
- Learning ArcGIS for Desktop
- R語言與網絡輿情處理
- 微服務架構深度解析:原理、實踐與進階
- Appcelerator Titanium:Patterns and Best Practices
- Python Programming for Arduino
- Qt 4開發實踐
- 進入IT企業必讀的324個Java面試題