进阶指南

本文对移动网关 RPC 拦截器、RPC 请求头、RPC Cookie、RPC 签名的设置进行说明。

重要

在 10.2.3 基线中新增设置 RPC 签名内容。

RPC 拦截

在业务开发中,如果在某些情况下需要控制客户端的网络请求(例如拦截网络请求,禁止访问某些接口,或者限流),可以通过 RPC 拦截器实现。

创建全局拦截器

public class CommonInterceptor implements RpcInterceptor {

    /**
    * 前置拦截:发送 RPC 之前回调。
    * @param proxy  RPC 代理对象。
    * @param clazz  rpcface 模型类,通过 clazz 参数可以判断当前调用的是哪个 RPC 模型类
    * @param method 当前 RPC 调用的方法。
    * @throws RpcException
    * @return true 表示继续向下执行,false 表示中断当前请求,抛出 RpcException,错误码:9。
    */
    @Override
    public boolean preHandle(Object proxy, 
                                ThreadLocal<Object> retValue, 
                                byte[] retRawValue, 
                                Class<?> clazz,
                                Method method, 
                                Object[] args, 
                                Annotation annotation, 
                                ThreadLocal<Map<String, Object>> extParams)
                                throws RpcException {
            //Do something... 
            return true;
     }

    /**后置拦截:发起 RPC 成功之后回调。
    *@return true 表示继续向下执行,false 表示中断当前请求,抛出 RpcException,错误码:9。
    */
    @Override
   public boolean postHandle(Object proxy, 
                            ThreadLocal<Object> retValue, 
                            byte[] retRawValue, 
                            Class<?> clazz,
                            Method method, 
                            Object[] args, 
                            Annotation annotation) throws RpcException {
          //Do something...
          return true;
   }

   /**
   * 异常拦截:发起 RPC 失败之后回调。
   * @param exception 表示当前 RPC 出错异常。
   * @return true 表示将当前异常继续向上抛出,false 表示不要抛出异常,正常返回,没有特殊需求,切勿返回 false。
   */
   @Override
    public boolean exceptionHandle(Object proxy, 
                                ThreadLocal<Object> retValue, 
                                byte[] retRawValue, 
                                Class<?> clazz,
                                Method method, 
                                Object[] args, 
                                RpcException exception,
                                Annotation annotation) throws RpcException {

        //Do something...
        return true;
    }
}

注册拦截器

在框架启动过程中,初始化 RpcService 时,将拦截器注册上去,例如:

public class MockLauncherApplicationAgent extends LauncherApplicationAgent {

    public MockLauncherApplicationAgent(Application context, Object bundleContext) {
        super(context, bundleContext);
    }

    @Override
    public void preInit() {
        super.preInit();
    }

    @Override
    public void postInit() {
        super.postInit();
        RpcService rpcService = getMicroApplicationContext().findServiceByInterface(RpcService.class.getName());
        rpcService.addRpcInterceptor(OperationType.class, new CommonInterceptor());
    }
}

设置 RPC 请求头

MainActivity 类的 initRpcConfig 方法中,设置 RPC 请求头。具体参考 代码示例

private void initRpcConfig(RpcService rpcService) {
        //设置请求头
        Map<String, String> headerMap = new HashMap<>();
        headerMap.put("key1", "val1");
        headerMap.put("key2", "val2");
        rpcInvokeContext.setRequestHeaders(headerMap);
    }

设置 RPC cookie

设置 cookie

通过调用以下接口来进行 RPC cookie 设置。其中,Your domain 的规则是网关 URL 的第一个 . 以及其后第一个 / 之前的所有内容。例如,网关 URL 为 http://test-cn-hangzhou-mgs-gw.cloud.alipay.com/mgw.htm,那么 Your domain 则是 .cloud.alipay.com

GwCookieCacheHelper.setCookies(Your domain, cookiesMap);

移除 cookie

通过调用以下接口即可移除设置的 cookie。

GwCookieCacheHelper.removeAllCookie();

设置 SM3 验签

在 RPC 初始化之后,可以通过MPRpc 类的 setGlobalSignType 方法,来指定全局验签方式为 sm3 类型。

MPRpc.setGlobalSignType(TransportConstants.SIGN_TYPE_SM3);

设置 RPC 签名

接口

class TransportConstants {
    public static final int SIGN_TYPE_DEFAULT = 0; // 默认签名方式,即 md5
    public static final int SIGN_TYPE_MD5 = 1; // md5
    public static final int SIGN_TYPE_HMACSHA256 = 3; // hmacsha256
    public static final int SIGN_TYPE_SHA256 = 4; // sha256
    public static final int SIGN_TYPE_SM3 = 5; // sm3
}

// 全局 rpc 签名算法设置
MPRpc.setGlobalSignType(int signType);

示例

设置全局 RPC signType,且对所有 RPC 生效。

// 设置签名方式为SM3
MPRpc.setGlobalSignType(TransportConstants.SIGN_TYPE_SM3);