Spring Cloud Gateway

这篇具有很好参考价值的文章主要介绍了Spring Cloud Gateway。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、Spring Cloud Gateway

1、网关介绍

2、GateWay

3、GateWay项目搭建

4、GateWay配置路由的两种方式

4.1、YML配置

4.2、配置类

5、GateWay实现负载均衡

5.1、自动负载均衡

5.2、手动负载均衡

6、GateWay断言Predicate

7、GateWay的Filter


一、Spring Cloud Gateway

1、网关介绍

        在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例如:

  • 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性
  • 认证复杂,每个微服务都有独立认证
  • 存在跨域请求,在一定场景下处理相对复杂

为解决上面的问题所以引入了网关的概念:所谓的API网关,就是指系统的统一入口,提供内部服务的路由中转,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等。

系统架构图

Spring Cloud Gateway

网关对比

Zuul 1.x:Netflix开源的网关,基于Servlet框架构建,功能丰富,使用JAVA开发,易于二次开发 问题:即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。
Zuul 2.x:Zuul2 采用了Netty实现异步非阻塞编程模型,每个 CPU 核一个线程,处理所有的请求和响应,请求和响应的生命周期是通过事件和回调来处理的,这种方式减少了线程数量,因此开销较小。
GateWay:Spring公司为了替换Zuul而开发的网关服务,底层为Netty,将在下面具体介绍。
Nginx+lua:使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用,lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本,问题在于:无法融入到微服务架构中
Kong:基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。 问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

2、GateWay

Spring Cloud Gateway 基于Spring Boot 2.x、Spring WebFlux和Project Reactor,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它的目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。

Spring Cloud Gateway官网地址
特点:
1. 性能强劲:是Zuul的1.6倍
2. 功能强大:内置了很多实用的功能,例如转发、监控、限流等
3. 设计优雅,容易扩展

基本概念:

路由(Route) 是 gateway 中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:
-  id:路由标识、区别于其他route
- uri:路由指向的目的地uri,即客户端请求最终被转发到的微服务
- order:用于多个route之间的排序,数值越小排序越靠前,匹配优先级越高
- predicate:断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由 
- filter:过滤器用于修改请求和响应信息

执行流程:

1. Gateway Client向Gateway Server发送请求
2. 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
3. 然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给RoutePredicateHandlerMapping
4. RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
5. 如果过断言成功,由FilteringWebHandler创建过滤器链并调用
6. 请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应

核心流程图

Spring Cloud Gateway

客户端向 Spring Cloud Gateway 发出请求。如果Gateway Handler Mapping确定请求与路由匹配,则将其发送到Gateway Web Handler 处理程序。此处理程序通过特定于请求的Fliter链运行请求。Fliter被虚线分隔的原因是Fliter可以在发送代理请求之前(pre)和之后(post)运行逻辑。执行所有pre过滤器逻辑。然后进行代理请求。发出代理请求后,将运行“post”过滤器逻辑。

过滤器作用:

  • Filter在pre类型的过滤器可以做参数效验、权限效验、流量监控、日志输出、协议转换等。
  • Filter在post类型的过滤器可以做响应内容、响应头的修改、日志输出、流量监控等
  • 这两种类型的过滤器有着非常重要的作用

GateWay的内部有三个核心点

Route(路由)
路由是构建网关的基础模块,它由ID,目标URI,包括一些列的断言和过滤器组成,如果断言为true则匹配该路由
Predicate(断言)
参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),请求与断言匹配则进行路由
Filter(过滤)
指的是Spring框架中GateWayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
三个核心点连起来:
当用户发出请求到达GateWay,GateWay会通过一些匹配条件,定位到真正的服务节点,并在这个转发过程前后,进行一些及细化控制。其中Predicate就是我们匹配的条件,而Filter可以理解为一个拦截器,有了这两个点,再加上目标URI,就可以实现一个具体的路由了。

GateWay核心的流程就是:路由转发+执行过滤器链

SpringCloud GateWay使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架

3、GateWay项目搭建

搭建一个GateWay项目cloudalibaba-gateway-9999

版本对应地址

这里使用SpringBoot2.2.6的版本所以配合的是SpringCloud的Hoxton.SR5版本

注意:引入GateWay一定要删除spring-boot-starter-web依赖,否则会有冲突无法启动

父级项目引入

<!--spring cloud Hoxton.SR5-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.SR5</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

子级项目,因为GateWay也需要注册进Nacos,所以也需要Nacos的依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

yml文件

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
      routes:  # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: http://localhost:9003/nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/** # 断言,路径相匹配进行路由

9003、9004追加控制器

@RestController
@RequestMapping("/lwz")//路由路径
public class GateWayController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/get")
    public String getServerPort(){
        return "GateWay-1:"+serverPort;
    }

}

测试:

启动Nacos、9003和9999网关,通过网关访问9003的/lwz/get接口同时查看Nacos控制台

http://localhost:9999/lwz/get

Spring Cloud Gateway

Nacos控制台成功注册GateWay网关

 Spring Cloud Gateway

4、GateWay配置路由的两种方式

4.1、YML配置

通过上面案例在YML中配置

spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
      routes:  # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: http://localhost:9003/nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/** # 断言,路径相匹配进行路由

4.2、配置类

通过配置类@Configuration,通过@Bean注入一个RouteLocator方式

Spring Cloud Gateway官网案例

具体操作

创建配置类GateWayConfig,内容和上面yml配置一样

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GateWayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        // 构建多个路由routes
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        // 具体路由地址
        routes.route("path_lwz",r -> r.path("/lwz/**").uri("http://localhost:9003/nacos-provider")).build();
        // 返回所有路由规则
        return routes.build();
    }
}

测试:

把9003 yml路由配置去掉,开始测试

启动Nacos、9003和9999网关,通过网关访问9003的/lwz/get接口

Spring Cloud Gateway

5、GateWay实现负载均衡

此时把配置类注释掉使用yml操作

5.1、自动负载均衡

1. gateway.discovery.locator.enabled: true #开启自动路由功能
2. routes中的uri其实最后是不需要服务名称的,这个位置其实只需要指定的localhost:9003即可

修改配置uri中的/nacos-provider去掉

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
      routes:  # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: http://localhost:9003 # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/** # 断言,路径相匹配进行路由

启动Nacos、9003和9999网关,通过网关访问9003的/lwz/get接口

依然是可以访问

Spring Cloud Gateway

自动路由规则

GateWay还提供了和Zuul类似的自动路由规则,具体配置如下:
1. discovery.locator.enabled: true #这个配置默认为false,但是如果为true,就是开启了通过serviceId转发到具体的服务实例。“localhost:9999/ServiceID/lwz/**”
2. 在配置好这些以后,我们可以直接通过服务名称来进行访问Nacos中注册的服务和对应的接口
3. 这个位置我们为了测试可以启动2个微服务9003、9004
4. GateWay在开启了自动路由以后,还自带负载均衡

测试:

9004和9003保持一致

启动Nacos、9003和9004和9999网关

http://localhost:9999/nacos-provider/lwz/get

Spring Cloud Gateway

Spring Cloud Gateway

在以上的配置中,其实是有问题的,问题在于当前的服务名称暴露,并且太过于灵活,那么如果想解决的话,其实我们可以进行手动配置

5.2、手动负载均衡

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/** 

lb://代表开启负载均衡

测试:

启动Nacos、9003和9004和9999网关

Spring Cloud Gateway

Spring Cloud Gateway

6、GateWay断言Predicate

每一个Predicate的使用,可以理解为:当满足条件后才会进行转发,如果是多个,那就是满足所有条件才会转发。

断言种类

1. After:匹配在指定日期时间之后发生的请求。
2. Before:匹配在指定日期之前发生的请求。
3. Between:需要指定两个日期参数,设定一个时间区间,匹配此时间区间内的请求。
4. Cookie:需要指定两个参数,分别为name和regexp(正则表达式),也可以理解Key和Value,匹配具有给定名称且其值与正则表达式匹配的Cookie。
5. Header:需要两个参数header和regexp(正则表达式),也可以理解为Key和Value,匹配请求携带信息。
6. Host:匹配当前请求是否来自于设置的主机。
7. Method:可以设置一个或多个参数,匹配HTTP请求,比如GET、POST
8. Path:匹配指定路径下的请求,可以是多个用逗号分隔
9. Query:需要指定一个或者多个参数,一个必须参数和一个可选的正则表达式,匹配请求中是否包含第一个参数,如果有两个参数,则匹配请求中第一个参数的值是否符合正则表达式。
10. RemoteAddr:匹配指定IP或IP段,符合条件转发。
11. Weight:需要两个参数group和weight(int),实现了路由权重功能,按照路由权重选择同一个分组中的路由

spring cloud gateway Route Predicate

常用断言演示

After

匹配在指定时间之后发生的请求,可以对应提前上线业务

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**
            - After=2023-06-17T23:43:56.904+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通过

获取当前时间

import java.time.ZonedDateTime;

public class DateTimeTest {
    public static void main(String[] args) {
        ZonedDateTime zonedDateTime = ZonedDateTime.now();//默认时区
        System.out.println(zonedDateTime);
    }
}

测试:

启动Nacos、9003和9004和9999网关,

After后时间为当前时间之前,请求OK

Spring Cloud Gateway

After后时间为当前时间之后,请求404

Spring Cloud Gateway

当这个After理解了以后,剩下的关于日期时间的设置Before、Between道理都是一样的,只不过是限定不同的日期时间区间.

Cookie

需要指定两个参数,分别为name和regexp(正则表达式),也可以理解Key和Value,匹配具有给定名称且其值与正则表达式匹配的Cookie。
简单理解就是路由规则会通过获取Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果匹配不上则不执行。
我们可以分为两种情况演示,Cookie匹配,Cookie不匹配

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**
#            - After=2023-06-17T23:43:56.904+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通过
            - Cookie=username,[a-z]+ # 匹配Cookie的key和value(正则表达式)

测试:

启动Nacos、9003和9004和9999网关,

通过postman来进行测试

http://localhost:9999/lwz/get

当Cookie匹配时:

Spring Cloud Gateway

Spring Cloud Gateway

Spring Cloud Gateway

Spring Cloud Gateway 

当Cookie不匹配时:

Spring Cloud Gateway

 Spring Cloud Gateway

Header

需要两个参数header和regexp(正则表达式),也可以理解为Key和Value,匹配请求携带信息。

实际上就是请求头携带的信息,官网给出的案例是X-Request-Id,那我们就用这个做实验

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**
#            - After=2023-06-17T23:43:56.904+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通过
#            - Cookie=username,[a-z]+ # 匹配Cookie的key和value(正则表达式)
            - Header=X-Request-Id, \d+

测试:

启动Nacos、9003和9004和9999网关,

通过postman来进行测试

匹配

Spring Cloud Gateway

不匹配

Spring Cloud Gateway

Host

匹配当前请求是否来自于设置的主机。

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**
#            - After=2023-06-17T23:43:56.904+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通过
#            - Cookie=username,[a-z]+ # 匹配Cookie的key和value(正则表达式)
#            - Header=X-Request-Id, \d+
            - Host=**.lwz.cn #匹配当前的主机地址发出的请求

测试:

启动Nacos、9003和9004和9999网关,

通过postman来进行测试

匹配

Spring Cloud Gateway

不匹配

Spring Cloud Gateway

Method

可以设置一个或多个参数,匹配HTTP请求,比如GET、POST

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**
#            - After=2023-06-17T23:43:56.904+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通过
#            - Cookie=username,[a-z]+ # 匹配Cookie的key和value(正则表达式)
#            - Header=X-Request-Id, \d+
#            - Host=**.lwz.cn #匹配当前的主机地址发出的请求
            - Method=GET,POST # 匹配GET请求或者POST请求

Query

需要指定一个或者多个参数,一个必须参数和一个可选的正则表达式,匹配请求中是否包含第一个参数,如果有两个参数,则匹配请求中第一个参数的值是否符合正则表达式。

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**
#            - After=2023-06-17T23:43:56.904+08:00[Asia/Shanghai] # 在这个时间之后的请求都能通过
#            - Cookie=username,[a-z]+ # 匹配Cookie的key和value(正则表达式)
#            - Header=X-Request-Id, \d+
#            - Host=**.lwz.cn #匹配当前的主机地址发出的请求
#            - Method=GET,POST # 匹配GET请求或者POST请求
            - Query=id,.+ # 匹配请求参数,这里如果需要匹配多个参数,可以写多个Query

测试:

启动Nacos、9003和9004和9999网关,

通过postman来进行测试

Spring Cloud Gateway

Weight

需要两个参数group和weight(int),实现了路由权重功能,按照路由权重选择同一个分组中的路由

官网提供的演示yml

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

该路由会将约 80% 的流量转发到[weighthigh.org](https://weighthigh.org/),将约 20% 的流量[转发](https://weighlow.org/)到[weightlow.org](https://weighlow.org/)

Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。

7、GateWay的Filter

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。

内置Filter

1. GateWay内置的Filter生命周期为两种:pre(业务逻辑之前)、post(业务逻辑之后)
2. GateWay本身自带的Filter分为两种: GateWayFilter(单一)、GlobalFilter(全局)

spring cloud gateway filters

StripPrefix

该StripPrefix有一个参数,parts。该parts参数指示在将请求发送到下游之前要从请求中剥离的路径中的部分数。

具体演示

9003微服务上加一个context-path配置

server:
  port: 9003
  servlet:
    context-path: /nacos-provider

现在9003的访问路径变为http://localhost:9003/nacos-provider/lwz/get

目前的网关9999配置信息为

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: false #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**

为了保证断言能够匹配,此时通过网关的访问地址应该改为:http://localhost:9999/lwz/nacos-provider/lwz/get,但是出现了404因为多了一层路径http://localhost:9003/lwz/nacos-provider/lwz/get

测试:

Spring Cloud Gateway

 Spring Cloud Gateway

 Spring Cloud Gateway

 Spring Cloud Gateway

那么如果想要解决,我们应该在转发的时候去地址中最前面的/lwz,所以我们就需要使用FIlter:StripPrefix

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: false #开启自动路由功能(此时可以关闭)
      routes: # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址
          predicates: # 断言
            - Path=/lwz/**
          filters:
            - StripPrefix=1 # 去掉地址中的第一部分
          # http://localhost:9999/lwz/nacos-provider/lwz/get
          # http://localhost:9999/nacos-provider/lwz/get

测试:

成功转发

Spring Cloud Gateway

自定义Filter

要实现GateWay自定义过滤器,那么我们需要实现两个接口GlobalFilter、Ordered

具体演示

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.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

@Component
@Slf4j
public class MyFilter implements Ordered, GlobalFilter {
    /**
     * @param exchange 可以拿到对应的request和response
     * @param chain 过滤器链
     * @return 是否放行
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        log.info("*************MyFilter:"+new Date());
        if(username == null){
            log.info("**********用户名为null,非法用户,请求被拒绝!");
            //如果username为空,返回状态码为406,不可接受的请求
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    /**
     * 加载过滤器的顺序
     * @return 整数数字越小优先级越高
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

测试,此时我们的逻辑是在访问同时要传入username参数同时不能为空,否则不会放行本次请求。

传入正确参数:

Spring Cloud Gateway

 未传入正确参数:

Spring Cloud Gateway

2023-06-18 00:20:31.277  INFO 8096 --- [ctor-http-nio-2] com.lwz.springcloud9999.config.MyFilter  : *************MyFilter:Sun Jun 18 00:20:31 CST 2023
2023-06-18 00:20:31.277  INFO 8096 --- [ctor-http-nio-2] com.lwz.springcloud9999.config.MyFilter  : **********用户名为null,非法用户,请求被拒绝!

Spring Cloud Alibaba - Sentinel(一)

Spring Cloud Alibaba - Nacos

是日已过,命亦随减;如少水鱼,斯有何乐;当勤精进,如救头燃;但念无常,慎勿放逸;文章来源地址https://www.toymoban.com/news/detail-499988.html

到了这里,关于Spring Cloud Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud第二季--服务网关Gateway

    Spring Cloud Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。 Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了 Netty 通讯框架。Spring Cloud Gateway能干嘛呢? Gateway是原zuul1.x版的替代。 Spring Cloud Gateway 与 Zuul的区别: Zuu

    2024年02月03日
    浏览(52)
  • Spring Cloud之API网关(Gateway)

    目录 API网关 好处 解决方案 Gateway 简介 特征 核心概念 Route(路由) Predicate(断言) Filter(过滤器) 工作流程 Route(路由) 路由配置方式 1.yml配置文件路由 2.bean进行配置 3.动态路由 动态路由 Predicate(断言) 特点 常见断言 示例 Filter(过滤器) filter分类 Pre 类型 Post 类型 网关过滤器 格式

    2024年02月08日
    浏览(52)
  • spring cloud gateway网关和链路监控

    文章目录 目录 文章目录 前言 一、网关 1.1 gateway介绍 1.2 如何使用gateway  1.3 网关优化 1.4自定义断言和过滤器 1.4.1 自定义断言 二、Sleuth--链路追踪 2.1 链路追踪介绍 2.2 Sleuth介绍 2.3 使用 2.4 Zipkin的集成  2.5 使用可视化zipkin来监控微服务 总结 所谓的API网关,就是指系统的 统

    2024年02月02日
    浏览(39)
  • 【Spring Cloud Alibaba】8.路由网关(Gateway)

    接下来对服务消费者添加路由网关来实现统一访问接口,本操作先要完成之前的步骤,详情请参照【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0 , Spring Boot 2.0 和 Project Reactor 等技术开发的网关,该项目提供了一个库,用于在 Spring W

    2023年04月24日
    浏览(40)
  • Spring Cloud Gateway 网关实现白名单功能

    1 摘要 对于微服务后台而言,网关层作为所有网络请求的入口。一般基于安全考虑,会在网关层做权限认证,但是对于一些例如登录、注册等接口以及一些资源数据,这些是不需要有认证信息,因此需要在网关层设计一个白名单的功能。本文将基于 Spring Cloud Gateway 2.X 实现白

    2023年04月08日
    浏览(43)
  • Spring Cloud GateWay 网关的相关面试题

    Spring Cloud GateWay如何实现限流? 1.Spring Cloud GateWay使用令牌桶算法实现限流(Nginx使用漏桶算法实现限流 ) 2.Spring Cloud GateWay默认使用Redis 的RateLimter限流算法来实现,所以需要引入Redis依赖 3.使用的过程中,主要配置 令牌桶填充的速率,令牌桶容量,指定限流的key 4.限流的Ke

    2024年02月13日
    浏览(55)
  • Spring Cloud Alibaba 系列之 Gateway(网关)

    网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul1.0。相比 Zuul 来说,Spring Cloud  Gateway 提供更优秀的性能,更强大的有功能。 Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的

    2024年02月10日
    浏览(46)
  • 微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点

    在routes路由规则中,根据path去匹配,如果匹配中,就使用对应的路由规则进行请求转发 如果无法从routes中匹配,则根据path用“/”去截取第一段作为服务名进行请求转发,转发时,默认将第一段截取调 如果截取的服务名不在注册中心中存在服务,则报错404 在routes路由规则中

    2024年02月07日
    浏览(67)
  • Gateway网关组件(在Spring Cloud整合Gateway(idea19版本))

            Spring Cloud Gateway官网:Spring Cloud Gateway         局域网中就有网关这个概念,局域网接收数据或发送数据都要通过网关,比如使用VMware虚拟机软件搭建虚拟机集群的时候,往往我们需要选择IP段中的⼀个IP作为网关地址,网关可以对请求进行控制,提升我们系统的安

    2024年02月16日
    浏览(45)
  • 【深入解析spring cloud gateway】02 网关路由断言

    断言是路由配置的一部分,当断言条件满足,即执行Filter的逻辑,如下例所示 当请求路径满足条件/red/,即添加头信息:X-Request-Red,value为Blue-{segment},segment是路径里面带的信息。 gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分 Route(路由) 路由是网关

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包