Solon v2.7.5

四、分布式 Api Gateway 开发预览

</> markdown

建议使用专业的分布式网关产品,比如:

  • 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();
        }
    }
}