GateWay三大案例组件

2024-09-05 18:52
文章标签 组件 三大 案例 gateway

本文主要是介绍GateWay三大案例组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、局部过滤器接口耗时(LogTime)

  1. 命名规则:以GatewayFilterFactory结尾
  2. 编写接口耗时过滤器
@Slf4j
@Component
public class LogTimeGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {private static long timeSpan = 0;@Overridepublic GatewayFilter apply(NameValueConfig config) {String timeSpanStr = config.getValue();timeSpan = Long.valueOf(timeSpanStr);return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange,  GatewayFilterChain chain) {long startTime = System.currentTimeMillis();return chain.filter(exchange).then(Mono.fromRunnable(()->{long endTime = System.currentTimeMillis();long time =  endTime-startTime;if(time >= timeSpan){log.debug("{} 耗时:{}",exchange.getRequest().getURI(), time);}}));}};}
}
  1. 在yml文件中加入耗时时长
    请添加图片描述

二、全局Token认证(TokenGlobalFilter)

目的是对所有进入系统的请求或相应进行统一处理

  1. 创建过滤器类
@Slf4j
@Component
public class TokenFilter implements GlobalFilter, Ordered {@Value("${cn.smart.tokenx.key}")private String tokenKey;private static List<String> whiteList = CollUtil.newArrayList("/api/login", "/api/register");@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();URI uri = request.getURI();String path = uri.getPath().toLowerCase().trim();//排除白名单的验证if(whiteList.contains(path)){return chain.filter(exchange);}ServerHttpResponse response = exchange.getResponse();List<String> tokens = request.getHeaders().get("token");//验证的是有没有传tokenif(ObjectUtil.isEmpty(tokens)){log.error("请传token");response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}String token = tokens.get(0);//验证的是传的token值是否为空if(ObjectUtil.isEmpty(token)){log.error("token 不能为空");response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}boolean b = false;// 验证算法,JWTValidator包含过期的验证,验证比较全面try {JWTValidator.of(token).validateAlgorithm(JWTSignerUtil.hs256(tokenKey.getBytes())).validateDate();b = true;}catch (Exception ex){ex.printStackTrace();log.error("token不正确");}if(!b){response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}//接着执行下面的过滤器,token还会带到下游,我们的服务还是要用我们之前的token-starter,token-starter功能只保留解析token写入Threadlocal,验证的功能不再需要return chain.filter(exchange);}@Overridepublic int getOrder() {return 2;}
}
  1. 注册全局过滤器,使用@Component注解,Spring会自动扫描并注册Bean

三、全局链路跟踪TraceId日志(TraceIdGlobalFilter)

  1. 创建全局过滤器,在请求头上带入traceId参数,穿透到下游服务
@Component
@Slf4j
@Order(1)
public class TraceIdFilter implements GlobalFilter {private static final  String  TRACE_ID = "traceId";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();List<String> traceIds = request.getHeaders().get(TRACE_ID);if(ObjUtil.isNotEmpty(traceIds)){return chain.filter(exchange);}String traceId = IdUtil.simpleUUID();//request.getHeaders().set(TRACE_ID,traceId); //ReadOnlyHttpHeaders UnsupportedOperationExceptionServerHttpRequest request2 = request.mutate().header(TRACE_ID,traceId).build();return chain.filter(exchange.mutate().request(request2).build());}
  1. 下游服务使用全链路跟踪Id,配置TraceId过滤器
  2. 启动类开启SercletComponentScan扫描,启动类上加一个@SercletComponentScan注解
  3. 配置文件配置日志输出格式

这篇关于GateWay三大案例组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139790

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态