山西网站建设公司,如何使用家里电脑做网站服务器,昌吉市建设局网站,服务器安全模式怎么进一、概述
1.1认识网关
什么是网关#xff1f;
顾明思议#xff0c;网关就是网络的关口。数据在网络间传输#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。
更通俗的来讲#xff0c;网关就像是以前园区传达室的大爷。 外…一、概述
1.1认识网关
什么是网关
顾明思议网关就是网络的关口。数据在网络间传输从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。
更通俗的来讲网关就像是以前园区传达室的大爷。 外面的人要想进入园区必须经过大爷的认可如果你是不怀好意的人肯定被直接拦截。 外面的人要传话或送信要找大爷。大爷帮你带给目标人。
现在微服务网关就起到同样的作用。前端请求不能直接访问微服务而是要请求网关 网关可以做安全控制也就是登录身份校验校验通过才放行 通过认证后网关再根据请求判断应该访问哪个微服务将请求转发过去 1.2SpringCloudGateway概述 Gateway是在Spring生态系统之上构建的API网关服务基于Spring6Spring Boot 3和Project Reactor等技术。它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式并为它们提供跨领域的关注点例如安全性、监控/度量和恢复能力。 在SpringCloud当中提供了两种网关实现方案 Netflix Zuul早期实现目前已经淘汰 SpringCloudGateway基于Spring的WebFlux技术完全支持响应式编程吞吐能力更强 反向代理鉴权流量控制熔断日志监控 1.3Gateway核心介绍 Spring Cloud Gateway组件的核心是一系列的过滤器通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器隐藏微服务结点IP端口信息从而加强安全保护。Spring Cloud Gateway本身也是一个微服务需要注册进服务注册中心。 Route(路由) 路由是构建网关的基本模块它由ID,目标URI,一系列的断言和过虑器组成如果断言为true则匹配该路由 Predicate(断言) 参考的是Java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容例如请求头或请求参数如果请求与断言相匹配则进行路由 Filter(过滤) 指的是Spring框架中GatewayFilter的实例使用过滤器可以在请求被路由前或者之后对请求进行修改。 在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;在“post”类型的过滤器中可以做响应内容、响应头的修改日志的输出流量监控等有着非常重要的作用。 总结 web前端请求通过一些匹配条件定位到真正的服务节点。并在这个转发过程的前后进行一些精细化控制。 predicate就是我们的匹配条件 filter就可以理解为一个无所不能的拦截器。有了这两个元素再加上目标uri就可以实现一个具体的路由了 二、快速入门
接下来我们先看下如何利用网关实现请求路由。由于网关本身也是一个独立的微服务因此也需要创建一个模块开发功能。大概步骤如下 创建网关微服务 引入SpringCloudGateway、NacosDiscovery依赖 编写启动类 配置网关路由
.创建项目
pom依赖
dependencies!--gateway--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!--服务注册发现consul discovery,网关也要注册进服务注册中心统一管控--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-consul-discovery/artifactId/dependency!-- 指标监控健康检查的actuator,网关是响应式编程删除掉spring-boot-starter-web dependency--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency/dependencies
yml配置
server:port: 9527spring:application:name: cloud-gateway #以微服务注册进consul或nacos服务列表内cloud:consul: #配置consul地址host: localhostport: 8500discovery:prefer-ip-address: trueservice-name: ${spring.application.name}gateway:routes:- id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由- id: pay_routh2 #pay_routh2 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path/pay/gateway/info/** # 断言路径相匹配的进行路由
启动类
SpringBootApplication
EnableDiscoveryClient //服务注册和发现
public class Main9527
{public static void main(String[] args){SpringApplication.run(Main9527.class,args);}
}
测试
RestController
public class PayGateWayController
{ResourcePayService payService;GetMapping(value /pay/gateway/get/{id})public ResultDataPay getById(PathVariable(id) Integer id){Pay pay payService.getById(id);return ResultData.success(pay);}GetMapping(value /pay/gateway/info)public ResultDataString getGatewayInfo(){return ResultData.success(gateway info test IdUtil.simpleUUID());}
}
配置
相同公司
FeignClient(value cloud-payment-service)//自己人内部自己访问自己写微服务名字OK
public interface PayFeignApi
{/*** GateWay进行网关测试案例01* param id* return*/GetMapping(value /pay/gateway/get/{id})public ResultData getById(PathVariable(id) Integer id);/*** GateWay进行网关测试案例02* return*/GetMapping(value /pay/gateway/info)public ResultDataString getGatewayInfo();
}
不同公司 存在ym配置映射写死问题
三、GateWay高级特性
3.1Route以微服务名-动态获取服务URI gateway:routes:- id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由- id: pay_routh2 #pay_routh2 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/pay/gateway/info/** # 断言路径相匹配的进行路由3.2Predicate断言谓词 整体架构 两种配置方式 Shortcut Configuration After Route Predicate
获取datatime
public class ZonedDateTimeDemo
{public static void main(String[] args){ZonedDateTime zbj ZonedDateTime.now(); // 默认时区System.out.println(zbj);}
}
yml配置 predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由- After2024-4-16T14:37:50.58691880008:00[Asia/Shanghai]
Before Route Predicate predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]- Before2023-11-27T15:25:06.42456630008:00[Asia/Shanghai] #超过规定时间不可访问
Between Route Predicate
predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]#- Before2023-11-20T17:58:13.58691880008:00[Asia/Shanghai]- Between2023-11-21T17:38:13.58691880008:00[Asia/Shanghai],2023-11-22T17:38:13.58691880008:00[Asia/Shanghai]
Cookie Route Predicate Cookie Route Predicate需要两个参数一个是 Cookie name ,一个是正则表达式。 路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配如果匹配上就会执行路由如果没有匹配上则不执行 predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]- Before2023-12-29T17:58:13.58691880008:00[Asia/Shanghai]#- Between2023-11-21T17:38:13.58691880008:00[Asia/Shanghai],2023-11-22T17:38:13.58691880008:00[Asia/Shanghai]- Cookieusername,zzyy
Header Route Predicate 两个参数一个是属性名称和一个正则表达式这个属性值和正则表达式匹配则执行。 predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]- Before2023-12-29T17:58:13.58691880008:00[Asia/Shanghai]#- Between2023-11-21T17:38:13.58691880008:00[Asia/Shanghai],2023-11-22T17:38:13.58691880008:00[Asia/Shanghai]#- Cookieusername,zzyy- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式
Host Route Predicate Host Route Predicate 接收一组参数一组匹配的域名列表这个模板是一个 ant 分隔的模板用.号作为分隔符。它通过参数中的主机地址作为匹配规则。 predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]- Before2023-12-29T17:58:13.58691880008:00[Asia/Shanghai]#- Between2023-11-21T17:38:13.58691880008:00[Asia/Shanghai],2023-11-22T17:38:13.58691880008:00[Asia/Shanghai]#- Cookieusername,zzyy#- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式- Host**.atguigu.com
Path Route Predicate predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]- Before2023-12-29T17:58:13.58691880008:00[Asia/Shanghai]#- Between2023-11-21T17:38:13.58691880008:00[Asia/Shanghai],2023-11-22T17:38:13.58691880008:00[Asia/Shanghai]#- Cookieusername,zzyy#- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式- Host**.atguigu.com
Query Route Predicate 支持传入两个参数一个是属性名一个为属性值属性值可以是正则表达式。 predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]- Before2023-12-29T17:58:13.58691880008:00[Asia/Shanghai]#- Between2023-11-21T17:38:13.58691880008:00[Asia/Shanghai],2023-11-22T17:38:13.58691880008:00[Asia/Shanghai]#- Cookieusername,zzyy#- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式#- Host**.atguigu.com- Queryusername, \d # 要有参数名username并且值还要是整数才能路由
RemoteAddr route predicate predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由#- After2023-11-20T17:38:13.58691880008:00[Asia/Shanghai]- Before2023-12-29T17:58:13.58691880008:00[Asia/Shanghai]#- Between2023-11-21T17:38:13.58691880008:00[Asia/Shanghai],2023-11-22T17:38:13.58691880008:00[Asia/Shanghai]#- Cookieusername,zzyy#- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式#- Host**.atguigu.com#- Queryusername, \d # 要有参数名username并且值还要是整数才能路由- RemoteAddr192.168.124.1/24 # 外部访问我的IP限制最大跨度不超过32目前是1~24它们是 CIDR 表示法。
Method Route Predicate 配置某个清求地址只能用Get/Post方法访问方法限制 总结
server:port: 9527spring:application:name: cloud-gateway #以微服务注册进consul或nacos服务列表内cloud:consul: #配置consul地址host: localhostport: 8500discovery:prefer-ip-address: trueservice-name: ${spring.application.name}gateway:routes:- id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由- After2023-12-30T23:02:39.07997940008:00[Asia/Shanghai]#- Cookieusername,zzyy# - HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式#- Host**.atguigu.com#- Queryusername, \d # 要有参数名username并且值还要是整数才能路由#- RemoteAddr192.168.124.1/24 # 外部访问我的IP限制最大跨度不超过32目前是1~24它们是 CIDR 表示法。- id: pay_routh2 #pay_routh2 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path/pay/gateway/info/** # 断言路径相匹配的进行路由
3.3自定义断言
开头任意取名但是必须以RoutePredicateFactory后缀结尾 1.新建类名XXX需要以RoutePredicateFactory结尾并继承AbstractRoutePredicateFactory类
Component标注不可忘public class MyRoutePredicateFactory extends AbstractRoutePredicateFactoryMyRoutePredicateFactory.Config
{}
2.重写appy方法
Override
public PredicateServerWebExchange apply(MyRoutePredicateFactory.Config config)
{return null;
}
3.新建apply方法所需要的静态内部类MyRoutePredicateFactory.Config这个Config类就是我们的路由断言规侧重要
Validated
public static class Config{SetterGetterNotEmptyprivate String userType; //钻、金、银等用户等级
}
4.空参构造方法内部调用super
public MyRoutePredicateFactory()
{super(MyRoutePredicateFactory.Config.class);
}
5.重写apply方法第二版
Override
public PredicateServerWebExchange apply(MyRoutePredicateFactory.Config config)
{return new PredicateServerWebExchange(){Overridepublic boolean test(ServerWebExchange serverWebExchange){//检查request的参数里面userType是否为指定的值符合配置就通过String userType serverWebExchange.getRequest().getQueryParams().getFirst(userType);if (userType null) return false;//如果说参数存在就和config的数据进行比较if(userType.equals(config.getUserType())) {return true;}return false;}};
} 完整
// 使用Component注解将该类声明为一个Spring组件
Component
// 继承AbstractRoutePredicateFactory类并指定泛型参数为Config类
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactoryMyRoutePredicateFactory.Config {// 构造函数调用父类的构造函数传入Config类的类型public MyRoutePredicateFactory() {super(MyRoutePredicateFactory.Config.class);}// 定义一个静态内部类Config用于存储配置信息Validatedpublic static class Config {SetterGetterNotEmptyprivate String userType; // 用户等级如钻、金、银等}// 重写apply方法接收一个Config类型的参数返回一个PredicateServerWebExchange对象Overridepublic PredicateServerWebExchange apply(MyRoutePredicateFactory.Config config) {// 返回一个新的PredicateServerWebExchange对象return new PredicateServerWebExchange() {// 重写test方法接收一个ServerWebExchange类型的参数Overridepublic boolean test(ServerWebExchange serverWebExchange) {// 从请求中获取userType参数的值String userType serverWebExchange.getRequest().getQueryParams().getFirst(userType);// 如果userType为空则返回falseif (userType null) return false;// 如果userType与config中的userType相等则返回trueif (userType.equals(config.getUserType())) {return true;}// 其他情况返回falsereturn false;}};}
}yml配置 predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由- After2024-04-16T14:43:38.19323470008:00[Asia/Shanghai]
# - Mydiamond- name: Myargs:userType: diamond
短处配置
Override
public ListString shortcutFieldOrder() {return Collections.singletonList(userType);
}
3.4Filteri过滤 pre和“post”分别会在请求被执行前调用和被执行后调用用来修改请求和响应信息 功能 请求鉴权异常处理记录接口调用时长统计重点大厂面试设计题 全局默认过滤器Global Filters gateway出厂默认已有的直接用即可主要作用于所有的路由不需要在配置文件中配置作用在所有的路由上实现GlobalFilter接口即可 单一内置讨虑器GatewavFilter 也可以称为网关过滤器这种过滤器主要是作用于单一路由或者某个路由分组 自定义过滤器
3.5请求头(RequestHeader)相关组
The AddRequestHeader GatewayFilter Factory】
指定请求头
测试类 GetMapping(value /pay/gateway/filter)public ResultDataString getGatewayFilter(HttpServletRequest request){String result ;EnumerationString headers request.getHeaderNames();while(headers.hasMoreElements()){String headName headers.nextElement();String headValue request.getHeader(headName);System.out.println(请求头名: headName \t\t\t请求头值: headValue);if(headName.equalsIgnoreCase(X-Request-atguigu1)|| headName.equalsIgnoreCase(X-Request-atguigu2)) {result resultheadName \t headValue ;}}return ResultData.success(getGatewayFilter 过滤器 test result \t DateUtil.now());}
yml配置
- id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/pay/gateway/filter/** # 断言路径相匹配的进行路由filters:- AddRequestHeaderX-Request-atguigu1,atguiguValue1 # 请求头kv若一头含有多参则重写一行设置- AddRequestHeaderX-Request-atguigu2,atguiguValue2
The RemoveRequestHeader GatewayFilter Factory yml配置
删除请求头ByName filters:- AddRequestHeaderX-Request-atguigu1,atguiguValue1 # 请求头kv若一头含有多参则重写一行设置- AddRequestHeaderX-Request-atguigu2,atguiguValue2- RemoveRequestHeadersec-fetch-site # 删除请求头sec-fetch-site
The SetRequestHeader GatewayFilter Factory
修改请求头ByName filters:- AddRequestHeaderX-Request-atguigu1,atguiguValue1 # 请求头kv若一头含有多参则重写一行设置- AddRequestHeaderX-Request-atguigu2,atguiguValue2- RemoveRequestHeadersec-fetch-site # 删除请求头sec-fetch-site- SetRequestHeadersec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy
3.6请求参数(RequestParameter)相关组
The AddRequestParameter GatewayFilter FactoryThe RemoveRequestParameter GatewayFilter Factory
3.7回应头(ResponseHeader)相关组 - AddResponseHeaderX-Response-atguigu, BlueResponse # 新增请求参数X-Response-atguigu并设值为BlueResponse- SetResponseHeaderDate,2099-11-11 # 设置回应头Date值为2099-11-11- RemoveResponseHeaderContent-Type # 将默认自带Content-Type回应属性删除
3.8前缀和路径相关组重要
The PrefixPath GatewayFilter Factory
自动添加路径前缀 predicates:#- Path/pay/gateway/filter/** # 被分拆为: PrefixPath Path- Path/gateway/filter/** # 断言为配合PrefixPath测试过滤暂时注释掉/payfilters:- AddRequestHeaderX-Request-atguigu1,atguiguValue1 #请求头kv若一头含有多参则重写一行设置#- AddRequestHeaderX-Request-atguigu2,atguiguValue2#- RemoveRequestHeadersec-fetch-site # 删除请求头sec-fetch-site#- SetRequestHeadersec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy#- AddRequestParametercustomerId,9527001 # 新增请求参数Parameterk v#- RemoveRequestParametercustomerName # 删除url请求参数customerName你传递过来也是null#- AddResponseHeaderX-Response-atguigu, BlueResponse # 新增请求参数X-Response-atguigu并设值为BlueResponse#- SetResponseHeaderDate,2099-11-11 # 设置回应头Date值为2099-11-11#- RemoveResponseHeaderContent-Type # 将默认自带Content-Type回应属性删除- PrefixPath/pay # http://localhost:9527/pay/gateway/filter The SetPath GatewayFilter Factory
访问路径修改 predicates:#- Path/pay/gateway/filter/** # 真实地址#- Path/gateway/filter/** # 断言为配合PrefixPath测试过滤暂时注释掉/pay- Path/XYZ/abc/{segment} # 断言为配合SetPath测试{segment}的内容最后被SetPath取代filters:- AddRequestHeaderX-Request-atguigu1,atguiguValue1 #请求头kv若一头含有多参则重写一行设置#- AddRequestHeaderX-Request-atguigu2,atguiguValue2#- RemoveRequestHeadersec-fetch-site # 删除请求头sec-fetch-site#- SetRequestHeadersec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy#- AddRequestParametercustomerId,9527001 # 新增请求参数Parameterk v#- RemoveRequestParametercustomerName # 删除url请求参数customerName你传递过来也是null#- AddResponseHeaderX-Response-atguigu, BlueResponse # 新增请求参数X-Response-atguigu并设值为BlueResponse#- SetResponseHeaderDate,2099-11-11 # 设置回应头Date值为2099-11-11#- RemoveResponseHeaderContent-Type # 将默认自带Content-Type回应属性删除#- PrefixPath/pay # http://localhost:9527/pay/gateway/filter- SetPath/pay/gateway/{segment} # {segment}表示占位符你写abc也行但要上下一致 The RedirectTo GatewayFilter Factory
重定向到某个页面 predicates:- Path/pay/gateway/filter/** # 真实地址#- Path/gateway/filter/** # 断言为配合PrefixPath测试过滤暂时注释掉/pay#- Path/XYZ/abc/{segment} # 断言为配合SetPath测试{segment}的内容最后被SetPath取代filters:- AddRequestHeaderX-Request-atguigu1,atguiguValue1 #请求头kv若一头含有多参则重写一行设置#- AddRequestHeaderX-Request-atguigu2,atguiguValue2#- RemoveRequestHeadersec-fetch-site # 删除请求头sec-fetch-site#- SetRequestHeadersec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy#- AddRequestParametercustomerId,9527001 # 新增请求参数Parameterk v#- RemoveRequestParametercustomerName # 删除url请求参数customerName你传递过来也是null#- AddResponseHeaderX-Response-atguigu, BlueResponse # 新增请求参数X-Response-atguigu并设值为BlueResponse#- SetResponseHeaderDate,2099-11-11 # 设置回应头Date值为2099-11-11#- RemoveResponseHeaderContent-Type # 将默认自带Content-Type回应属性删除#- PrefixPath/pay # http://localhost:9527/pay/gateway/filter- RedirectTo302, http://www.atguigu.com/ # 访问http://localhost:9527/pay/gateway/filter跳转到http://www.atguigu.com/
3.9Default Filters 配置在比处相当于全局通用自定义秒变Global
3.10自定义全局Filter
Component //不要忘记
Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered
{Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain){return null;}Overridepublic int getOrder(){return 0;}
}
yml配置
server:port: 9527spring:application:name: cloud-gateway #以微服务注册进consul或nacos服务列表内cloud:consul: #配置consul地址host: localhostport: 8500discovery:prefer-ip-address: trueservice-name: ${spring.application.name}gateway:routes:- id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/pay/gateway/get/** # 断言路径相匹配的进行路由- After2023-12-30T23:02:39.07997940008:00[Asia/Shanghai]- id: pay_routh2 #pay_routh2 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名uri: lb://cloud-payment-servicepredicates:- Path/pay/gateway/info/** # 断言路径相匹配的进行路由- id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path/pay/gateway/filter/** # 断言路径相匹配的进行路由默认正确地址filters:- AddRequestHeaderX-Request-atguigu1,atguiguValue1 # 请求头kv若一头含有多参则重写一行设置
Component
Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered
{/*** 数字越小优先级越高* return*/Overridepublic int getOrder(){return 0;}private static final String BEGIN_VISIT_TIME begin_visit_time;//开始访问时间/***第2版各种统计* param exchange* param chain* return*/Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {//先记录下访问接口的开始时间exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis());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) ms);log.info(我是美丽分割线: ###################################################);System.out.println();}}));}}
3.11自定义条件Filter
省略