关于spring cloud gateway编程实现路由转发

xxfaxy
  • 1.4k

当一个请求访问的时候,我判断域名和路径,比如说

http://A.test.com/user/reg

其中A是变化的,比如A=698d51a19d8a121c,那么将路由转发到某个服务的A/user/reg,由于A是随时可能增加的,所以需要编程(正则满足不了,因为涉及域名的cname)完成转发,而不是固定的写配置。

http://698d51a19d8a121c.test.com/user/reg转发到698d51a19d8a121c/user/reg

http://a6707efd1f2968eb.test.com/user/reg转发到a6707efd1f2968eb/user/reg

用户可以将自己的域名cname指向A.test.com,其中dns解析部分已知道怎么做。

回复
阅读 243
1 个回答

两种方案。

一种是动态加载配置文件,针对每个 host 单独配置一个转发。这个实现比较简单,监听文件变化然后读 yaml 还是啥的都行,缺点就是修改配置比较麻烦。

另一种是自定义过滤器,别用内置的那些了。大概像这样:


class CustomerFilter implements GatewayFilter, Ordered {
    @Override
    public int getOrder() {
        return -1; // 过滤器顺序,按你自己业务需要调整
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String redirectUrl = null;
        String hostname = exchange.getRequest().getHeaders().getHost().toString();

        if (hostname.endsWith(".test.com")) {
            // 代码仅作示例参考,请根据自己实际业务需要调整
            redirectUrl = hostname.split("\\.")[0];
        } else {
            redirectUrl = hostname;
        }

        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, new URI(redirectUrl));
        return chain.filter(exchange);
    }
}

最后别忘了注册这个过滤器。

https://docs.spring.io/spring...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏