Spring cloud gateway 详解

一、gateway网关的作用

1.身份认证,权限校验

2.路由转发,负载均衡

3.对用户请求做限流

二、创建gateway项目并且实现网关路由转发功能

1.新建model

2.引入依赖

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

3.编写yml配置文件

端口、注册naocs、gateway配置

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8845
    gateway:
      routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**

 4.图解

三、路由断言工厂(PredicateFactory)

1.路由断言工厂的作用

解析yml中写的Predicate字符串,转化为判断条件

2.11种路由断言工厂

a.11种断言的使用方法:

请转到这里查看=======>11种路由断言工厂-CSDN博客

3.思考题

 四、路由的过滤器配置

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

 1.过滤器种类

官方提供了三十多种过滤器,我们可以在需要时查看,部分过滤器如下:

2.流量染色

通过过滤器可以实现多种功能,例如流量染色,判断请求是否来源于gateway,如果不是gateway转发,将抛出异常。

实现:

application.yml:

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8845
    gateway:
      routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
          filters:
            - AddRequestHeader=passGateway, true

UserController.java

   @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id,
                          @RequestHeader(value = "PassGateway", required = false) boolean passGateway) {
        if (!passGateway) {
            throw new RuntimeException("passGateway is false");
        }
        System.out.println(passGateway);
        return userService.queryById(id);
    }
}

如果不经过gateway则抛出异常:

java.lang.RuntimeException: passGateway is false
	at cn.itcast.user.web.UserController.queryById(UserController.java:45) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~

3.default-filters

给所有的路由请求请求加上过滤器:

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8845
    gateway:
      routes:
        - id: user-service
          uri: lb://userservice
          predicates:
            - Path=/user/**
#          filters:
#            - AddRequestHeader=passGateway, true
      default-filters:
        - AddRequestHeader=passGateway, true

五、全局过滤器(GlobalFilter)

1.实现全局过滤器

通过实现GlobalFilter接口,并且实现其中的filter方法即可定义全局过滤器

filter方法参数讲解:

 @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return null;
    }

2.ServerWebExchange

接口包含以下重要方法:

  1. getRequest():获取当前的HTTP请求对象。
  2. getResponse():获取当前的HTTP响应对象。
  3. getAttributes():获取与当前请求关联的属性map,可以用于在请求处理过程中共享数据。
  4. getFormData():获取表单数据,返回一个Mono<MultiValueMap<String, String>>对象,可以使用flatMap操作符来处理表单数据。
  5. mutate():创建一个新的ServerWebExchange实例,可以对请求和响应进行修改。
  6. getSession():获取当前的会话对象,返回一个Mono<WebSession>对象,可以用于管理用户会话状态。

3.GatewayFilterChain

GatewayFilterChain是 Spring Cloud Gateway 中的一个接口,用于定义一系列的过滤器链。在请求进入网关后,会经过一系列的过滤器对请求进行处理和转换,然后再转发到后端服务。

GatewayFilterChain接口定义了一个 filter方法,调用该filter方法表示放行。

chain.filter(exchange);

 六、过滤器链执行顺序

1.三种过滤器的处理

gateway中有三种过滤器:Default过滤器、路由过滤器、全局过滤器

Default过滤器和路由过滤器回通过AddRequestHeaderGatrewayFilterFactory这个工厂类转化为GatewayFilter类型的拦截器

【注】AddRequestHeaderGatrewayFilterFactory不是所有的Default过滤器和路由过滤器都是这个工厂类处理,而是对应filter配置文件中写的过滤器对应的工厂类。

全局过滤器会通过GatewayFilterAdapter类转换成GatewayFilter类型的类

2.执行顺序

七、网关的cors跨域配置

跨域问题:浏览器禁止请求的发起者与服务端发生跨域的Ajax请求

解决方案:

      globalcors:
        add-to-simple-url-handler-mapping: true
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许跨域访问的地址
              - "http://localhost:8080"
              - "www.baidu.com"
            allowedMethods: # 允许跨域访问的请求方式
              - "GET"
              - "POST"
              - "PUT"
              - "DELETE"
            allowedHeaders: # 允许请求头中携带的字段
              - "*"
            allowCredentials: true #是否允许携带cookies
            exposedHeaders: # 允许跨域访问的响应头
              - "*"
            maxAge: 3600

踩坑日志:网关配置跨域之后,如果每个服务重新配置跨域,例如使用@CrossOrign注解,会导致出错

Spring Cloud Gateway是一个基于Spring Cloud的微服务网关,用于构建高效、可靠的微服务架构。它提供了一种简单而强大的方式来路由、过滤和转换请求,帮助开发者构建弹性、可扩展的微服务应用。 Spring Cloud Gateway的功能和工作原理可以通过以下几点来详解: 1. 网关功能:Spring Cloud Gateway作为一个API网关,具有路由、过滤和转发请求的功能。它可以根据请求的URL、请求头、请求参数等信息,将请求转发到不同的微服务实例上。 2. 网关路由:Spring Cloud Gateway支持基于路由规则的请求转发。开发者可以通过配置路由规则,将特定的请求路径映射到相应的微服务实例上。这样可以实现负载均衡、服务发现等功能。 3. 网关过滤:Spring Cloud Gateway支持请求过滤器,可以在请求到达网关之前或之后对请求进行一系列操作。开发者可以根据需要添加自定义的过滤器,实现请求认证、请求转换、请求限流等功能。 4. 响应式框架:Spring Cloud Gateway基于Spring WebFlux框架,采用异步非阻塞的方式处理请求。这使得网关在高并发场景下具备更好的性能和吞吐量。 总之,Spring Cloud Gateway是一个功能强大的微服务网关,可以作为微服务架构的入口,实现请求的路由、过滤和转发。它采用响应式框架来处理请求,具备高并发和可扩展性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【SpringCloudSpringCloud原理之Gateway网关](https://blog.csdn.net/twotwo22222/article/details/129428040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringCloud Gateway 详解](https://blog.csdn.net/m0_51111980/article/details/128022758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值