当前位置: 首页 > news >正文

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. 配置文件配置日志输出格式

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 后端开发刷题 | 最长公共子序列(非连续)
  • 科研绘图系列:R语言PCoA图(PCoA plot)
  • 店匠科技携手Stripe共谋电商支付新篇章
  • 前端知识HTMLCSS
  • 从供货上游到下游消费者平台搭建 多商家供货供应链商城开发关键点
  • RabbitMQ 02 操作,配置信息,用户权限
  • 提升效率!ArcGIS中创建脚本工具
  • Unity(2022.3.41LTS) - UI详细介绍- Panel(面板)和RectTransform组件
  • 立即下载!Windows 10 22H2 64位专业精简版
  • C#绘制常用工业控件(仪表盘,流动条,开关等)
  • JavaScript - Api学习 Day03 (日期对象、节点操作、两种定时器、本地存储)
  • moonlight串流配置太复杂?推荐一款无需配置的宝藏串流软件GameViewer远程
  • DevOps学习笔记
  • CSS学习8[重点]--盒子模型边框、内外边距设定和外边距合并
  • 九九乘法口决表
  • Android单元测试 - 几个重要问题
  • codis proxy处理流程
  • Laravel 实践之路: 数据库迁移与数据填充
  • python3 使用 asyncio 代替线程
  • webgl (原生)基础入门指南【一】
  • windows下如何用phpstorm同步测试服务器
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用 @font-face
  • 探索 JS 中的模块化
  • ​Java基础复习笔记 第16章:网络编程
  • ​补​充​经​纬​恒​润​一​面​
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (07)Hive——窗口函数详解
  • (4.10~4.16)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (第27天)Oracle 数据泵转换分区表
  • (三)模仿学习-Action数据的模仿
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)LINQ之路
  • .net 7和core版 SignalR
  • .NET C# 使用GDAL读取FileGDB要素类
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net快速开发框架源码分享
  • .NET框架设计—常被忽视的C#设计技巧
  • .py文件应该怎样打开?
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Autowired 与@Resource的区别
  • @component注解的分类
  • @ConfigurationProperties注解对数据的自动封装
  • @RequestMapping-占位符映射
  • @SuppressWarnings注解
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • [].slice.call()将类数组转化为真正的数组
  • [2018-01-08] Python强化周的第一天
  • [Bug]使用gradio创建应用提示AttributeError: module ‘gradio‘ has no attribute ‘inputs‘