motan 提供官方的 spi 扩展方法。 点击查看
方式如下:
1、实现自定义mock协议类,继承 AbstractMockRpcProtocol,实现 processRequest 方法(自定义 mock 逻辑)。
2、添加spi声明 @SpiMeta(name = "your_mock_protocol") ,在 META-INF/services/com.weibo.api.motan.rpc.Protocol 文件中添加 mock 协议类的类全名。
3、配置 motan:protocol 为 SpiMeta 中声明的名字,即
name=your_mock_protocol,如果在 client 端 mock,就在
basicReferer 或 Referer 中设置对应 protocl;如果在 server
端 mock,则在 export 中配置 ${mock协议的id}:port
扩展方式
扩展点
- Filter 发送/接收请求过程中增加切面逻辑,默认提供日志统计等功能
- HAStrategy 扩展可用性策略,默认提供快速失败等策略
- LoadBalance 扩展负载均衡策略,默认提供轮询等策略
- Serialization 扩展序列化方式,默认使用 Hession 序列化
- Protocol 扩展通讯协议,默认使用 Motan 自定义协议
- Registry 扩展服务发现机制,默认支持 Zookeeper、Consul 等服务发现机制
- Transport 扩展通讯框架,默认使用 Netty 框架
编写一个 Motan 扩展
- 实现 SPI 扩展点接口
- 实现类增加注解
@Spi(scope = Scope.SINGLETON) // 扩展加载形式,单例或多例
@SpiMeta(name = "motan") // name 表示扩展点的名称,根据name加载对应扩展
@Activation(sequence = 100) // 同类型扩展生效顺序,部分扩展点支持。非必填
实现
这里使用 Filter 过滤器扩展点,来现在对 Motan 接口登录授权。 其他的工作就简单了,大致代码如下:
@SpiMeta(name = "baseFilter")
@Activation(sequence = 99)
public class BaseFilter implements Filter {
@Override
public Response filter(Caller<?> caller, Request request) {
Object[] args = request.getArguments();
ApplicationContext applicationContext = 取出全局 Spring Context 对象
ITokenService tokenService = (ITokenService) applicationContext.getBean("tokenServiceHandler");
// 认证逻辑
if (tokenService.isAllow(String.valueOf(args[0]))) {
throw new RuntimeException("RPC manage token expired.\r\nRequest token: " + args[0]); // throw exception to client
}
Response response = caller.call(request);
return response;
}
}
然后,添加该扩展至 Motan。在 resources
下新建路径及文件 META-INF.services/com.weibo.api.motan.filter.Filter
,并往中添加内容
com.ixiaozhi.motan.BaseFilter
至此,所有的工作已经完成。