百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

spring cloud gateway 性能优化思路

csdh11 2025-05-09 17:50 3 浏览

Spring Cloud Gateway 是一个高性能的 API 网关,但在实际的生产环境中,可能会遇到一些性能瓶颈。以下是一些 Spring Cloud Gateway 的性能优化方面:

调整线程池大小和连接池大小

Spring Cloud Gateway 使用 Netty 作为底层服务器和 HttpClient 作为 HTTP 客户端,它们都使用线程池和连接池来管理资源。线程池大小和连接池大小的调整可以直接影响到系统的性能。Spring Cloud Gateway 默认情况下会为 HttpClient 配置一个默认的连接池大小,可以通过配置文件中的以下参数来调整连接池的大小:

spring:
  cloud:
    gateway:
      httpclient:
        pool:
          max-connections: 500  # 最大连接数
          max-per-route-connections: 200  # 每个路由的最大连接数

Spring Cloud Gateway 使用 Netty 作为底层服务器,Netty 中的线程池是用于处理入站和出站事件的。Spring Cloud Gateway 默认情况下会为入站和出站事件各创建一个线程池,这两个线程池都由 Reactor Netty 库提供,分别是 EventLoopGroup 和 WorkerGroup。线程池大小的设置需要根据系统的负载和硬件性能来调整。如果线程池过小,可能会导致请求被拒绝或者响应延迟,如果线程池过大,则可能会浪费系统资源。一般来说,线程池的大小应该根据实际的业务负载和硬件资源进行调整。

可以通过在配置文件中配置以下参数来调整线程池的大小:

server:
  port: 8080

spring:
  application:
    name: gateway
  cloud:
    gateway:
      threads:
        io: 4  # 指定 io 线程池大小
        worker: 8  # 指定 worker 线程池大小

缓存请求结果

Spring Cloud Gateway 中使用缓存可以提高系统的性能。可以使用 Redis、Memcached 等缓存中间件,将一些静态资源、频繁访问的数据等缓存起来,以减少后端服务的压力。使用缓存需要注意缓存的数据一致性问题,以及缓存的命中率和缓存的清理策略等问题。

配置路由规则的负载均衡策略

可以通过配置路由规则的负载均衡策略来实现请求的分流和负载均衡,这可以通过 Ribbon 或者 Spring Cloud LoadBalancer 等负载均衡框架来实现,从而提高系统的并发能力和性能。

使用异步 IO

可以使用 Spring WebFlux 的异步 IO 特性来提高系统的性能,通过在请求处理中使用 Mono 或者 Flux 等响应式编程的方式来处理请求,从而实现更好的并发能力和性能。Spring Cloud Gateway 支持异步编程,可以使用 Reactor、CompletableFuture 等异步编程框架,提高系统的吞吐量和性能。需要注意异步编程的复杂度和错误处理等问题,避免出现异步编程带来的问题。

优化下游服务

如果下游服务的处理能力跟不上 Gateway 的处理速度,可以考虑对下游服务进行优化,例如使用异步处理或者增加服务实例等方式来提升处理能力。

优化路由规则

路由规则是 Spring Cloud Gateway 的核心功能之一,可以根据请求的 URL、Header、参数等信息,将请求转发到不同的后端服务。路由规则的设计合理性直接影响到系统的性能。在设计路由规则时,应该尽量减少正则表达式的使用,避免过度复杂的匹配逻辑。如果有必要使用正则表达式,可以尝试使用预编译的正则表达式,以提高性能。另外,可以尽量将路由规则放在前面,以提高匹配的效率。如果有多个路由规则,可以将匹配频率高的规则放在前面,匹配频率低的规则放在后面,以提高匹配效率。

使用限流

在高并发场景下,使用限流可以有效地保护后端服务。可以使用 Spring Cloud Circuit Breaker、Resilience4j 等限流工具,对请求进行限流处理,避免请求过载导致系统崩溃。需要注意限流的粒度和策略,以及限流规则的动态调整和监控等问题。

通用配置

spring:
  application:
    name: gateway-service

server:
  port: 8080

logging:
  level:
    org.springframework.cloud.gateway: TRACE
    org.springframework.http.server.reactive: DEBUG

# 路由规则配置
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service  # 后端服务的服务名,使用负载均衡
          predicates:
            - Path=/api/users/**  # 匹配请求路径为 /api/users/**
          filters:
            - RewritePath=/api/users/(?<segment>.*), /$\{segment}  # 重写请求路径
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - AddRequestHeader=X-Request-Foo, Bar  # 添加请求头
            - AddResponseHeader=X-Response-Foo, Baz  # 添加响应头
            - RewritePath=/api/orders/(?<segment>.*), /$\{segment}

# 服务注册与发现配置
spring:
  cloud:
    discovery:
      client:
        simple:
          instances:
            user-service:
              - uri: http://localhost:8081
            order-service:
              - uri: http://localhost:8082

# 线程池和连接池配置
spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      httpclient:
        pool:
          name: myPool
          type: Hikari
          maxConnections: 200
          maxIdleTime: 60000
      threadpool:
        useGlobalResources: false
        name: myThreadPool
        # 默认情况下,线程池大小为 CPU 核心数的两倍
        # 在高并发场景下,可以适当增大线程池大小
        # 但是,过大的线程池会占用过多的系统资源,导致系统崩溃
        # 因此,需要根据具体情况进行调整
        # 推荐的线程池大小为 CPU 核心数的 2-4 倍
        size: 10

# 缓存配置
spring:
  cache:
    type: redis
  redis:
    host: localhost
    port: 6379
    database: 0
    lettuce:
      pool:
        max-active: 100
        max-idle: 50
        min-idle: 5

# 限流配置
resilience4j:
  ratelimiter:
    configs:
      myConfig:
        limitForPeriod: 10  # 限流阈值
        limitRefreshPeriod: 1s  # 限流时间窗口
        timeoutDuration: 500ms  # 超时时间
    instances:
      myInstance:
        baseConfig: myConfig
        limitForPeriod: 10
        limitRefreshPeriod: 1s
        timeoutDuration: 500ms

# 监控配置
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
  metrics:
    export:
      prometheus:
        enabled: true
  metrics:
    tags:
      application: ${spring.application.name}
      instance: ${spring.application.instance_id:${random

实际项目配置

spring:
  jackson:
    default-property-inclusion: NON_NULL
  application:
    name: ownbank-mobile-gateway
  main:
    allow-bean-definition-overriding: true  #当遇到同样名字的时候,是否允许覆盖注册
  #服务注册与发现  
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.11.156:8848  
  #Redis连接配置
  redis:
    host: kjflskjd.com
    port: 6379
    password: app
    lettuce:
      pool:
        max-wait: 1000 #连接池最大阻塞等待时间 (使用负值表示没有限制)单位毫秒  默认 -1  连接尝试分配阻塞时间.过短会频繁抛出异常,在有旁路设计的系统中,压力就会宣泄到数据库中.过长或者无限制会导致接口响应时间过长
        max-active: 20   #连接池的最大连接数  使用负值表示没有限制) 默认 8 ,过少会导致竞争\阻塞.过多会浪费资源. 建议默认值: CPU*2
        max-idle: 10  #最大空闲数 默认 8  连接池最大的空闲数.过少会导致频繁释放\建立链接,十分耗时(建立连接是耗时操作).过多会浪费资源
        #min-idle: -1 #连接池中的最小空闲连接 默认 0 
  cloud:
    inetutils:
      ignoredInterfaces:
        - Hyper.*
    gateway:
      discovery:
        locator:
          enabled: false
      httpclient:
        pool:
          max-connections-per-route: 50
          max-connections: 200
        connect-timeout: 1000
        response-timeout: 10000
      routes:
        - id: al-platform-demo-web
          uri: lb://al-platform-demo-web
          order: 10000
          predicates:
            - Path=/demo/**
          filters:
            - StripPrefix=1
            - name: Hystrix
              args:
                name: demo-web
                fallbackUri: forward:/fallback


#服务端口
server:
  port: 10040
  http2:
    enabled: true
  servlet:
    context-path: /


#网框架关自带endpoint 配置
management:
  server:
    port: 20040
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
  trace:
    http:
      enabled: false

          
#hystrix 配置
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000    # 方法执行超时时间,默认值是 1000,即 1秒  在THREAD模式下,达到超时时间,可以中断  在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时
          semaphore:
            maxConcurrentRequests: 5000     # 限流最大并发数,超过此并发数的请求会被拒绝;默认值是 10,此配置项要在 execution.isolation.strategy 配置为 semaphore 时才会生效
      fallback:
        isolation:
          semaphore:
            maxConcurrentRequests: 3000     # fallback方法执行时的最大并发数,SEMAPHORE模式有效  默认是10,如果大量请求的回退方法被执行时,超出此并发数的请求会抛出 REJECTED_SEMAPHORE_FALLBACK 异常
      circuitBreaker:
        enabled: true     # 开启断路器,默认为 true
        sleepWindowInMilliseconds: 5000     # 熔断启用后,多少ms后进入半打开状态
        requestVolumeThreshold: 3000        # 触发断路器开启,所需要的最小请求数,避免误伤低访问量时的请求
        errorThresholdPercentage: 50        # 在统计的滑动窗口内达到的错误率,触发开启断路器;但是也会受 requestVolumeThreshold 影响
  threadpool:
    default:
      coreSize: 10 #线程池coreSize
      maximumSize: 100 #此属性设置最大线程池大小。 这是在不开始拒绝HystrixCommands的情况下可以支持的最大并发数。 请注意,此设置仅在您还设置allowMaximumSizeToDivergeFromCoreSize时才会生效。
      allowMaximumSizeToDivergeFromCoreSize: true  # 默认值:false  参考 AbstractCommand  构造方法 初始化command 和 threadpool  HystrixConcurrencyStrategy - getThreadPool
      #maxQueueSize: 100 #请求等待队列  默认值:-1 如果使用正数,队列将从SynchronizeQueue改为LinkedBlockingQueue  配置了maxQueueSize  那么到达最大队列数超过5(queueSizeRejectionThreshold 默认5) 不会新增线程 直接拒绝  HystrixThreadPool isQueueSpaceAvailable
      #queueSizeRejectionThreshold: 100 # 此属性存在,因为BlockingQueue的maxQueueSize不能动态更改,我们希望允许您动态更改影响拒绝的队列大小。 此属性设置队列大小拒绝阈值, 即使未达到maxQueueSize也将发生拒绝的人为最大队列大小 默认值:5

#日志配置
logging:
  config: classpath:logback.xml

Spring Cloud Gateway 的性能优化可以从多个方面入手,包括路由规则、线程池大小和连接池大小、缓存、限流和异步编程等。需要结合实际业务场景和硬件资源进行综合考虑。

相关推荐

OKHttp原理解析(okhttp的作用)

Okhttp应该是Android目前非常流行的第三方网络库,尝试讲解他的使用以及原理分析,分成几个部分:...

快速教会你优雅的解决TCP客户端端口耗尽的问题

Hello,我是Henry,相信各位开发老爷在使用大并发网络连接的时候,可能都遇到过TCP客户端端口耗尽的问题,这是一个常见问题,以下是系统性的解决方案及技术细节:1.理解端口限制的本质...

这3个接口基础知识,产品经理需要知道

产品经理在工作中,避免不了要阅读接口文档,希望本文能够帮助大家更好的了解接口。接口,即客户端(浏览器)向服务器提交请求,服务器向客户端返回响应。本质就是数据的传输与接收。本文主要介绍接口相关的基础知识...

Java 11新特性对开发者的影响:让编程更高效、更自由

Java11新特性对开发者的影响:让编程更高效、更自由在这个瞬息万变的编程世界里,每一代Java的更新都承载着无数开发者对性能优化、生产力提升以及代码美感追求的期望。作为继Java8之后的首个长期...

干货-okHttp的优点-收藏了(okhttp的好处)

OkHttp相较于其它的实现有以下的优点.支持SPDY,允许连接同一主机的所有请求分享一个socket。如果SPDY不可用,会使用连接池减少请求延迟。使用GZIP压缩下载内容,且压缩操作对用...

如何在 Java 项目中集成 DeepSeek

一、使用官方SDK基础集成1.添加依赖(Maven)<dependency><groupId>com.deepseek</groupId>...

spring cloud gateway 性能优化思路

SpringCloudGateway是一个高性能的API网关,但在实际的生产环境中,可能会遇到一些性能瓶颈。以下是一些SpringCloudGateway的性能优化方面:调整线程池...

你对Android中的okHttp的使用真的了解吗

框架下载地址:https://github.com/square/okhttp今天给大家讲解下网络框架okhttp的使用,这个框架非常强大,很多框架都用它来加载网络资源,目前很多开发者还在用As...

京东大佬问我,Nginx并发连接如何设置?详细说明

京东大佬问我,Nginx并发连接如何设置?详细说明首先,我需要回忆一下Nginx的并发模型。Nginx是基于事件驱动的异步架构,所以它的并发处理能力和配置参数有很大关系。主要的参数应该包括worker...

如何实现一个连接池?一文带你深入浅出,彻底搞懂

-前言-【2w1h】是技术领域中一种非常有效的思考和学习方式,即What、Why和How;坚持【2w1h】,可以快速提升我们的深度思考能力。...

Golang 网络编程(golang 系统编程)

TCP网络编程存在的问题:拆包:对发送端来说应用程序写入的数据远大于socket缓冲区大小,不能一次性将这些数据发送到server端就会出现拆包的情况。通过网络传输的数据包最大是1500字节,当TCP...

Spring6|Spring Boot3有哪些HTTP客户端可以选择

个人博客:无奈何杨(wnhyang)个人语雀:wnhyang...

10. 常用标准库(标准库有哪些)

本章深入解析Go语言核心标准库的关键功能与生产级应用技巧,结合性能优化与安全实践,提供高效开发指南。10.1fmt/io/os10.1.1fmt高级格式化...

Nginx之连接池(nginx 长连接 连接复用)

我们知道Nginx利用连接池来增加它对资源的利用率。下面我们一起来看看Nginx是如何使用连接池的。从上一节模块开始已经慢慢会接触一些Nginx的源码部分来。每个worker进程都有一个独立的ngx...

开发者必备的Android开发资源之OkHttp

小编在这里给各位Android开发者介绍的资源包括工具、库和网站等。有效地利用它们,将有助于减轻我们的工作量,提高我们的工作效率。为什么需要一个HTTP库Android系统提供了两种HTTP通信类,H...