SpringCloud - 服务网关(一)

服务网关

Spring Cloud Gateway作为Spring Cloud生态中的网关,不仅提供统一的路由能力,并且还提供了基于FILTER链方式的网关基本的功能。
Spring Cloud Gateway是一个全新的API网关项目,可以替换Zuul开发的网关服务,基于Spring5.0 + SpringBoot2.0 + WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能高于Zuul组件。它可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断、鉴权、路径重写、⽇志监控等功能,同时内置了限流过滤器具备限流的能力。

核心概念

A. 路由(Route):路由是网关最基础的部分,路由是由ID、目标 URI、一组断言和一组过滤器组成。如果断言路由为真,则说明请求的 URI 和配置匹配;
B. 断言(Predicate):JAVA8中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是Spring 5.0框架中的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 Http Request中的任何信息,比如请求头、参数、路径等等,当断言为TRUE时,才执行路由;
C. 过滤器(Filter):Spring Cloud Gateway中的Filter分为Gateway Filter 和 Global Filter两种类型,过滤器将会对请求和响应进行处理。

工作原理

在这里插入图片描述
客户端向 Spring Cloud Gateway 发出请求,由网关处理程序 Gateway Handler Mapping 映射并确定与请求相匹配的路由,然后将其发送到网关 Web 处理程序 Gateway Web Handler,该处理程序通过指定的过滤器链,将请求发送到实际的业务逻辑,然后返回处理结果。
过滤器由虚线分隔的原因是,过滤器可以在发送代理请求之前和之后执行处理逻辑。所有 pre 过滤器逻辑均被执行,然后发出代理请求,发出代理请求后再运行 post 过滤器逻辑。

如何使用

① 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
② 编写配置
server:
  port: 8080
spring:
  application:
    name: servicex-gateway              # 网关名称
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true      # 是否将服务名称转小写
          enabled: true                 # 是否开启基于服务发现的路由规则
      # 路由规则    
      routes:
        # 认证中心
        - id: servicex-auth 			# 路由的唯一ID,用于区别其他的路由
          # 动态路由(lb://服务名)
          uri: lb://servicex-auth       # lb://表示根据服务名称从注册中心获取服务请求地址
          predicates:                   # 断言(判断条件)
            - Path=/auth/**             # 匹配对应URL的请求,将匹配到的请求追加在目标 URI 之后
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1

路由组成

路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:
A. id:路由的唯一标识,用于区别其他的路由;
B. uri:路由指向的目的地的URL,客户端请求最终被转发到的该URL对应的微服务上;
C. order:用于多个路由之间的排序,数值越小越靠前,匹配优先级越高;
D. predicates:用于进行条件判断,只有断言为TRUE才执行路由;
E. filters:用于修改请求和响应信息。

路由规则

Spring Cloud Gateway 使用断言工厂RoutePredicateFactory创建 Predicate 对象,Predicate 对象可以赋值给 Route对象。路由断言工厂 RoutePredicateFactory 内置了多个路由断言实现,包括 Datetime、Cookie、请求头、 HOST地址、 请求方法、 请求路径、请求参数、请求地址和路由权重等路由断言。

A. Spring Cloud Gateway 包含许多内置的 Route Predicate Factories;
B. 所有这些断言都匹配 HTTP 请求的不同属性;
C. 多个 Route Predicate Factories 可以通过逻辑与(and)结合起来一起使用。
在这里插入图片描述
使用说明如下:

spring:
  cloud:
    gateway: 
      routes:
        # 认证中心
        - id: servicex-auth 			 # 路由的唯一ID
          # 动态路由(lb://服务名)
          uri: lb://servicex-auth        # lb://表示根据服务名称从注册中心获取服务请求地址
          predicates:                    # 断言(判断条件)
            #- Path=/auth/**             # 匹配对应URL的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token               # 匹配请求参数中包含参数token的请求
            #- Query=token, abc.         # 匹配请求参数中包含参数token且其值满足正则表达式abc.的请求
            #- Method=GET                # 匹配任意的GET请求
            #- After=2022-07-19T21:20:20.000+08:00[Asia/Shanghai] # 匹配中国上海时间2022-07-19 21:20:20之后的请求
            #- RemoteAddr=192.168.11.1/0 # 匹配远程地址请求是192.168.11.1的请求,0表示子网掩码
            #- Header=X-Request-Id, \d+  # 匹配请求头包含X-Request-Id且其值满足正则表达式\d+的请求
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1

过滤器

Spring Cloud Gateway中的Filter从功能上分为:Gateway Filter和Global Filter两种类型,过滤器会对请求和响应进行处理。
A. GatewayFilter:网关过滤器。需要配置在 spring.cloud.routes.filters 过滤器参数的具体路由下,只作用在当前路由上或通过 spring.cloud.default-filters 配置在全局,作用在所有路由上。
B. GlobalFilter:全局过滤器。无需在配置文件中配置即可作用在所有的路由上。
从处理顺序上分为:前置过滤器和后置过滤器两种类型,是以发送代理请求为分界线。
前置过滤器:可以做参数效验、权限效验、流量监控、日志输出、协议转换等;
后置过滤器:可以做响应内容、响应头的修改、日志输出、流量监控等。

① 网关过滤器

Spring Cloud Gateway 包含许多内置的网关过滤器工厂一共有 22 个,包括头部过滤器、 路径类过滤器、Hystrix 过滤器和重写请求 URL 的过滤器, 还有参数和状态码等其他类型的过滤器。根据过滤器工厂的用途来划分,可以分为以下几种:Header、Parameter、Path、Body、Status、Session、Redirect、Retry、RateLimiter 和 Hystrix。
在这里插入图片描述

② 全局过滤器

全局过滤器无需在配置文件中配置,且是作用在所有的路由上的过滤器。
在这里插入图片描述

③ 自定义全局过滤器

自定义全局过滤器需要实现以下两个接口 :GlobalFilter和Ordered。通过全局过滤器可以实现权限校验,安全性验证等功能。

/**
 * SWAGGER全局过滤器,用于解决SPRING-CLOUD-GATEWAY整合后无法获取SWAGGER资源的问题.
 * @author ROCKY
 */
@Component
public class SwaggerFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        // SPRING-CLOUD-GATEWAY整合SWAGGER3后需要将URL进行特殊处理。
        if (!StringUtils.endsWithIgnoreCase(path, SwaggerProvider.SWAGGER3URL)) {
            return chain.filter(exchange); // 继续向下执行
        }
        return chain.filter(exchange.mutate().request(request.mutate().path(SwaggerProvider.SWAGGER3URL).build()).build());
    }
    // 指定过滤器的执行顺序,数值越小,优先级越高
    @Override
    public int getOrder()
    {
        return -300;
    }
}
④ 自定义网关过滤器

自定义网关过滤器需要实现以下两个接口 :GatewayFilter和Ordered,可以通过配置文件指定也可以通过代码完成自定义网关过滤器的注册,一般采用前者。

断言

官方文档-断言工厂
我们可以理解为:当满足条件后才会进行路由转发,如果有多个条件则多个条件需要同时满足才会进行路由准发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值