Este documento destina-se a sistemas que integraram a Service Provider Interface (SPI) do gateway, como sistemas de negócios que expõem serviços mpaaschannel ou API Dubbo. Este documento não se aplica a sistemas de negócios que utilizam APIs HTTP.

Importar pacotes do gateway
No arquivo pom.xml principal do seu projeto, importe os seguintes pacotes. Caso seu projeto já possua essas dependências, ignore esta etapa.
É obrigatório importar todas as dependências básicas.
Selecione a dependência Dubbo ou TR conforme o tipo de API que você precisa integrar.
Dependências básicas
<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>
Dependências 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>
<dependency>
<groupId>com.alipay.gateway</groupId>
<artifactId>mobilegw-unify-spi-dubbo</artifactId>
<version>1.0.5.20201010</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>com.alipay.gateway</groupId>
<artifactId>mobilegw-unify-spi-hrpc</artifactId>
<version>1.0.5.20201010</version>
</dependency>
<dependency>
<groupId>com.alipay.gateway</groupId>
<artifactId>mobilegw-unify-registry</artifactId>
<version>1.0.5.20201010</version>
</dependency>
<dependency>
<groupId>hessian</groupId>
<artifactId>hessian</artifactId>
<version>3.3.6</version>
</dependency>
<dependency>
<groupId>com.alipay.gateway</groupId>
<artifactId>mobilegw-unify-spi-sofa</artifactId>
<version>1.0.5.20201010</version>
</dependency>
Definir e implementar a interface de serviço
Defina a interface de serviço, como com.alipay.xxxx.MockRpc, de acordo com seus requisitos. Em seguida, forneça uma implementação para a interface, como com.alipay.xxxx.MockRpcImpl.
Nas definições de método, defina os parâmetros de entrada como Value Objects (VOs). Essa prática permite adicionar parâmetros ao VO posteriormente sem alterar a assinatura do método.
Para mais informações sobre as especificações de definição de interfaces de serviço, consulte Especificações de definição de interface de negócios.
Definir o operationType
Adicione a anotação @OperationType ao método na interface de serviço para definir o nome do serviço publicado. A anotação @OperationType possui três membros:
value: O identificador exclusivo para o serviço RPC. O formato éorganization.product_domain.product.sub_product.operation.name: O nome da interface.desc: Uma descrição da interface.
O
valuedeve ser globalmente exclusivo dentro do gateway. Para evitar conflitos com outros serviços, defina esse valor com alto nível de detalhe. Um conflito de nomenclatura pode impedir o registro do seu serviço.Para facilitar a manutenção, preencha todos os três campos da anotação
@OperationType.
Exemplo:
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
}
Em seguida, utilize o pacote SPI fornecido pelo gateway para registrar o serviço de API definido no registry especificado.
Registrar um serviço de API MPC
O registro de um serviço de API MPC requer os seguintes parâmetros:
registryUrl: O endereço do registry. O endereço para o registry compartilhado de tecnologia financeira émpcpub.mpaas.cn-hangzhou.aliyuncs.com.appName: O nome da sua aplicação. Deve ser igual ao nome do grupo de API.workspaceId: O ID do workspace do ambiente onde a aplicação está localizada.projectName: O nome do projeto do tenant ao qual a aplicação pertence. Deve ser igual ao Project Name no grupo de API.privateKeyPath: O classpath para a chave privada RSA. Esta chave é usada para verificar a conexão com o mpaaschannel. Recomendamos colocá-la em/META-INF/config/rsa-mpc-pri-key-{env}.der, onde{env}representa diferentes ambientes, como dev, sit ou prod.
Configure a chave pública
No console do ambiente correspondente, escolha Code Management > Interface Keys > Configure no painel de navegação à esquerda. Configure a chave pública RSA correspondente à sua chave privada.
Os comandos abaixo mostram como gerar um par de chaves RSA. Configure a chave pública no console. Configure o arquivo da chave privada no ${privateKeyPath} da sua aplicação backend:
* 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:
*
* ## The generated private key, to be configured in the backend application
* $ openssl base64 -in private_key.der -out private_key_base64.der
*
* ## The generated public key, to be configured in Interface Keys in the console
* $ openssl base64 -in public_key.der -out public_key_base64.der
*
* ### remember to clear the whitespace chars and line breaks before submit!!!
Método Spring
-
No arquivo de configuração spring do bundle correspondente, declare o bean Spring para o serviço definido.
<bean id="mockRpc" class="com.alipay.gateway.spi.mpc.test.MockRpcImpl"/> -
No arquivo de configuração spring do bundle correspondente, declare o bean starter que expõe o serviço.
A interface
MpcServiceStarterregistra todos os beans que possuem a anotaçãoOperationTypeno registry especificado usando o protocolo 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>
Método Spring Boot
O método Spring Boot é essencialmente igual ao método Spring. A única diferença é o uso de anotações para registro em vez de um arquivo de configuração XML.
-
Use uma anotação para registrar o serviço definido como um bean:
@Service public class MockRpcImpl implements MockRpc{ } -
Use uma anotação para definir o starter que expõe o serviço:
@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; } }
Configure logs MPC
Para facilitar a solução de problemas, configure os logs relacionados ao MPC. O exemplo abaixo mostra uma configuração log4j:
<!-- [MPC Logger] tenant link, records connection establishment and settings information -->
<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] records data related to a stream (including a pair of 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 log -->
<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 log -->
<logger name="STREAM-DATA-DIGEST" additivity="false">
<level value="INFO" />
<appender-ref ref="MPC-STREAM-DATA-APPENDER" />
<appender-ref ref="ERROR-APPENDER" />
</logger>
Registrar um serviço de API Dubbo
O registro de um serviço de API Dubbo requer os seguintes parâmetros:
registryUrl: O endereço do registry.appName: O nome da sua aplicação. Deve ser igual ao nome do grupo de API.
Método Spring
-
No arquivo de configuração spring do bundle correspondente, declare o bean Spring para o serviço definido:
<bean id="mockRpc" class="com.alipay.gateway.spi.mpc.test.MockRpcImpl"/> -
No arquivo de configuração spring do bundle correspondente, declare o bean starter
DubboServiceStarterque expõe o serviço. Esta interface registra todos os beans que possuem a anotaçãoOperationTypeno registry especificado usando o protocolo Dubbo.<bean id="dubboServiceStarter" class="com.alipay.gateway.spi.dubbo.DubboServiceStarter"> <property name="registryUrl" value="${registy_url}"/> <property name="appName" value="${app_name}"/> </bean>
Método Spring Boot
O método Spring Boot é essencialmente igual ao método Spring. A única diferença é o uso de anotações para registro em vez de um arquivo de configuração XML.
-
Use uma anotação para registrar o serviço definido como um bean:
@Service public class MockRpcImpl implements MockRpc{ } -
Use uma anotação para definir o starter que expõe o serviço:
@Configuration public class DubboDemo { @Bean(name="dubboServiceStarter") public DubboServiceStarter dubboServiceStarter(){ DubboServiceStarter dubboServiceStarter = new DubboServiceStarter(); dubboServiceStarter.setAppName("${app_name}"); dubboServiceStarter.setRegistryUrl("${registy_url}"); return dubboServiceStarter; } }
Registrar um serviço de API HRPC
O registro de um serviço de API HRPC requer os seguintes parâmetros:
registryUrl: O endereço do registry. Este parâmetro é obrigatório.appName: O nome da sua aplicação. Este parâmetro é obrigatório.serverPort: A porta de escuta para o serviço HRPC. Este parâmetro é opcional. O valor padrão é 7079.
Método Spring
-
No arquivo de configuração spring do bundle correspondente, declare o bean Spring para o serviço definido:
<bean id="mockRpc" class="com.alipay.gateway.spi.mpc.test.MockRpcImpl"/> -
No arquivo de configuração spring do bundle correspondente, declare o bean starter que expõe o serviço.
A interface
HRpcServiceStarterregistra todos os beans que possuem a anotação@OperationTypeno registry especificado usando o protocolo HRPC.<bean id="hrpcServiceStarter" class="com.alipay.gateway.spi.hrpc.HRpcServiceStarter"> <property name="registryUrl" value="${registy_url}"/> <property name="appName" value="${app_name}"/> <property name="serverPort" value="${optional_serverPort}"/> </bean>
Método Spring Boot
O método Spring Boot é essencialmente igual ao método Spring. A única diferença é o uso de anotações para registro em vez de um arquivo de configuração XML.
-
Use uma anotação para registrar o serviço definido como um bean:
@Service public class MockRpcImpl implements MockRpc{ } -
Use uma anotação para definir o starter que expõe o serviço:
@Configuration public class HRpcDemo { @Bean(name="hrpcServiceStarter") public HRpcServiceStarter hrpcServiceStarter(){ HRpcServiceStarter hRpcServiceStarter = new HRpcServiceStarter(); hRpcServiceStarter.setAppName("${app_name}"); hRpcServiceStarter.setRegistryUrl("${registy_url}"); hRpcServiceStarter.setServerPort("${optional_serverPort}"); return hRpcServiceStarter; } }NotaO HRPC utiliza o ZooKeeper (ZK) como registry. É possível especifique um ou mais endereços, separados por vírgulas. Por exemplo, "11.163.193.240:2181" ou "11.163.193.240:2181,11.163.193.230:2181".
Registrar um serviço de API TR
O registro de um serviço de API TR requer o parâmetro appName. Este parâmetro corresponde ao nome da sua aplicação e é obrigatório.
Método Spring
-
No arquivo de configuração spring do bundle correspondente, declare o bean Spring para o serviço definido:
<bean id="mockRpc" class="com.alipay.gateway.spi.mpc.test.MockRpcImpl"/> -
No arquivo de configuração spring do bundle correspondente, declare o bean starter que expõe o serviço.
A interface
SofaServiceStarterexpõe todos os beans que possuem a anotação@OperationTypeao gateway para chamadas usando o protocolo TR.<bean id="SofaServiceStarter" class="com.alipay.gateway.spi.sofa.SofaServiceStarter"> <property name="appName" value="${app_name}"/> </bean>
Método Spring Boot
O método Spring Boot é essencialmente igual ao método Spring. A única diferença é o uso de anotações para registro em vez de um arquivo de configuração XML.
-
Use uma anotação para registrar o serviço definido como um bean:
@Service public class MockRpcImpl implements MockRpc{ } -
Use uma anotação para definir o starter que expõe o serviço:
@Configuration public class TRDemo { @Bean(name="sofaServiceStarter") public SofaServiceStarter sofaServiceStarter(){ SofaServiceStarter sofaServiceStarter = new SofaServiceStarter(); sofaServiceStarter.setAppName("${app_name}"); return sofaServiceStarter; } }
Resultados
Após concluir estas etapas, execute operações no gateway para expor o serviço de API aos clientes. Para mais informações, consulte Registrar API.