全部產品
Search
文件中心

Mobile Platform as a Service:服務定義與開發

更新時間:Jul 13, 2024

此文檔僅針對整合了網關 SPI 的系統,如對外暴露 mpaaschannel 或 Dubbo 類型 API 服務的業務系統。對於使用 HTTP API 的業務系統無需查看此文檔。

41

引入網關二方包

在專案的主 pom.xml 檔案中引入如下二方包(若原工程已經有依賴,請忽略)。

基礎依賴都需要引用,請根據實際需要整合的 API 類型。

基礎依賴

<dependency>
    <groupId>com.alipay.gateway</groupId>
    <artifactId>mobilegw-unify-spi-adapter</artifactId>
    <version>1.0.5.20201010</version>
</dependency>
<dependency>
    <groupId>com.alipay.gateway</groupId>
    <artifactId>mobilegw-unify-log</artifactId>
    <version>1.0.5.20201010</version>
</dependency>
<dependency>
    <groupId>com.alipay.hybirdpb</groupId>
    <artifactId>classparser</artifactId>
    <version>1.2.2</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.72_noneautotype</version>
</dependency>
<dependency>
    <groupId>com.alipay.gateway</groupId>
    <artifactId>mobilegw-unify-common</artifactId>
    <version>1.0.5.20201010</version>
</dependency>

MPC 依賴

<dependency>
    <groupId>com.alipay.gateway</groupId>
    <artifactId>mobilegw-unify-spi-mpc</artifactId>
    <version>1.0.5.20201010</version>
</dependency>
<dependency>
    <groupId>com.alipay.mpaaschannel</groupId>
    <artifactId>common</artifactId>
    <version>2.4.2019040801</version>
</dependency>
<dependency>
    <groupId>com.alipay.mpaaschannel</groupId>
    <artifactId>tenant-client</artifactId>
    <version>2.4.2019040801</version>
</dependency>

定義服務介面並實現

按照業務需求,定義服務介面:com.alipay.xxxx.MockRpc; 並提供該介面的實現 com.alipay.xxxx.MockRpcImpl

說明

  • 方法定義中的入參盡量定義為 VO,後期添加參數,就可以在 VO 中添加參數,而不改變方法的聲明格式。

  • 服務介面定義的相關規範,請參見 業務介面定義規範

定義 operationType

在服務介面的方法上添加 @OperationType 註解,定義發布服務的介面名稱。@OperationType 有三個參數成員:

  • value:RPC 服務的唯一標識,定義規則為 組織.產品域.產品.子產品.操作

  • name:介面中文名稱。

  • desc:介面描述。

說明

  • value 在網關為全域唯一,盡量定義詳細,否則可能會和其他業務方的 value 值一樣,導致無法註冊服務。

  • 為便於維護,請務必填寫完整 @OperationType 的三個欄位。

範例:

public interface MockRpc {

    @OperationType("com.alipay.mock")
    Resp mock(Req s);

    @OperationType("com.alipay.mock2")
    String mock2(String s);
}

public static class Resp {
    private String msg;
    private int    code;

    // ignore getter & setter
}

public static class Req {
    private String name;
    private int age;

    // ignore getter & setter
}

然後,通過網關提供的 SPI 包,將定義好的 API 服務註冊到指定的註冊中心。

註冊 MPC API 服務

註冊 MPC API 服務需要如下參數:

  • registryUrl: 該值為註冊中心的地址,共用式金融科技註冊中心地址為 mpcpub.mpaas.cn-hangzhou.aliyuncs.com

  • appName:該值為業務方的應用程式名稱,與 API 分組名相同。

  • workspaceId:應用所處環境的 workspaceId。

  • projectName:應用所屬租戶的 projectName,與 API 分組裡的 Project Name 相同。

  • privateKeyPath:存放 RSA 私密金鑰的 ClassPath,與 mpaaschannel 建立串連時用於校正合法性。 建議放置在 /META-INF/config/rsa-mpc-pri-key-{env}.der 中,{env} 為不同的環境,如 dev、sit、prod 等。

配置公開金鑰

前往對應環境的控制台,從左側導覽列點擊 代碼管理 > 介面密鑰 > 配置,配置私密金鑰對應的 RSA 公開金鑰。

產生 RSA 公私密金鑰的方法如下,其中公開金鑰在控制台上配置,私密金鑰檔案在後端應用的 ${privateKeyPath} 中配置:

* the way to generate key pair: 
* ### Generate a 2048-bit RSA private key 
* 
* $ openssl genrsa -out private_key.pem 2048 
* 
* ### Convert private Key to PKCS#8 format (so Java can read it) 
* 
* $ openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt 
* 
* ### Output public key portion in DER format (so Java can read it) 
* 
* $ openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der 
* 
* ### change to base64:
* 
* ## 產生的私密金鑰,後端應用中配置
* $ openssl base64 -in private_key.der -out private_key_base64.der
* 
* ## 產生的公開金鑰,在控制台 介面密鑰 中配置
* $ openssl base64 -in public_key.der -out public_key_base64.der
* 
* ### remember to clear the whitespace chars and line breaks before submit!!!

spring 方式

  1. 在對應 bundle 的 spring 設定檔中,聲明定義好的服務的 spring bean。

     <bean id="mockRpc" class="com.alipay.gateway.spi.mpc.test.MockRpcImpl"/>
  2. 在對應 bundle 的 spring 設定檔中,聲明暴露服務的 starter bean。

    介面 MpcServiceStarter 會將所有帶有 OperationType 的 bean 通過 mpaaschannel 協議註冊到指定的註冊中心。

    <bean id="mpcServiceStarter" class="com.alipay.gateway.spi.mpc.MpcServiceStarter">
     <property name="registryUrl" value="${registy_url}"/>
     <property name="appName" value="${app_name}"/>
     <property name="workspaceId" value="${workspace_id}"/>
     <property name="projectName" value="${project_name}"/>
     <property name="privateKeyPath" value="${privatekey_path}"/>
    </bean>

spring-boot 方式

spring-boot 和 spring 本質上一樣,只是註冊的方式改為註解的方式,不用配置 xml 檔案。

  1. 通過註解的方式,將定義的服務註冊成 bean:

    @Service
    public class MockRpcImpl implements MockRpc{
    }
  2. 以註解的方式,定義暴露服務的 starter:

    @Configuration
    public class MpaaschannelDemo {
     @Bean(name="mpcServiceStarter")
     public MpcServiceStarter mpcServiceStarter(){
         MpcServiceStarter mpcServiceStarter = new MpcServiceStarter();
         mpcServiceStarter.setWorkspaceId("${workspace_id}");
         mpcServiceStarter.setAppName("${app_name}");
         mpcServiceStarter.setRegistryUrl("${registy_url}");
         mpcServiceStarter.setProjectName("${project_name}");
         mpcServiceStarter.setPrivateKeyPath("${privatekey_path}");
         return mpcServiceStarter;
     }
    }

配置 MPC 日誌

為了便於排查問題,可酌情配置 MPC 相關日誌,下面以 log4j 配置為例:

<!-- [MPC Logger] tenant link,記錄建聯,settings 資訊 -->
    <appender name="MPC-TENANT-LINK-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${log_root}/mpaaschannel/tenant-link.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="${file.encoding}"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{remoteAddr}][%X{uniqueId}] %-5p %c{2} - %m%n"/>
        </layout>
    </appender>

    <!-- [MPC Logger] 記錄一個流相關的資料 (包括一對tenant stream <-> component stream) -->
    <appender name="MPC-STREAM-DATA-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${log_root}/mpaaschannel/stream-data.log"/>
        <param name="append" value="true"/>
        <param name="encoding" value="${file.encoding}"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{remoteAddr}][%X{uniqueId}] %-5p %c{2} - %m%n"/>
        </layout>
    </appender>


<!-- [MPC Logger] tenant 日誌 -->
    <logger name="TENANT-LINK-DIGEST" additivity="false">
        <level value="INFO" />
        <appender-ref ref="MPC-TENANT-LINK-APPENDER" />
        <appender-ref ref="ERROR-APPENDER" />
    </logger>

    <!-- [MPC Logger] component 日誌 -->
    <logger name="STREAM-DATA-DIGEST" additivity="false">
        <level value="INFO" />
        <appender-ref ref="MPC-STREAM-DATA-APPENDER" />
        <appender-ref ref="ERROR-APPENDER" />
    </logger>

結果

完成上述步驟後,就可以通過在網關進行一系列的操作,將定義的 API 服務對用戶端進行暴露。具體請參見 註冊 API