使用Undertow代替Tomcat

默认情况下,Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器,可以将 Web 服务器切换到 Undertow 来提高应用性能,Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器
Untertow 的特点:

  • 轻量级:它是一个 Web 服务器,但不像传统的 Web 服务器有容器概念,它由两个核心 Jar 包组成,加载一个 Web 应用可以小于 10MB 内存
  • Servlet3.1 支持:它提供了对 Servlet3.1 的支持
  • WebSocket 支持:对 Web Socket 完全支持,用以满足 Web 应用巨大数量的客户端
  • 嵌套性:它不需要容器,只需通过 API 即可快速搭建 Web 服务

    3.1. 移除Tomcat 依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. <exclusions>
    5. <exclusion>
    6. <groupId>org.springframework.boot</groupId>
    7. <artifactId>spring-boot-starter-tomcat</artifactId>
    8. </exclusion>
    9. </exclusions>
    10. </dependency>

    3.2. 增加Untertow 依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-undertow</artifactId>
    4. </dependency>

    3.3. 配置文件加上Untertow的配置

    1. server:
    2. undertow:
    3. io-threads: 16
    4. worker-threads: 256
    5. buffer-size: 1024
    6. direct-buffers: true

    io-threads:设置IO线程数,它主要执行非阻塞的任务,默认会取值cpu核心
    worker-threads:阻塞任务线程池,当执行类似servlet请求阻塞IO操作会从这个线程池中取得线程,默认值是IO线程数8
    buffer-size:设置buffer大小,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    *direct-buffers
    :是否分配的直接内存(NIO直接分配的堆外内存)

Feign参数调优

1. 替换OKHttp

在默认情况下 spring cloud feign在进行各个子服务之间的调用时,http组件使用的是jdk的HttpURLConnection,没有使用线程池。
有2种可选的线程池:HttpClient和OKHttp
比较推荐OKHttp,请求封装的非常简单易用,性能也很ok。

1.1. 添加依赖

  1. <dependency>
  2. <groupId>com.squareup.okhttp3</groupId>
  3. <artifactId>okhttp</artifactId>
  4. </dependency>

1.2. 修改配置文件

  1. feign:
  2. okhttp:
  3. enabled: true
  4. httpclient:
  5. enabled: false
  6. max-connections: 1000
  7. max-connections-per-route: 100

max-connections:最大连接数
max-connections-per-route:每个url的连接数

2. 开启Feign请求响应压缩

开启压缩可以有效节约网络资源,但是会增加CPU压力,建议把最小压缩的文档大小适度调大一点

  1. ## 开启Feign请求响应压缩
  2. feign.compression.request.enabled=true
  3. feign.compression.response.enabled=true
  4. ## 配置压缩文档类型及最小压缩的文档大小
  5. feign.compression.request.mime-types=text/xml,application/xml,application/json
  6. feign.compression.request.min-request-size=2048

Ribbon参数调优

主要调整请求的超时时间,是否重试

如果业务没有做幂等性的话建议把重试关掉
ribbon.MaxAutoRetriesNextServer=0

  1. ## 从注册中心刷新servelist的时间 默认30秒,单位ms
  2. ribbon.ServerListRefreshInterval=15000
  3. ## 请求连接的超时时间 默认1秒,单位ms
  4. ribbon.ConnectTimeout=30000
  5. ## 请求处理的超时时间 默认1秒,单位ms
  6. ribbon.ReadTimeout=30000
  7. ## 对所有操作请求都进行重试,不配置这个MaxAutoRetries不起作用 默认false
  8. #ribbon.OkToRetryOnAllOperations=true
  9. ## 对当前实例的重试次数 默认0
  10. #ribbon.MaxAutoRetries=1
  11. ## 切换实例的重试次数 默认1
  12. ribbon.MaxAutoRetriesNextServer=0

如果MaxAutoRetries=1和MaxAutoRetriesNextServer=1
请求在1s内响应,超过1秒先同一个服务器上重试1次,如果还是超时或失败,向其他服务上请求重试1次。
那么整个ribbon请求过程的超时时间为:
ribbonTimeout = (ribbonReadTimeout + ribbonConnectTimeout) (maxAutoRetries + 1) (maxAutoRetriesNextServer + 1)