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

springcloud第4季 springcloud-gateway网关filter案例场景

一  filter作用

1.1 filter搭建流程

1.1.1 网关配置

1.1.2 服务提供者

1.1.3 测试验证

1.启动consul

2.启动zipkin

3.启动应用微服务

4.进行访问:  http://localhost:6666/pay/wg/filter

1.2  其他常见API

RemoveRequestHeader=sec-fetch-site      # 删除请求头sec-fetch-site
#- SetRequestHeader=sec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy
#- AddRequestParameter=customerId,9527001 # 新增请求参数Parameter:k ,v

二   自定义网关统计接口耗时

2.1  编写统计耗时接口类

1.截图

2.具体代码:

package com.jurf.ms.gateway6666.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @auther zzyy* @create 2023-12-31 21:05*/
@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered
{public static final String BEGIN_VISIT_TIME = "begin_visit_time";//开始调用方法的时间@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){//1 先记录下访问接口的开始时间exchange.getAttributes().put(BEGIN_VISIT_TIME,System.currentTimeMillis());//2 返回统计的各个结果给后台return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);if(beginVisitTime != null){log.info("访问接口主机:"+exchange.getRequest().getURI().getHost());log.info("访问接口端口:"+exchange.getRequest().getURI().getPort());log.info("访问接口URL:"+exchange.getRequest().getURI().getPath());log.info("访问接口URL后面参数:"+exchange.getRequest().getURI().getRawQuery());log.info("访问接口时长:"+(System.currentTimeMillis() - beginVisitTime) + "毫秒");log.info("============分割线==========================");System.out.println();}}));}/*** 数字越小,优先级越高* @return*/@Overridepublic int getOrder(){return 0;}
}

2.2 启动服务统计耗时

1.启动服务

2.请求地址:

http://localhost:8081/feign/pay/gateway/zdy/1?cityName=sz

3.耗时统计显示:

三   自定义网关过滤指定参数

2.1  编写过滤参数代码

package com.jurf.ms.gateway6666.config;import lombok.Getter;
import lombok.Setter;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;/*** @auther zzyy* @create 2023-12-31 21:41*/
@Component
public class ZdyGatewayFilterFactory extends AbstractGatewayFilterFactory<ZdyGatewayFilterFactory.Config>
{public ZdyGatewayFilterFactory(){super(Config.class);}@Overridepublic GatewayFilter apply(Config config){return new GatewayFilter(){@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){ServerHttpRequest request = exchange.getRequest();System.out.println("进入了自定义网关过滤器MyGatewayFilterFactory,status:"+config.getStatus());if(request.getQueryParams().containsKey("guangzhou")){return chain.filter(exchange);}else{exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}}};}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("status");}public static class Config{@Getter@Setterprivate String status;//设定一个状态值/标志位,它等于多少,匹配和才可以访问}
}
//单一内置过滤器GatewayFilter

2.2 配置

在filters的配置项,如下:

2.3 测试

1.请求地址:http://localhost:6666/pay/wg/filter?guangzhou=234

2.console控制台:status的值为gz,可以和请求参数的值guagnzhou=234   即gz和234 是否相等做一下业务逻辑判断的场景。

相关文章:

  • 自定义类型:结构体+结构体内存对齐+结构体实现位段
  • linux系统——ping命令
  • qemu虚拟机安装麒麟v10 arm版系统
  • [自学记录09*]Unity Shader:在Unity里渲染一个黑洞
  • 零基础入门学用Arduino 第一部分(三)
  • Java算法-力扣leetcode-167. 两数之和 II - 输入有序数组
  • 元音 (音标) 和元音字母的区别
  • Linux Shell Script 编写入门
  • 【vuejs】vm.$set() 的原理解析和方法以及应用场景
  • 实战 | YOLOv10 自定义数据集训练实现车牌检测 (数据集+训练+预测 保姆级教程)
  • DevOps 安全集成:从开发到部署,全生命周期安全守护
  • [ssi-uploader插件]解决如何接收服务器返回数据+修改参数名称
  • 数据库练习题
  • oracle中如何查询特定日期?
  • 计算机网络——应用层
  • JS 中的深拷贝与浅拷贝
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Angular6错误 Service: No provider for Renderer2
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java精华积累:初学者都应该搞懂的问题
  • jquery ajax学习笔记
  • Laravel核心解读--Facades
  • log4j2输出到kafka
  • Mithril.js 入门介绍
  • node学习系列之简单文件上传
  • PHP变量
  • Sublime text 3 3103 注册码
  • vue-router 实现分析
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 力扣(LeetCode)22
  • 前端自动化解决方案
  • 如何实现 font-size 的响应式
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用SAX解析XML
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 跳前端坑前,先看看这个!!
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 携程小程序初体验
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ${factoryList }后面有空格不影响
  • %@ page import=%的用法
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (TOJ2804)Even? Odd?
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法