Solon Cloud Gateway 补充

说明

在「使用 Solon Cloud Gateway 替换Spring Cloud Gateway 」的文章中,有评论说不知道响应式。当时看的是

Solon Cloud Gateway 使用响应式接口,由 Solon-Rx 来实现,是基于 reactive-streams 封装的 RxJava 极简版。目前仅一个接口 Completable,所以当时以为实现了 ExFilter 返回 Completable 就是响应式了。后续 Solon Cloud Gateway 继续更新文档之后才发现,虽然网关是响应式了,但如果逻辑涉及 IO 或者比较慢的操作,需要在 ExFilter 中开启异步接口,这样才是真正的异步,从而避免对网关的事件循环器造成影响,减少对响应式的性能的伤害。

为了对接同步 IO 接口,Solon 3.2.1 提供了 CloudGatewayFilterSync,用于简化异步调用的编写。

基础版

java 复制代码
//同步过滤器(会自动转异步)
@FunctionalInterfacepublic interface ExFilterSync extends ExFilter {
    @Overridedefault Completable doFilter(ExContext ctx, ExFilterChain chain) {
        return Completable.create(emitter -> {
            //暂停接收流
            ctx.pause();

            //开始异步
            RunUtil.async(() -> {
                try {
                    //开始同步处理boolean isContinue = doFilterSync(ctx);

                    if (isContinue) {
                        //继续
                        chain.doFilter(ctx).subscribe(emitter);
                    } else {
                        //结束
                        emitter.onComplete();
                    }
                } catch (Throwable ex) {
                    emitter.onError(ex);
                }
            });
        });
    }

    /**
     * 执行过滤同步处理(一般用于同步 io)
     *
     * @param ctx 上下文
     * @return 是否继续
     */boolean doFilterSync(ExContext ctx) throws Throwable;
}

这个 doFilter 的过程中需要自己先处理 ctx.pause,然后开启异步,并在开启的过程中判断是否异常的提交等等,需要写好这个 ExFitler 的扩展还是有点不容易的。

于是作者又贴心的提供了CloudGatewayFilterSync

简化版

java 复制代码
@Component(index = -9)
public class AuthFilterSync implements CloudGatewayFilterSync {
    @Inject
    AuthJdbcService authService;

    @Overridepublic boolean doFilterSync(ExContext ctx) throws Throwable {
        String userId = ctx.rawQueryParam("userId");
        //检测路径权限
        return authService.check(userId, ctx.rawPath());
    }
}

在简化的版本中,只需要在 doFilterSync 中编写具体的逻辑,而不要关心流的暂停和开启异步等。如果已经处理完毕,不需要继续执行返回 ture,否则返回 false。

参考

https://solon.noear.org/article/813

https://solon.noear.org/article/1005

相关推荐
研究司马懿3 天前
【云原生】Gateway API介绍
云原生·gateway
研究司马懿3 天前
【云原生】Gateway API路由、重定向、修饰符等关键操作
云原生·gateway
研究司马懿3 天前
【云原生】初识Gateway API
云原生·gateway
七夜zippoe4 天前
API网关设计模式实战 Spring Cloud Gateway路由过滤限流深度解析
java·设计模式·gateway·路由·api网关
汪碧康4 天前
一文讲解kubernetes的gateway Api的功能、架构、部署、管理及使用
云原生·容器·架构·kubernetes·gateway·kubelet·xkube
大佐不会说日语~4 天前
Docker Compose 部署 Spring Boot 应用 502 Bad Gateway 问题排查与解决
spring boot·docker·gateway·maven·故障排查
Dontla6 天前
Kubernetes流量管理双雄:Ingress与Gateway API解析(Nginx与Ingress与Gateway API的关系)
nginx·kubernetes·gateway
JavaLearnerZGQ6 天前
Gateway网关将登录用户信息传递给下游微服务(完整实现方案)
微服务·架构·gateway
Ares-Wang7 天前
网络》》BGP Border Gateway Protocol,边界网关协议
网络·gateway
一方_self8 天前
cloudflare AI gateway实战代理任意第三方大模型服务提供商
人工智能·gateway