Solon2 接口开发: 分布式 Api Gateway 开发预览
建议使用专业的分布式网关产品,比如:
- nginx
- apisix [推荐]
- k8s ingress controller
- 等...
对 Solon 来讲,只有 Gateway:它调用本地接口时,则为本地网关;调用远程接口时,则为分布式网关。
1、一个简单的分布式接口网关效果预览
基于上一节的 ApiGateway3x,微做调整:将注册的处理,由本地改为远程调用。主要原理演示:
- 拦截或过滤
- 路由
- 转发
@Mapping("/sev/**")
@Component
public class SevGateway extends ApiGatewayBase {
@Override
protected void register() {
filter(new BreakerFilter()); //融断
before(new StartHandler()); //开始计时
before(new ParamsParseHandler()); //参数解析
before(new ParamsSignCheckHandler(new Md5Encoder())); //参数签名较验
before(new ParamsRebuildHandler(new AesDecoder())); //参数重构
after(new OutputBuildHandler(new AesEncoder())); //输出构建
after(new OutputSignHandler(new Md5Encoder())); //输出签名
after(new OutputHandler()); //输出
after(new EndBeforeLogHandler()); //日志
after(new EndHandler("sev")); //结束计时
//添加一个处理类(带 @Mapping 的函数会注册进来)
add(Nav.class);
}
public static class Nav {
//没有加印射值时,将做为默认处理 //当只有默认处理时,将接收所有请求
@Mapping
public Object def(Context ctx) throws Throwable {
//检测请求,并尝试获取二级接口服务名
String sevName = ctx.pathMap("/sev/{name}/**").get("name");
if (sevName == null) {
throw ApiCodes.CODE_4001011;
}
//转发请求(分布式的特点:转发到别处去)//使用服务名转发,即是用“负载均衡”了
String rstJson = HttpUtils.http(sevName, ctx.path()).data(ctx.paramMap()).post();
//返回 json //如有需求,也可先转换为对象
return rstJson; //return ONode.load(rstJson).toData();
}
}
}