Spring Gateway 网关常见配置说明

前言

Spring Gateway 是基于 Spring Framework 的 API 网关,它为微服务架构提供了路由、监控、弹性以及安全性等功能。Spring Gateway 使用非阻塞 API 和高性能的反应式编程模型来提供服务。

版本说明

本文的选项在多个最近的 Spring Cloud Gateway 版本中都是有效的,比如 Spring Cloud 2020.0.x 至 2021.0.x 版本系列。与 Spring Boot 2.3.x 至 2.6.x 版本兼容。

基础配置

以下是一个完整的 Spring Gateway 配置示例,包含了常见的路由配置、过滤器使用、全局过滤器配置以及一些其他常用的设置。这些配置将在 application.yml 文件中进行设置:

spring:
  cloud:
    gateway:
      # 路由配置列表
      routes:
        # 第一条路由规则
        - id: route1
          uri: http://example.org
          predicates:
            - Path=/api/service1/**  # 路径匹配规则
          filters:
            - AddRequestHeader=X-Request-Foo, Bar  # 添加请求头

        # 第二条路由规则
        - id: route2
          uri: http://example.com
          predicates:
            - Path=/api/service2/**
            - Method=GET,POST  # 只允许 GET 和 POST 方法
          filters:
            - RewritePath=/api/service2/(?<segment>.*), /$\{segment}  # URL 重写

      # 全局过滤器配置
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin  # 去重HTTP响应头

      # 用于控制 HTTP 请求的负载均衡器配置
      loadbalancer:
        use404: true  # 当无可用服务时返回404

      # HTTP请求重试配置
      retry:
        enabled: true
        retries: 3  # 重试次数
        statuses: BAD_GATEWAY,GATEWAY_TIMEOUT  # 触发重试的HTTP状态码
        methods: GET,POST  # 允许重试的HTTP方法
        backoff:
          firstBackoff: 50ms  # 首次重试的延迟
          maxBackoff: 500ms  # 最大重试延迟
          factor: 2  # 延迟因子
          basedOnPreviousValue: false  # 延迟是否基于上一次的延迟时间

      # 跨域配置
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "*"  # 允许所有域
            allowedMethods: "*"  # 允许所有方法
            allowedHeaders: "*"  # 允许所有头
            allowCredentials: true  # 允许证书

# Spring 应用名称
spring:
  application:
    name: gateway-service

# 服务端口
server:
  port: 8080

# 日志配置
logging:
  level:
    org.springframework.cloud.gateway: DEBUG  # 设置Spring Gateway的日志级别为DEBUG

在这个示例中,配置了两条路由规则,每条规则都设置了特定的路径匹配和过滤器。还配置了全局的过滤器,用于去重响应头。另外还包含了负载均衡器配置、重试机制以及全局跨域资源共享(CORS)配置。

高级特性

Spring Cloud Gateway 提供了丰富的配置选项来支持各种高级功能,包括但不限于过滤器自定义、安全性增强、限流、WebSocket 支持和更复杂的路由条件。

1. 安全配置

如果你需要将 Spring Security 集成到 Spring Cloud Gateway 中,以增强 API 网关的安全性,你可以添加如下依赖并配置相应的安全规则:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然后,你可以配置基本的 HTTP 安全规则,如下所示:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/api/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}

2. 限流策略

限流可以帮助你控制对后端服务的请求频率,防止过载。Spring Cloud Gateway 可以通过集成 Redis 来实现请求的限流:

spring:
  cloud:
    gateway:
      routes:
        - id: route1
          uri: http://example.org
          predicates:
            - Path=/api/service1/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

3. WebSocket 支持

Spring Cloud Gateway 支持 WebSocket 代理,需要适当的路由配置:

spring:
  cloud:
    gateway:
      routes:
        - id: websocket_route
          uri: ws://example-websocket.org
          predicates:
            - Path=/echo

4. 动态路由

在一些场景下,你可能需要动态地添加或删除路由。这可以通过编程方式实现,比如使用 RouteDefinitionWriterApplicationEventPublisher

@Autowired
private RouteDefinitionWriter routeWriter;

@Autowired
private ApplicationEventPublisher publisher;

public void addRoute(RouteDefinition routeDefinition) {
    routeWriter.save(Mono.just(routeDefinition)).subscribe();
    this.publisher.publishEvent(new RefreshRoutesEvent(this));
}

5. 熔断器配置

Spring Cloud Gateway 集成了 Resilience4j 来提供熔断器支持,可以配置熔断规则来保护后端服务:

spring:
  cloud:
    gateway:
      routes:
        - id: route1
          uri: http://example.org
          filters:
            - name: CircuitBreaker
              args:
                name: backendService
                fallbackUri: forward:/fallback

6. 跟踪和日志记录

为了更好地监控和诊断网关流量,可以集成 Spring Cloud Sleuth 和 Zipkin 进行调用链跟踪。这可以帮助你详细了解请求如何通过你的网关和服务。首先需要添加 Sleuth 和 Zipkin 的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

配置 Zipkin 的服务地址:

spring:
  zipkin:
    baseUrl: http://localhost:9411
  sleuth:
    sampler:
      probability: 1.0  # 采样率

7. 参数化路由匹配

Spring Cloud Gateway 允许你根据请求参数、头信息等进行路由匹配。例如,你可以根据请求头中的版本号将流量路由到不同的后端服务:

spring:
  cloud:
    gateway:
      routes:
        - id: route1
          uri: http://example.org/v1
          predicates:
            - Path=/api/service
            - Header=X-API-Version, v1
        - id: route2
          uri: http://example.org/v2
          predicates:
            - Path=/api/service
            - Header=X-API-Version, v2

8. 环境特定配置

在不同的环境(开发、测试、生产)中,你可能需要不同的配置。Spring Cloud Gateway 允许你使用 Spring 的 profile 功能来定义环境特定的配置。例如,你可以为开发环境和生产环境定义不同的路由和过滤器配置:

---
spring:
  profiles: dev
  cloud:
    gateway:
      routes:
        - id: dev_route
          uri: http://dev.example.org
          predicates:
            - Path=/api/dev/**

---
spring:
  profiles: prod
  cloud:
    gateway:
      routes:
        - id: prod_route
          uri: http://prod.example.org
          predicates:
            - Path=/api/prod/**

9. 响应重写

在某些情况下,你可能需要修改从后端服务返回的响应。Spring Cloud Gateway 提供了过滤器来重写响应头和响应体:

spring:
  cloud:
    gateway:
      routes:
        - id: rewrite_response
          uri: http://example.org
          filters:
            - ModifyResponseBody=/path, ${{response.body}} Modified
            - ModifyResponseHeader=X-Response-Header, New-Header-Value

10. 自定义过滤器

如果预置的过滤器不能满足你的需求,你可以实现自己的过滤器。你可以继承 AbstractGatewayFilterFactory 类来创建自定义的过滤器逻辑:

public class MyCustomFilter extends AbstractGatewayFilterFactory<MyCustomFilter.Config> {
    public static class Config {
        // Put the configuration properties for your filter here
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            // custom pre-processing
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                // custom post-processing
            }));
        };
    }
}

继续探索 Spring Cloud Gateway 的高级配置,这些配置可以进一步增强你的网关的功能性和灵活性。以下是一些额外的配置选项和高级用法,它们可以帮助你更好地适应复杂的业务需求:

11. Hystrix 集成

虽然 Resilience4j 是现代的断路器选择,但如果你的项目还在使用 Hystrix,Spring Cloud Gateway 也支持与 Hystrix 的集成。你可以为特定路由添加 Hystrix 保护:

spring:
  cloud:
    gateway:
      routes:
        - id: hystrix_route
          uri: http://example.org
          filters:
            - name: Hystrix
              args:
                name: myCommand
                fallbackUri: forward:/fallback

12. 路由验证

在一些应用场景中,需要对请求进行额外的验证,比如检查请求中的 JWT 令牌。Spring Cloud Gateway 允许通过全局过滤器或路由特定过滤器来实现这一点:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("token_route", r -> r.path("/token/**")
            .filters(f -> f.filter(new AuthFilter()))
            .uri("http://example.org"))
        .build();
}

public class AuthFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 实现验证逻辑
        boolean isValid = checkAuthToken(exchange.getRequest());
        if (!isValid) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    private boolean checkAuthToken(ServerHttpRequest request) {
        // 验证逻辑
        return true; // 假设总是有效
    }
}

13. API 版本管理

你可以通过配置多个路由来支持不同版本的 API,以方便客户端调用最合适的服务版本:

spring:
  cloud:
    gateway:
      routes:
        - id: api_v1
          uri: http://example.org/v1
          predicates:
            - Path=/api/v1/**
        - id: api_v2
          uri: http://example.org/v2
          predicates:
            - Path=/api/v2/**

14. 更多动态路由配置

Spring Cloud Gateway 允许通过数据库或其他服务动态加载和更改路由配置。这可以通过自定义 RouteDefinitionLocator 实现:

@Bean
public RouteDefinitionLocator databaseRouteLocator() {
    return new DatabaseRouteDefinitionLocator();
}

public class DatabaseRouteDefinitionLocator implements RouteDefinitionLocator {
    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        // 从数据库加载路由定义
        return Flux.fromIterable(fetchRoutesFromDatabase());
    }

    private List<RouteDefinition> fetchRoutesFromDatabase() {
        // 数据库操作,返回路由定义列表
        return new ArrayList<>();
    }
}

15. 定制错误处理

你可以通过定义自己的 ErrorWebExceptionHandler 来定制网关在遇到错误时的行为:

@Bean
@Order(-1)  // 确保它比默认的错误处理器优先级高
public ErrorWebExceptionHandler myExceptionHandler() {
    return new JsonErrorWebExceptionHandler();
}

public class JsonErrorWebExceptionHandler implements ErrorWebExceptionHandler {
    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        exchange.getResponse().setStatusCode(HttpStatus.BAD_GATEWAY);
        // 设置响应体等
        return exchange.getResponse().writeWith(Mono.just(...));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/576480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ShardingSphere 5.x 系列【26】 数据分片原理之 SQL 路由

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 携带分片键2.1 直接路由2.2 标准路由2.3 笛卡尔路由3. 不携带分片…

BGP选路实验(锐捷)---Origin选路

实验拓扑图 基本配置如图所示 要求&#xff1a;R5上利用loopback口建立多个分段ip&#xff0c;利用bgp选路原则让双网段数据通过R6转发&#xff0c;单网段数据通过R7转发&#xff0c;通过修改Origin的属性类型为intcomplete&#xff08;利用三种不同的Origin属性的优先顺序&am…

投资标的参考

1、中央汇金投资有限责任公司 1.1、香港中央结算有限公司 2、中央汇金投资有限责任公司持股列表 _ 东方财富网_ 数据频道东方财富网提供十大流通股东数据、十大股东数据、股东持股明细、股东持股变动统计、股东持股分析、股东持股统计、股东协同等数据&#xff0c;充分展示股东…

SpringBoot+MyBatis-Plus+jsqlparser实现多租户功能

前言 多租户技术&#xff08;multi-tenancy technology&#xff09;是一种软件架构技术&#xff0c;它允许在单个系统实例上为多个用户或组织提供服务&#xff0c;同时确保这些用户之间数据的隔离性。在多租户架构中&#xff0c;每个租户&#xff08;可以是个人用户、企业、组…

python中开发页面的两种方法:Qt Designer(PyQt图形化界面拖拽开发App界面)以及Django(开发Web应用框架)

一、开发独立的窗口&#xff0c;App的那种&#xff0c;可使用tkinter或者PyQt 使用PyQt时&#xff0c;里面有个工具Qt Designer&#xff0c;是一个可视化的界面设计工具&#xff0c;可以通过拖拽等方式来设计界面。下面就是Qt Designer的操作界面&#xff1a; 参考链接如下&am…

代码随想录-算法训练营day24【回溯01:理论基础、组合】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第七章 回溯算法part01 今日内容&#xff1a;● 理论基础 ● 77. 组合 详细布置 理论基础 其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&a…

docker入门级命令

基本概念 docker的连个基本概念&#xff1a;镜像、容器。 docker镜像可以理解为是存储docker安装包的地方&#xff0c;比如&#xff1a;mcr.microsoft.com/mssql/server:2017-latest是sqlserver的docker镜像。 可以通过docker pull命令拉取远程镜像到本地。比如&#xff1a;…

【论文浅尝】Phi-3-mini:A Highly Capable Language Model Locally on Your Phone

Phi-3-mini phi-3-mini&#xff0c;一个3.8亿个参数的语言模型&#xff0c;训练了3.3万亿个token&#xff0c;其总体性能&#xff0c;通过学术基准和内部测试进行衡量&#xff0c;可以与Mixtral 8x7B和GPT-3.5等模型相媲美(在MMLU上达到69%&#xff0c;在MT-bench上达到8.38)&…

什么是云手机?云手机有什么用?

过去&#xff0c;我们手中的手机是我们生活、工作、娱乐的得力助手&#xff0c;但随着时代的变迁和技术的发展&#xff0c;我们需要的不仅仅是一部手机&#xff0c;而是一个更强大、更灵活的工具。在这个时候&#xff0c;云手机横空出世&#xff0c;成为了我们手机使用的新选择…

[GXYCTF 2019]BabyUpload

过滤 <? 且后缀不能有 php 上传1.jpg文件&#xff0c;内容为&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 但文件后缀为.jpg&#xff0c;蚁剑不能连接。那怎么办呢&#xff1f; .htaccess文件&#xff1a;解析.jpg文件中的php代码 &#xf…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

Redis入门到实战教程(基础篇)笔记

教学来源&#xff1a; Redis课程介绍导学_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cr4y1671t?p1一、Redis 入门 1.认识NoSQL 2.Redis在虚拟机中的安装和开机自启 Redis在虚拟机中安装和配置开机自启-CSDN博客https://blog.csdn.net/qq_69183322/article/deta…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台&#xff0c;供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心&#xff0c;最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

docker 基本命令

目录 一、docker 镜像操作命令 1.1.查询软件镜像 1.2.docker pull&#xff1a;下载镜像 1.3.docker push&#xff1a;上传镜像 1.4.docker images&#xff1a;查看本地镜像 1.5.docker inspect &#xff1a;获取镜像详细信息 1.6.docker tag&#xff1a;添加镜像标签 …

4.28|重量级嘉宾携卓翼飞思RflySim平台亮相国际盛会,内容抢先看!

一. 大会背景 2024国际无人机应用及防控大会暨无人机产业博览会即将拉开帷幕&#xff0c;一场高规格、高水平的无人机产业应用国际盛会将再次点亮科技界的星空。 该大会由中国无人机产业创新联盟联合各方有影响力的单位&#xff0c;于4月27-29日在北京举办。组委会致力于将会…

【Python系列】受保护属性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

RAG原理及本地化实践

基于LLM的应用在问题回答、信息获取上发挥出了巨大作用。这些通用大模型训练的数据主要来源于互联网上的会话或者个别机构提供的数据&#xff0c;虽然能够提供类似人的交互对答&#xff0c;但是在针对某个特定领域的时候就显得不足。通用大模型在应用中主要有以下问题&#xff…

【DINO】环境配置

1. DINO简介 作为一款基于Transformer性能强劲的计算机视觉算法&#xff0c;一经发布即受追捧&#xff0c;本文记录下在DINO官方代码在集群上的环境配置及训练自己的数据集过程。 DINO原文&#xff1a;https://arxiv.org/abs/2203.03605 DINO源代码&#xff1a;https://github.…

ssm084基于ssm的大型商场会员管理系统+jsp

大型商场会员管理系统的设计与实现 摘 要 进入信息时代以来&#xff0c;很多数据都需要配套软件协助处理&#xff0c;这样可以解决传统方式带来的管理困扰。比如耗时长&#xff0c;成本高&#xff0c;维护数据困难&#xff0c;数据易丢失等缺点。本次使用数据库工具MySQL和编…

【C语言必刷题】7. 百钱百鸡

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…
最新文章