gateway 只匹配post和get_SpringCloud学习笔记——新服务网关Gateway过滤器

  • Post author:
  • Post category:其他


2f910a8ad14542aab6e000f6cd52142e.png


概述

断言是为了服务路由的匹配,过滤器则是在服务实例调用之前或之后对HTTP请求和响应的拦截,以便对请求和响应作出相应的修改。在SpringCloud学习笔记——旧服务网关Zuul中,提到过可以通过不同类型的过滤器实现身份验证、服务鉴权、参数校验、调用响应等功能。

过滤器生命周期

Gateway中只提供”PRE”和”POST”两种类型的过滤器。

PRE:服务调用请求被路由前执行该类型过滤器。主要用于实现参数校验、权限校验、流量监控、日志输出、协议转换等功能。

POST:服务调用请求被路由到具体的服务实例之后执行该过滤器。主要用于实现响应头的修改、收集统计信息和指标、将响应内容发送给客户端、输出日志、流量监控等功能。

5d1e7c207eae3e516f68c73d4a9ae54c.png


过滤器类型

在Gateway中,过滤器分为局部过滤器和全局过滤器。全局过滤器对所有服务路由有效,需要实现GlobalFilter接口;局部过滤器只对部分路由有效,需要实现GatewayFilter接口。


局部过滤器

过滤器名 过滤器作用
AddRequestHeader 用于在服务路由添加请求头信息
AddRequestParam 用于在服务路由中添加请求参数信息
AddResponseHeader 用于添加响应头信息
Hystrix 用于将熔断器引入Gateway,避免服务雪崩现象发生
PrefixPath 为服务调用实例路径添加前缀参数
PreserveHostHeader 用于设置路由过滤器的请求属性,决定是否发送原始主机头
RequestRateLimiter 用于对服务调用请求进行限流,限流算法为令牌桶
RedirectTo 用于将服务调用请求重定向至指定URL
RemoveRequestHeader 删除某个指定的请求头信息    ‍
RemoveResponseHeader 删除某个指定的响应头信息‍
RewritePath 使用正则表达式重写请求路径
RewriteResponseHeader 重写某个指定的响应头信息    ‍
SaveSession 转发服务调用请求前,强制执行保存session操作
SecureHeader 用于为响应信息添加安全头    ‍
SetPath 用于修改原始请求路径    ‍
SetResponseHeader 用于修改指定原始响应头信息    ‍
SetStatus 用于修改原始响应的状态码‍
StripPrefix 用于截断原始请求路径
Retry 针对不同的响应进行重试操作

AddRequestHeader

用于为服务调用请求添加请求头参数信息。

配置类方式创建

@Configurationpublic class CustomAddRequestHeaderFilter{
        @Bean    public RouteLocator customAddHeaderRouteLocator(RouteLocatorBuilder builder){
            /**         *id: gateway路由标识         *path:服务请求路径         * filters:添加请求头信息过滤器         * uri:服务实例调用地址         * 本例中的路由规则,当服务请求路径为/user/**时为服务调用请求添加请求头参数信息并将服务调用请求路由至服务实例         */        return builder.routes().route("userAddHeaderFilter",                r->r.path("/user/**")                        .filters(f->f.addRequestHeader("userId","1"))                        .uri("localhost://8100/user")).build();    }}

配置文件方式创建

spring:  cloud:    gateway:      routes:        - id:user-addHeaderFilter-route        uri:localhost://8100/user        predicates:          - Path=/user/**        filters:          - AddRequestFilter=id,1


AddRequestParam

用于在服务路由中添加请求参数。

配置类方式创建

@Configurationpublic class CustomAddRequestParamFilter {
        @Bean    public RouteLocator customAddRequestParamRouteLocator(RouteLocatorBuilder builder){
            /**         * id:gateway路由标识         * path:服务请求路径         * filters:添加请求参数信息过滤器         * uri:服务实例调用地址         * 本例中的路由规则,当服务请求路径为/user/**时为服务调用请求添加请求头参数信息并将服务调用请求路由至服务实例         */        return builder.routes().route("userAddRequestParam",r->r.path("/user/**")                .filters(f->f.addRequestParameter("userId","1")).uri("localhost://8100/user")).build();    }}

配置文件方式创建

spring:  cloud:    gateway:      routes:        - id:user-addHeaderFilter-route        uri:localhost://8100/user        predicates:          - Path=/user/**        filters:          - AddRequestParam=userId,1

AddResponseHeader

用于添加响应头信息。

配置类方式创建

@Configurationpublic class CustomAddResponseHeaderFilter {
        @Bean    public RouteLocator customAddResponseHeaderRouteLocator(RouteLocatorBuilder builder){
            /**         * id:gateway路由标识         * path:服务请求路径         * filters:添加响应头参数信息过滤器         * uri:服务实例调用地址         * 本例中的路由规则,当服务请求路径为/user/**时为服务调用请求添加响应头参数信息并将服务调用请求路由至服务实例         */        return builder.routes().route("userAddResponseHeader",                r->r.path("/user/**").filters(                        f->f.addResponseHeader("token","123456789")).uri("localhost://8100/user")).build();    }}

配置文件方式创建

spring:  cloud:    gateway:      routes:        - id:user-addResponseHeader-route        uri:localhost://8100/user        predicates:          - Path=/user/**        filters:          - AddResponseHeader=token,123456789


Hystrix

提供熔断器功能,当服务请求调用出现失败或异常情况的时候,可以执行熔断操作。当熔断发生后,可以通过服务降级功能提高用户体验,往往还需要进行服务跳转返回服务调用失败信息。

控制器

@RestController@RequestMapping("/gateway")public class GatewayFallbackController {
        @GetMapping("/getFallback")    public ResultMessage getFallback()    {
            return new ResultMessage(false,"服务调用路由失败,请检查服务实例状态");    }}

配置类方式创建

@Configurationpublic class CustomHystrixFilter {
        @Bean    public RouteLocator customHystrixRotueLocator(RouteLocatorBuilder builder){
            return builder.routes().route("userHystrix",r->r.path("/hystrix/**").filters(                f->f.hystrix(config->{



版权声明:本文为weixin_35034088原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。