前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自研网关:特殊URL功能的开发

自研网关:特殊URL功能的开发

作者头像
星痕
发布于 2020-10-09 08:03:26
发布于 2020-10-09 08:03:26
41400
代码可运行
举报
文章被收录于专栏:JAVA后端开发JAVA后端开发
运行总次数:0
代码可运行

自研网关系统已开源,求star 项目地址:

现在网关已经具备转发的功能,但有些场景还是不满足

  1. 如果业务系统临时上了某个功能,出问题,需要不重启限制使用,如何处理。
  2. 如果业务系统正在升级,不想让用户继续访问,并提示友好,如何处理
  3. 如果业务系统想将某个页面或某个功能转发到某个地址,如何处理。 为了满足上述场景,开发了一个特殊URL的功能,主要针对相关URL做临时的处理.

特殊URL处理

特殊URL编辑

接口测试 主要代码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
public class GatewaySpecUrlWebFilter implements WebFilter {


    @Autowired
    private IProjectSpecUrlService projectSpecUrlService;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        String projectCode = RequestHelper.getRequestProjectCode(exchange.getRequest());
        Assert.hasText(projectCode, "工程编码不存在");

        //特殊URL处理;
        if (this.handleSpecUrls(exchange, projectCode)) {

            return chain.filter(exchange.mutate().request(exchange.getRequest().mutate().path("/redirect").build()).build());

        }

        return chain.filter(exchange);
    }

    @SneakyThrows
    private boolean handleSpecUrls(ServerWebExchange exchange, String projectCode) {

        List<ProjectSpecUrlDto> specUrlDtos = projectSpecUrlService.findSpecUrlListByProjectCode(projectCode);
        for (ProjectSpecUrlDto projectSpecUrlDto : specUrlDtos) {
            if (this.handleSpecUrl(projectSpecUrlDto, exchange, projectCode)) {
                return true;
            }
        }
        return false;
    }

    @SneakyThrows
    private boolean handleSpecUrl(ProjectSpecUrlDto projectSpecUrlDto, ServerWebExchange exchange, String projectCode) {
        boolean isMatch = RequestHelper.isMatchUrl(projectSpecUrlDto.getAccessUrl(), exchange.getRequest().getURI().getPath(), projectCode);
        if (isMatch) {
            //URL匹配
            if (projectSpecUrlDto.getOperation() == 0) {
                //   chain.filter(exchange.mutate().response(ServerResponse.temporaryRedirect(URI.create(projectSpecUrlDto.getRedirectUrl())).build()).request(exchange.getRequest()).build());
                //  chain.filter(exchange.mutate().request(exchange.getRequest().mutate().uri(new URI(projectSpecUrlDto.getRedirectUrl())).build()).build());
                exchange.getAttributes().put("gateway_spec_url_redirect_url",projectSpecUrlDto.getRedirectUrl());
                return true;
            } else if (projectSpecUrlDto.getOperation() == 1) {
                throw new CustomException(projectSpecUrlDto.getErrorMsg());

            } else if (projectSpecUrlDto.getOperation() == 2) {
                throw new BaseException(SystemErrorType.SPEC_URL_ERROR_ACCESS);

            }
        }
        return false;
    }

}

主要是通过过滤器对特殊的URL进行拦截,根据不同的情况来做判断,做跳转或异常抛出 具体代码大家可以去我的开源项目中看,欢迎提ISSUE及需求。 因为只有一个人,也欢迎大家参与进来.

  • 网关地址:https://gitee.com/starmark947618/starmark-gateway 下期计划: 1。权限模块兼容多模块,可以不使用网关系统,按传统的方式做权限拦截 2。业务系统的工程projectCode传参的调整,当前每次请求都传projectCode,对前端负担太重了.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自研网关:多项目的swagger聚合功能
网关一般都会有一个swagger聚合功能,方便于你测试文档接口。 但网上的例子,如https://doc.xiaominfo.com/solution/ui-front-gateway.html#%E6%96%87%E6%A1%A3%E8%81%9A%E5%90%88%E4%B8%9A%E5%8A%A1%E7%BC%96%E7%A0%81. 这些例子都能解决swagger聚合的问题,但问题是他只支持一个项目,但我网关肯定会有多个项目,这个怎么处理呢。 其实这个原理一样,但说起来也是有几个技术难点的.
星痕
2020/09/15
1.3K0
Spring Cloud Gateway 的架构和核心组件(二)
Gateway Filter Chain 是处理请求前后的过滤器,它可以在请求到达 Gateway Handler 之前或之后,对请求或响应进行一些处理。Gateway Filter Chain 的处理流程如下:
堕落飞鸟
2023/04/10
4540
Spring Cloud Gateway 读取、修改请求体(解决request body内容被截断)
微服务架构,在网关服务里拦截每个请求,进行日志信息记录与管理,发现当请求体过长时,只能获取到一部分body,查看拦截过滤器,发现Spring Cloud Gateway是基于reactor-core.jar进行请求数据的操作,获取body内容时,用到了reactor-core.jar的Flux,即一个包含0-N个DataBuffer类型元素的同步序列。
一滴水的眼泪
2020/09/24
5.1K2
Spring Cloud Gateway 读取、修改请求体(解决request body内容被截断)
spring cloud gateway跨域冲突功能的开发
gateway可以实现支持跨域功能,但如果下游也支持跨域,会出现跨域冲突。 如何解决该问题,gateway对外输出相关跨域的httpheader,只要对重复的header去掉即可。
星痕
2020/08/14
8960
Spring Cloud Gateway网关中各个过滤器的作用与介绍
随着微服务架构的兴起,API网关变得越来越重要。它是微服务体系结构中的一个关键组件,用于处理所有传入和传出的请求流量,同时还提供了一些关键的功能,如身份验证、安全性、监控、负载均衡和路由。Spring Cloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor的API网关工具,它的灵活性和强大性使得它成为了构建微服务架构的理想选择。
IT_陈寒
2023/12/13
8970
Spring Cloud Gateway网关中各个过滤器的作用与介绍
spring cloud gateway聚合swagger的方法记录
最近在使用spring cloud gateway,需要对各个微服务做一个聚合的swagger功能。 其实方法也是上网找的,不过也记录一下:
星痕
2019/07/04
3.6K0
SpringCloud GateWay通过过滤器GatewayFilter修改请求或响应内容
Spring Cloud Gateway在有些场景中需要获取request body内容进行参数校验或参数修改,我们通过在GatewayFilter中获取请求内容来获取和修改请求体,下面我们就基于ServerWebExchange来实现:
用户8236825
2023/03/27
3.1K0
spring cloud gateway 读取request body 数据
spring cloud gateway为了记录访问记录,需要记录请求体里面的内容,但是 request body是只能读取一次的,如果读取以后不封装回去,则会造成后面的服务无法读取body数据. 在网关里添加一个过滤器RequestRecordFilter类:
zcqshine
2019/03/12
9.3K2
基于WebFlux过滤器与Themleaf的登陆权限验证
原本可以的话打算用的是shrio框架进行权限管理,但是shrio框架是因为需要对HttpServletRequest进行配置相关参数,而当前使用的WebFlux并没有servlet,所以直接没法使用shrio。所以只有自己写一个基于过滤器的建议权限框架。
Diuut
2022/11/22
7090
SpringCloud Gateway中你不知道的骚操作
之前的几篇文章中,我们已经提到了如何使用SpringCloud Gateway,那几篇文章的内容已经足够做普通项目使用了,但是如果你想深入了解这个东西,或者说是看完这篇文章你用起来跟普通人就完全不是一个等级的了
Java学习录
2019/12/03
1.9K0
各个微服务认证授权的处理方法
1.通过认证授权模块进行登录 在这里我们默认登录都是可以正常获取token令牌的,也就是都是登录成功的 2.微服务网关(SpringGateway) 在该微服务中我们通过拦截器链接请求,通过该请求是排除过滤的 uri 地址(例如:登录请求/auth/login),则放行该请求,否则则进行token认证,在这里我们有2种认证方式: 2.1 网关统一认证授权(本次不介绍该模式) 该模式需要使用redis进行缓存所有的认证路径和所有路径所需要的角色权限信息,最后在网关中统一鉴权,其他微服务不进行鉴权处理。
Reset
2022/12/27
8720
聊聊spring cloud gateway的PrefixPath及StripPrefix功能
本文主要研究一下spring cloud gateway的PrefixPath及StripPrefix功能
code4it
2018/09/17
4.5K0
Springcloud Gateway:动态配置,过滤器源码思路
Spring Cloud GateWay 是 spring 官方推出的一款 基于 springframework5,Project Reactor和 spring boot2 之上开发的网关,其性能,高吞吐量,将代替zuul称为新一代的网关,用于给微服务提供 统一的api管理方式
冷环渊
2021/12/10
1.7K0
Springcloud Gateway:动态配置,过滤器源码思路
SpringCloud Alibaba实战二十九 | SpringCloud Gateway 请求响应日志
请求响应日志是日常开发调试定位问题的重要手段,在微服务中引入SpringCloud Gateway后我们希望在网关层统一进行日志的收集。
JAVA日知录
2021/04/07
3K0
SpringCloud Alibaba实战二十九 | SpringCloud Gateway 请求响应日志
SpringCloud 2.x学习笔记:15、Spring Cloud Gateway之Filter过滤器(Greenwich版本)
AddRequestHeaderGatewayFilterFactory的源码
程裕强
2019/07/02
9680
SpringCloud 2.x学习笔记:15、Spring Cloud Gateway之Filter过滤器(Greenwich版本)
Spring Cloud Gateway-使用自定义过滤器通过Hystrix实现降级处理
在微服务架构中,下游依赖出现问题如果上游调用方不做请求降级处理,下游的异常依赖没有被隔离,很有可能出现因为一两个服务或者小到一两个接口异常导致上游所有服务不可用,甚至影响整个业务线。请求降级处理目前比较主流的依然是Netfilx出品的Hystrix。Hystrix的工作原理是:
Throwable
2020/06/23
4K0
Spring Cloud Gateway 的架构和核心组件(一)
Spring Cloud Gateway 是一个基于 Spring Boot 2.x 和 Spring WebFlux 的 API 网关。它提供了统一的 API 管理入口,支持请求路由、限流、日志记录、安全控制等功能。本文将介绍 Spring Cloud Gateway 的架构和核心组件,并给出示例说明。
堕落飞鸟
2023/04/10
9140
Spring Cloud实战|整合Gateway-网关还能这么整?
这一期主要是基于前面的项目,集成gateway,通过gateway 进行请求路由。
AI码师
2022/09/19
7610
Spring Cloud实战|整合Gateway-网关还能这么整?
聊聊在springcloud gateway如何获取请求体
在我们扩展scg时,获取requestbody也是一个挺常见的需求了,比如记录日志,我们要获取请求体里面的内容。在HTTP协议中,服务器接收到客户端的请求时,请求体(RequestBody)通常是以流的形式传输的。这个流在设计上是只读且不可重复读取的。即request body只能读取一次,但我们很多时候是更希望这个requestbody可以被多次读取,那我们今天就来聊下这个话题
lyb-geek
2024/07/30
2370
聊聊在springcloud gateway如何获取请求体
spring cloud gateway之filter篇
在上一篇文章详细的介绍了Gateway的Predict,Predict决定了请求由哪一个路由处理,在路由处理之前,需要经过“pre”类型的过滤器处理,处理返回响应之后,可以由“post”类型的过滤器处理。
方志朋
2019/06/21
2.9K0
spring cloud gateway之filter篇
推荐阅读
相关推荐
自研网关:多项目的swagger聚合功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验