官术网_书友最值得收藏!

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

主站蜘蛛池模板: 辽宁省| 科技| 江永县| 高青县| 巫溪县| 蒲城县| 凤山市| 吕梁市| 三原县| 平安县| 乌鲁木齐市| 漠河县| 依兰县| 四会市| 庆云县| 繁峙县| 阿克苏市| 长顺县| 广州市| 东阳市| 临海市| 兴海县| 云安县| 柳河县| 尉犁县| 十堰市| 平顺县| 南郑县| 萍乡市| 六枝特区| 密山市| 沈丘县| 江城| 宁远县| 巴林右旗| 横峰县| 会宁县| 自治县| 长治县| 肇源县| 大安市|