本文對移動網關 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);