0x01 如下RPC通信場景:業務線向交易中台發起交易。當交易完成後,zhongtai-trans要將交易結果通知給業務線。 那麼,在程式實現上,zhongtai-trans如何通知業務線呢? 0x02 這個問題暫且不表。我們先來看跨企業通信的業務回調通知。這裡,我們以商戶對接微信支付來舉例。用戶在 ...
0x01 如下RPC通信場景:業務線向交易中台發起交易。當交易完成後,zhongtai-trans要將交易結果通知給業務線。
那麼,在程式實現上,zhongtai-trans如何通知業務線呢?
0x02 這個問題暫且不表。我們先來看跨企業通信的業務回調通知。這裡,我們以商戶對接微信支付來舉例。用戶在掃描商戶網頁上的微信支付二維碼進行支付。用戶支付完成後,騰訊會以HTTP的形式主動回調商戶API,將支付結果通知給商戶系統。
微信官網明確了支付通知的參數。商戶系統收到通知請求後,根據請求參數進行自己的邏輯處理。也就是說,騰訊作為通知請求方,定義了統一的通知參數,一視同仁,不管你是商戶A的系統,還是商戶B的系統,騰訊不會以某個商戶的意志而改變。
0x03 回過頭來,我們繼續來看企業應用內部服務間的業務回調。舉一反三,也應按照跨企業間的業務回調通知這樣來設計。即,zhongtai-trans定義統一的TransNotifyDTO,封裝交易通知數據。各業務線服務內對接收到的TransNotifyDTO對象進行判斷處理,或轉換為自己的內部對象來進行邏輯處理。
話雖如此,在實現方面,這會遇到一個問題。我們使用dubbo作為RPC框架。dubbo規定了provider服務和consumer服務都依賴由provider提供的rpcapi。按照上面的設計,由於zhongtai-trans要調用各業務線的rpcapi,而TransNotifyDTO由zhongtai-trans-rpcapi定義,這就出現各業務線的rpcapi要依賴zhongtai-trans-rpcapi。不得不說,rpcapi之間存在jar包依賴是一個敗筆。下圖直觀的看出來(實線代表jar包依賴)。
那麼,如何搞定這個敗筆呢?一個為所有rpcapi所共用的基礎module發揮作用了,這裡我命名為base-rpcapistyle。base-rpcapi的作用:定義rpcapi的通用部分,如rpcapi的返回值模型Result<T>,共同的枚舉,共同的dto對象。本案中的TransNotifyDTO就要放在base-rpcapistyle里。
0x04 如此清新,到這裡,是時候可以貼出來示意代碼了。
1)產品線rpcapi,以BizA為例
/**
* 接收來自zhongtai-trans的回調通知
* @param transNotifyDTO
* @return
*/
Result<Void> notifyPayResult(TransNotifyDTO transNotifyDTO);
2)zhongtai-trans里通知業務線代碼
/**
* 交易完成,回調通知業務線
* @param transOrder
*/
public void notifyPayResultToBiz(TransOrder transOrder) {
Assert.isTrue(TransPayStatusEnum.isFinal(transOrder.getPayStatus()));
TransNotifyDTO transNotifyDTO = new TransNotifyDTO();
transNotifyDTO.setOrderNo(transOrder.getOrderNo())
.setPayStatus(transOrder.getPayStatus())
.setPayTime(transOrder.getPayTime())
.setTransAmount(transOrder.getTransAmount())
.setStatusDesc(transOrder.getTransMsg());
Result<Void> result = null;
switch (transOrder.getBiz()) {
case BizA:
result = bizAApi.notifyPayResult(transNotifyDTO);
break;
case BizB:
result = bizBApi.notifyPayResult(transNotifyDTO);
break;
case BizC:
result = bizCApi.notifyPayResult(transNotifyDTO);
break;
}
log.info("通知業務線完成,響應結果={}", result);
}
【EOF】
秉燭兩夜,絞盡腦汁生產完畢...本頁設計文稿物料:https://www.processon.com/diagraming/618
當看到一些不好的代碼時,會發現我還算優秀;當看到優秀的代碼時,也才意識到持續學習的重要!--buguge
本文來自博客園,轉載請註明原文鏈接:https://www.cnblogs.com/buguge/p/17595281.html