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

相关文章

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定