gateway

文章目录

gateway能做什么

springcloud官方网关框架,对外暴露一个统一的API接口,客户端仅需与API网关交互,而无需直接调用后端的各个微服务,提高系统的安全性,可以实现一些和业务逻辑无关的公共逻辑,如负载均衡、限流与熔断、认证和授权、数据加密、路由转发等。

  • Spring Cloud Gateway功能特征
    • 动态路由:能够匹配任何请求属性:
    • 支持路径重写;
    • 集成Spring Cloud服务发现功能(Nacos、Eruka);
    • 可集成流控降级功能(Sentinel、.Hystriⅸ);
    • 可以对路由指定易于编写的Predicate(断言)和Filter(过滤器);

Gateway

  • 目录
  • gateway配置文件
yaml 复制代码
spring:
  application:
    name: gateway
  cloud:
    # gateway 配置
    gateway:
      # 路由配置
      routes:
        - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
          uri: http://localhost:8081 # order服务的ip:端口
          predicates:
            - Path=/order-server/** # 断言,路径匹配,
            # 访问      http://localhost:80/order-server/order/login   匹配了order-route的断言规则
            # 实际转发到 http://localhost:8081/order-server/order/login
          filters:
            - StripPrefix=1   # 从请求的路径中移除第一个层级的路径前缀 移除后 http://localhost:8081/order/login
        - id: user-route	# 路由到user服务
          uri: http://localhost:8082
          predicates:
            - Path=/user-server/**
          filters:
            - StripPrefix=1

server:
  port: 80

启动项目,通过网关访问order的接口成功

  • routes:路由配置
    routres的属性如下

Gateway+Nacos

如果服务路径写死在yml中,维护起来很麻烦,现在通过nacos访问

  • 引入nacos依赖
xml 复制代码
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 加入nacos配置
yaml 复制代码
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848		//nacos没有配置鉴权,所以只有ip、端口
  • 修改gateway配置
yaml 复制代码
    # gateway 配置
    gateway:
      # 路由配置
      routes:
        - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
          uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
          predicates:
            - Path=/order-server/** # 断言,路径匹配,
            # 访问      http://localhost:80/order-server/order/login   匹配了order-route的断言规则
            # 实际转发到 http://localhost:8081/order-server/order/login
          filters:
            - StripPrefix=1   # 从请求的路径中移除第一个层级的路径前缀 移除后 http://localhost:8081/order/login
        - id: user-route
          uri: lb://user-service
          predicates:
            - Path=/user-server/**
          filters:
            - StripPrefix=1

uri原本是写死的 http://localhost:8081/order-server/order/login,现在改成了注册到nacos的服务名,例如lb://order-server

然后访问http://127.0.0.1/user-server/user/login

引入依赖

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com</groupId>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>
    <description>gateway</description>

    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2023.0.3</spring-cloud.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- nacos依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2022.0.0.0</version>
        </dependency>
        <!-- 网关依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- 负载依赖,不加的话,通过注册中心访问uri: lb://stock-server,会报503, Service Unavailable-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>4.0.1</version>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件

路由断言工厂配置

作用:当请求gatewayl的时候,使用断言对请求进行匹配,如果匹配成功就路由转发,如果匹配失败就返回404

类型:内置,自定义

官方提供的路由断言工厂

  • 基于datetime的类型的断言工厂

    此关型的断言根据时间做判断,格式是带有时区信息和区域信息的时间,主要有三个:

    AfterRoutePredicateFactory::接收一个日期参数,判断请求日期是否晚于指定日期

    BeforeRoutePredicateFactory:接收一个日期参数,判断请求日期是否早于指定日期

    BetweenRoutePredicateFactory:接收两个日期参数,判断请求日期是否在指定时间段内

    ZonedDateTime.now()可以输出这个时间格式

    • 断言两个条件,匹配路径/order/**和时间在2025-02-23T15:36:55.211971500+08:00[Asia/Shanghai]之后的请求。

      yaml 复制代码
       routes:
          - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
            uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
            predicates:
              - Path=/order/** # 断言,路径匹配,
              # 访问      http://localhost:80/order/login   匹配了order-route的断言规则
              # 实际转发到 http://localhost:8081/order/login
              - After=2025-02-23T15:36:55.211971500+08:00[Asia/Shanghai]
  • 基于Header的断言工厂

    HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。判断请求Header是否具有给定名称且值与正则表达式匹配。

    • 判断Header中是否包含X-Request-Id,并且值是数字

      yaml 复制代码
      routes:
      - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
        uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
        predicates:
          - Path=/order/** # 断言,路径匹配,
          # 访问      http://localhost:80/order/login   匹配了order-route的断言规则
          # 实际转发到 http://localhost:8081/order/login
          - After=2025-02-23T15:36:55.211971500+08:00[Asia/Shanghai]
          - Header=X-Request-Id,\d+
  • 基于Method请求方法的断言工厂

    MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。

    • 判断请求是否GET请求

      yaml 复制代码
      routes:
         - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
           uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
           predicates:
             - Path=/order/** # 断言,路径匹配,
             # 访问      http://localhost:80/order/login   匹配了order-route的断言规则
             # 实际转发到 http://localhost:8081/order/login
             - After=2025-02-23T15:36:55.211971500+08:00[Asia/Shanghai]
             - Header=X-Request-Id,\d+
             - Method=GET
  • 基于Quey请求参数的断言工厂

    QueryRoutePredicateFactory:接收两个参数,请求param和正则表达式,判断请求参数是否具有给定名称且值与正则表达式匹配.

    • 判断Query参数中是否有name参数,name的值不限制,

    • 如果是Query=name,z|w,那么,name值必须是z或者w

      yaml 复制代码
       routes:
           - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
             uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
             predicates:
               - Path=/order/** # 断言,路径匹配,
               # 访问      http://localhost:80/order/login   匹配了order-route的断言规则
               # 实际转发到 http://localhost:8081/order/login
               - After=2025-02-23T15:36:55.211971500+08:00[Asia/Shanghai]
               - Header=X-Request-Id,\d+
               - Method=GET
               - Query=name
  • 基于路由权重的断言工厂

    WeightRoutePredicateFactory:接收一个组名,权重,然后对于同一个组内的路由按照权重转发,权重大的分配到的几率大

    yaml 复制代码
    routes
    	-id:weight_routel
    		uri:host1
    		predicates:
    			-Path=/product/**
    			-Weight=group3,1
    	-id:weight_route2
    		uri:host2
    		predicates:
    			-Path=/product/**
    			-Weight=group3,9
  • 常用的官方提供的断言工厂

属性名称 作用 说明 示例配置
Path 根据请求的路径进行匹配 匹配请求的 URI 路径。支持简单的路径匹配和通配符匹配。 predicates: - Path=/api/**
Method 根据请求的方法(GET, POST, PUT, DELETE 等)进行匹配 匹配请求的 HTTP 方法。 predicates: - Method=GET
Host 根据请求的 Host 头部进行匹配 匹配请求的 Host 名称。 predicates: - Host=*.example.com
Header 根据请求的特定头部进行匹配 匹配请求的头部信息。可以匹配单个头部,也可以使用条件进行匹配。 predicates: - Header=X-Auth-Token, my-token
Query 根据请求的查询参数进行匹配 匹配请求 URL 中的查询参数。 predicates: - Query=apiKey=12345
Cookie 根据请求中的 Cookie 进行匹配 匹配请求的 Cookie。 predicates: - Cookie=session, abc123
Accept 根据请求的 Accept 头部进行匹配 匹配请求中的 Accept 头部(指定响应的媒体类型)。 predicates: - Accept=application/json
ContentType 根据请求的 Content-Type 头部进行匹配 匹配请求中的 Content-Type 头部(指定请求的媒体类型)。 predicates: - ContentType=application/json
AcceptLanguage 根据请求的 Accept-Language 头部进行匹配 匹配请求中的 Accept-Language 头部(指定请求的语言)。 predicates: - AcceptLanguage=en-US
Weight 根据请求的权重进行匹配(用于负载均衡) 匹配请求的权重。 predicates: - Weight=10
Time 根据请求的时间范围进行匹配(用于定时任务) 匹配请求的时间范围。 predicates: - Time=10:00-18:00
RemoteAddr 根据请求的远程地址进行匹配 匹配请求发起者的 IP 地址(支持正则)。 predicates: - RemoteAddr=192.168.1.*
PathPattern 使用正则表达式匹配路径 匹配符合正则表达式的路径。

路由断言工厂官方地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

自定义的路由断言工厂

仿照官方的路由断言工厂,可以查看Query的,找到QueryRoutePredicateFactory

  1. 必须交给spring管理
  2. 命名必须以RoutePredicateFactory结尾
  3. 继承AbstractRoutePredicateFactory<Config>
  4. 必须实现Config静态内部类,用来接收配置文件中的断言对应的信息
  5. 结合shortcutFieldOrder进行绑定
  6. 通过apply进行逻辑判断,true成功,false失败
  • 自定义
java 复制代码
package com.wzw.predicates;

import lombok.Data;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 自定义断言
 */
@Component
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {

    public CheckAuthRoutePredicateFactory() {
        super(CheckAuthRoutePredicateFactory.Config.class);
    }

    public List<String> shortcutFieldOrder() {
        //跟config中的属性保持一致
        return Arrays.asList("name");
    }

    public Predicate<ServerWebExchange> apply(final CheckAuthRoutePredicateFactory.Config config) {
        return new GatewayPredicate() {
            public boolean test(ServerWebExchange exchange) {
            	//如果name是zs,放行
                if(config.getName().equals("zs")){
                    return true;
                }
                return false;
            }
        };
    }

    /**
     * 用于接收配置文件中的断言的信息
     */
    @Data
    public static class Config {
        private String name;
    }
}
  • 配置文件
yaml 复制代码
      routes:
        - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
          uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
          predicates:
            - Path=/order/** # 断言,路径匹配,
            - CheckAuth=zs		# zs是name的值

过滤器工厂配置

针对某一个路由进行过滤,需要在配置文件中配置

过滤器官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

  • AddRequestHeader

    • 请求头添加X-Request-type,值为app
    yaml 复制代码
        # gateway 配置
        gateway:
          # 路由配置
          routes:
            - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
              uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
              predicates:
                - Path=/order/** # 断言,路径匹配,
              filters:
                - AddRequestHeader=X-Request-type,app #请求头添加`X-Request-type`,值为`app`
            - id: user-route
              uri: lb://user-service
              predicates:
                - Path=/user-server/**
    • 输出一下
    java 复制代码
        @GetMapping("/login")
        public String login(@RequestHeader("X-Request-type")String type){
            System.out.println(LocalDateTime.now());
            return "order login,type:"+type;
        }
  • AddRequestParameter

    • 添加请求参数param,值zhangsan
    yaml 复制代码
        # gateway 配置
        gateway:
          # 路由配置
          routes:
            - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
              uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
              predicates:
                - Path=/order/** # 断言,路径匹配,
              filters:
                - AddRequestParameter=param,zhangsan
    • 输出一下
    java 复制代码
        @GetMapping("/login")
        public String login(@RequestParam("param") String param){
            System.out.println(LocalDateTime.now());
            return "order login,param:"+param;
        }
  • 为统一的路由添加统一前缀
    order服务的实际访问路径http://127.0.0.1:8081/order-server/order/login
    gateway的路由配置

    yaml 复制代码
        # gateway 配置
        gateway:
          # 路由配置
          routes:
            - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
              uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
              predicates:
                - Path=/order/** # 断言,路径匹配,
              filters:
                - PrefixPath=/order-server

    访问路径http://127.0.0.1:80/order/login,匹配了路由,gateway给http://127.0.0.1:80/order/login加入了前缀/order-server,实际访问的路径就是http://127.0.0.1:8081/order-server/order/login

  • 重定向
    重定向到百度

groovy 复制代码
      routes:
        - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
          uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
          predicates:
            - Path=/order/** # 断言,路径匹配,
          filters:
            - RedirectTo=302,https://www.baidu.com

访问http://localhost/order/login,将会跳转到https://www.baidu.com

  • SetStatus修改状态码
    只是修改返回的状态码,对实际的代码执行返回值没有影响
groovy 复制代码
      routes:
        - id: order-route # 路由id,路由到order服务,没有固定规则,但需要保证路由唯一
          uri: lb://order-server # 路由地址,lb 开头表示负载均衡,
          predicates:
            - Path=/order/** # 断言,路径匹配,
          filters:
            - SetStatus=500

虽然返回500,但是还是成功拿到返回值

常见的官方提供的过滤器

属性名称 作用 说明 示例配置
AddRequestHeader 向请求添加头信息 可以在请求中添加自定义请求头。 filters: - AddRequestHeader=X-Auth-Token, my-token
AddResponseHeader 向响应添加头信息 可以在响应中添加自定义响应头。 filters: - AddResponseHeader=X-Response-Header, my-response-value
RemoveRequestHeader 移除请求头 删除请求中的指定头信息。 filters: - RemoveRequestHeader=X-Old-Header
RemoveResponseHeader 移除响应头 删除响应中的指定头信息。 filters: - RemoveResponseHeader=X-Old-Response-Header
SetPath 修改请求的路径 重写请求的路径,通常用于路由转发时修改目标路径。 filters: - SetPath=/new/path/{segment}
RewritePath 重写请求路径 使用正则表达式修改请求的路径。 filters: - RewritePath=/old/path/(?<segment>.*), /new/path/${segment}
PrefixPath 在请求路径前添加前缀 在请求路径前加上指定的前缀。 filters: - PrefixPath=/api
RequestRateLimiter 限流功能 限制请求的速率,例如设置每秒最大请求数。 filters: - RequestRateLimiter=redisRateLimiter=2,1
CircuitBreaker 熔断功能 配置熔断器,控制请求的处理流程。 filters: - CircuitBreaker=name=myCircuitBreaker, fallbackUri=/fallback
AddRequestParameter 向请求中添加查询参数 向请求的 URL 中添加查询参数。 filters: - AddRequestParameter=apiKey, 12345
SetRequestHeader 设置请求头 设置请求的自定义头信息。 filters: - SetRequestHeader=X-API-Key, my-api-key
SetStatus 设置响应状态码 设置请求处理后的响应状态码。 filters: - SetStatus=200
Retry 重试功能 配置请求的重试机制,例如重试次数、重试间隔。 filters: - Retry=3,1000
PreserveHost 保持请求中的原始 Host 信息 在转发请求时保留原始的 Host 信息。 filters: - PreserveHost
RedirectTo 重定向功能 配置请求的重定向,通常用于将请求重定向到其他 URL。 filters: - RedirectTo=301, https://example.com
AddCookie 向响应中添加 Cookie 在响应中添加一个 Cookie。 filters: - AddCookie=SESSIONID, 12345
RemoveCookie 移除响应中的 Cookie 从响应中删除指定的 Cookie。 filters: - RemoveCookie=SESSIONID
Delay 延迟请求的处理 延迟处理请求的时间,通常用于模拟延迟。

自定义过滤器工厂

同样仿照官方的过滤器,以RedirectTo重定向为例,改成一个是否携带name参数,

如果没带name参数,直接放行,

如果带了name参数,并且和配置文件中的值一样,就放行,

如果带了name参数,但是和配置文件中的值不一样,就404
http://localhost/order/login?name=zhangsan

java 复制代码
package com.wzw.filters;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component
public class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {

    public CheckAuthGatewayFilterFactory() {
        super(CheckAuthGatewayFilterFactory.Config.class);
    }

    public List<String> shortcutFieldOrder() {
        return Arrays.asList("value");
    }

    public GatewayFilter apply(CheckAuthGatewayFilterFactory.Config config) {
        return (GatewayFilter) (exchange, chain) -> {
            String name=exchange.getRequest().getQueryParams().getFirst("name");

            //获取name参数,
            if(StringUtils.isNotBlank(name)){
                if(name.equals(config.getValue())){
                    return chain.filter(exchange);
                }else{  //如果!=value,则拦截
                    exchange.getResponse().setRawStatusCode(HttpStatus.SC_NOT_FOUND);
                    return exchange.getResponse().setComplete();
                }
            }
            //否则正常访问

            return chain.filter(exchange);

        };
    }

    @Data
    public static class Config {
        private String value;

    }
}

全局过滤器

针对所有的路由过滤,一旦定义直接生效

打开请求日志

启动项目的时候加上参数-Dreactor.netty.http.server.accessLogEnabled=true

gateway统一配置跨域

  • 通过配置文件的方式

    CORS 只对浏览器有效,浏览器会根据同源策略限制不同源的请求,如果是通过 Postman 等工具发送请求,通常 CORS 配置不会生效,除非手动添加了一个头部Origin。

    yaml 复制代码
    	spring:
    	  cloud:
    	    gateway:
    	      globalcors:
    	        cors-configurations:
    	          '[/**]': # 通配符,表示对所有的路由路径(/**)应用此配置
    	            allowedOrigins: "*"  # 允许访问的源(域名)
    	            allowedMethods:
    	              - GET  # 允许的 GET 方法,如果允许所有 HTTP 方法,可以使用 allowedMethods: "*"
    • /\*\*\] 表示对所有请求路径都适用相同的跨域规则 * allowedOrigins * 指定哪些外部域名可以发送跨域请求到你的服务 ```yaml allowedOrigins: - "https://docs.spring.io" - "https://another-domain.com" ``` * 允许所有的源进行跨域请求,`allowedOrigins: "*"` * allowedMethods * 可以添加一项或者多项 ```yaml allowedMethods: - GET - POST - PUT - DELETE ```

  • 通过bean的方式

java 复制代码
package com.wzw.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

@Configuration
public class GatewayCorsConfig {

    @Bean
    public CorsWebFilter corsWebFilter() {
        // 创建一个 CORS 配置对象
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("http://example.com"); // 允许的源
        corsConfiguration.addAllowedMethod("*"); // 允许的 HTTP 方法
        corsConfiguration.addAllowedHeader("*"); // 允许的请求头
        corsConfiguration.setAllowCredentials(true); // 是否允许携带凭证(cookies)

        // 设置源和配置
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration); // 配置全局路径的 CORS 策略

        // 创建并返回 CorsWebFilter 过滤器
        return new CorsWebFilter(source);
    }
}

自定义全局过滤器

通过 @Component 注解和 GlobalFilter 接口实现,输出请求路径

java 复制代码
package com.wzw.filters;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
@Slf4j
public class LoginFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info(exchange.getRequest().getPath().value());
        return chain.filter(exchange);
    }
}

全局过滤器和路由过滤器区别

特点 全局过滤器 路由过滤器
适用范围 适用于所有路由 仅适用于特定的路由
配置位置 通过 @Component 注解和 GlobalFilter 接口实现 application.ymlapplication.properties 配置路由
执行顺序 在所有路由之前和之后执行 仅在路由匹配时执行
常见用途 身份验证、日志记录、全局限流等 路由相关的特定处理,例如修改请求头、路径重写等

其它

Service Unavailable

报错503

java 复制代码
{
  "timestamp": "2024-11-10T08:16:05.013+00:00",
  "path": "/zs/stock",
  "status": 503,
  "error": "Service Unavailable",
  "requestId": "f84c8477-2"
}

解决;

gateway子项目中添加依赖

xml 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>4.0.1</version>
        </dependency>

gateway整合sentinel流控降级

可以针对不同路由限流,针对不同接口限流

  1. 引入依赖
xml 复制代码
<!-- sentinel整合gateway -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
    <version>2023.0.1.2</version>
</dependency>


<!-- sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2023.0.1.2</version>
</dependency>
  1. 配置文件
    是配置在业务模块,不是配置在gateway模块
yaml 复制代码
spring:
  cloud:
    # sentinel 配置
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
相关推荐
.生产的驴21 分钟前
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
java·开发语言·spring boot·后端·前端框架
Howard_Stark25 分钟前
Spring的BeanFactory和FactoryBean的区别
java·后端·spring
饮长安千年月25 分钟前
学生管理系统审计
java·网络安全·代码审计
-曾牛34 分钟前
Spring Boot中@RequestParam、@RequestBody、@PathVariable的区别与使用
java·spring boot·后端·intellij-idea·注解·spring boot 注解·混淆用法
新时代苦力工1 小时前
处理对象集合,输出Map<String, Map<String, List<MyObject>>>格式数据,无序组合键处理方法
java·数据结构·list
niesiyuan0001 小时前
MAC如何安装多版本jdk(以8,11,17为例)
java
zcyf08091 小时前
kafka理论学习汇总
java·分布式·学习·kafka
再拼一次吧1 小时前
Spring进阶篇
java·后端·spring
爱编程的小庄2 小时前
Maven 4.0.0 模式-pom.xml配置详解
xml·java·maven
黄雪超2 小时前
JVM——引入
java·jvm