开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第三阶段:Gateway 局部过滤器】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/685/detail/11893
Gateway 局部过滤器
内容介绍:
.局部过滤器
一、内置局部过滤器
二、自定义过滤器
.局部过滤器
局部过滤器是针对单个路由的过滤器
我们需要在每一个路由上进行单独配置
一、内置局部过滤器
在 SpringCloud Gateway 中内置了很多不同类型的网关路由过滤器,我们今天讲的是几个最常见的,具体如下:
过滤器工厂 |
作用 |
参数 |
AddRequestHeader |
为原始请求添加Header |
Header 的名称及值 |
AddRequestParameter |
为原始请求添加请求参数 |
参数名称及值 |
AddResponseHeader |
为原始响应添加Header |
Header 的名称及值 |
DedupeResponseHeader |
剔除响应头中重复的值 |
需要去重的 Header 名称及去重策略 |
Hystrix |
为路由引入 Hystrix 的断路器保护 |
Hystrixcommand 的名称 |
SetStatus |
修改原始响应的状态码 |
HTTP 状态码,可以是数字,也可以是字符串 |
我们以 SetStatus 为例讲解,在未使用这个过滤器之前,原始转态码是多少
routes: #
路由数组 [路由就是指当请求满足什么样的条件的时候转发到哪个微服务上,转发过程中还可以动一些手脚]
- id: product_route#
当前路由发的标识,要求唯一,默认是 UUID
uri: http:7/localhost:8081#
请求最终要被转发到的地址
uri: lb://service-product # 1b
指的是负载均衡,后面跟的是具体微服务在nacos 中的标识
order: 1#
路由的优先级,数字越小代表路由的优先级越高
predicates:#
断言(条件判断,返回值是 boolean 转发请求要满足的条件)
-Path=/product-serv/**,#
当请求路径满足 path 指定的规则时,此路由信息才会正常转发
- Age=18,60#
仅仅让 age 在18到60之间的人访问
filters: #
过滤器(在请求传递过程中对请求做一些手脚)
- stripPrefix=1 #
在请求转发之前去掉一层路径
访问localhost:
7000
/
product-serv/product/1
得到响应码为200
添加- setstatus=250
之后再次刷新,这时响应码就变为250
以上就是一种修改响应码的内置过滤器的使用方式
当内置过滤器无法满足我们的需求时,就需要自定义过滤器
二、自定义过滤器
第1步:在配置文件中,添加一个 Log 的过滤器配置
-
Log
=
true,false
#
控制日志是否开启
第2步:自定义一个过滤器工厂,实现方法
我们来修改一下配置,
routes:#
路由数组 [路由就是指当请求满足什么样的条件的时候转发到哪个微服务上,转发过程中还可以动一些手脚]
- id: product_route#
当前路由发的标识,要求唯一,默认是 UUID
uri: http:7/localhost:8081#
请求最终要被转发到的地址
uri: lb://service-product # 1b
指的是负载均衡,后面跟的是具体微服务在nacos 中的标识
order: 1#
路由的优先级,数字越小代表路由的优先级越高
predicates: #
断言(条件判断,返回值是 boolean 转发请求要满足的条件)
- Path=/product-serv/**,#
当请求路径满足 path 指定的规则时,此路由信息才会正常转发
- Age=18,60#
仅仅让 age 在18到60之间的人访问
filters: #
过滤器(在请求传递过程中对请求做一些手脚)
- stripPrefix=1 #
在请求转发之前去掉一层路径
-Log=true,false
再重新编写一个文件,在这个文件里放置一类,这个类的名称必须以 Gateway 开头
//自定义局部过滤器
@
component
public class LogGatewayFilterFactory
extends AbstractGatewayFilterFactory < LogGateway
FilterFactory.confi >
{
//构造函数
public LogGatewayFilterFactory(){
super(LogGatewayFilterFactory.
C
onfig.class) ;
}
//读取配置文件中的参数赋值到配置类中
@Override
public List shortcutFieldorder () {
return Arrays.asList(“consoLeLog”,”cacheLog
‘’
);
}
/过滤器逻辑
@Override
public GatewayFilte
apply(LogGatewayFilterFactory.config config) {
return
new
GatewayFilter(){
@
Override
Public Monn filter(ServerWebExchange
exchange,Gate
wayFilterChain chain) {
i
f (config.isCacheLog()){
System.out.println (“cacheLog
已经开启了
….
”);
}
i
f (config.isC
onsoleLOg
Log()){
System.out.println (“
console
Log
已经开启了
….
”);
}
Return chain.filter(exchange);
//配置类接收配置参数
@Data
@
NoArgsConstructor
public static class Config {
private boolean consoleLog;
private boolean cacheLog;
}
}
代码写完之后,点击启动
consoleLog 已经启动,但是 CacheLog 不启动
以上就是自定义局部过滤器的使用方式。