# :-: Spring Cloud性能調優
* [一、zuul并發調優](http://www.hmoore.net/zlt2000/microservices-platform/989550#zuul_1)
* [1\. 修改隔離策略](http://www.hmoore.net/zlt2000/microservices-platform/989550#1__3)
* [2\. 熔斷器并發調優](http://www.hmoore.net/zlt2000/microservices-platform/989550#2__19)
* [3\. 使用Undertow代替Tomcat](http://www.hmoore.net/zlt2000/microservices-platform/989550#3_UndertowTomcat_41)
* [3.1. 移除Tomcat 依賴](http://www.hmoore.net/zlt2000/microservices-platform/989550#31_Tomcat__48)
* [3.2. 增加Untertow 依賴](http://www.hmoore.net/zlt2000/microservices-platform/989550#32_Untertow__62)
* [3.3. 配置文件加上Untertow的配置](http://www.hmoore.net/zlt2000/microservices-platform/989550#33_Untertow_70)
* [二、Feign參數調優](http://www.hmoore.net/zlt2000/microservices-platform/989550#Feign_85)
* [1\. 替換OKHttp](http://www.hmoore.net/zlt2000/microservices-platform/989550#1_OKHttp_86)
* [1.1. 添加依賴](http://www.hmoore.net/zlt2000/microservices-platform/989550#11__90)
* [1.2. 修改配置文件](http://www.hmoore.net/zlt2000/microservices-platform/989550#12__97)
* [2\. 開啟Feign請求響應壓縮](http://www.hmoore.net/zlt2000/microservices-platform/989550#2_Feign_110)
* [三、Ribbon參數調優](http://www.hmoore.net/zlt2000/microservices-platform/989550#Ribbon_122)
## 一、zuul并發調優
zuul默認是使用`semaphore`隔離,并且最大的并發默認是10
### 1\. 修改隔離策略
默認情況下推薦使用 thread 隔離策略
> 線程池提供了比信號量更好的隔離機制,并且從實際測試發現高吞吐場景下可以完成更多的請求。但是信號量隔離的開銷更小,對于本身就是10ms以內的系統,顯然信號量更合適
~~~
zuul:
ribbon-isolation-strategy: thread
ribbon:
threadPool:
useSeparateThreadPools: true
threadPoolKeyPrefix: api-gateway
~~~
> **ribbon-isolation-strategy**:修改線程隔離策略**useSeparateThreadPools**:讓每個路由使用獨立的線程池**threadPoolKeyPrefix**:線程池前綴
### 2\. 熔斷器并發調優
修改熔斷器的線程數量,注意線程數不是越多越好
~~~
hystrix:
threadpool:
default:
coreSize: 100
maximumSize: 2000
allowMaximumSizeToDivergeFromCoreSize: true
maxQueueSize: -1
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 60000
~~~
> **allowMaximumSizeToDivergeFromCoreSize**:允許maximumSize起作用**maxQueueSize**:如該值為-1,那么使用的是SynchronousQueue,否則使用的是LinkedBlockingQueue**timeoutInMilliseconds**:斷路器的超時時間;如果ribbon配置了重試那么該值必需大于ribbonTimeout,重試才能生效
### 3\. 使用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 依賴
~~~
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
~~~
#### 3.2. 增加Untertow 依賴
~~~
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
~~~
#### 3.3. 配置文件加上Untertow的配置
~~~
server:
undertow:
io-threads: 16
worker-threads: 256
buffer-size: 1024
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. 添加依賴
~~~
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
~~~
#### 1.2. 修改配置文件
~~~
feign:
okhttp:
enabled: true
httpclient:
enabled: false
max-connections: 1000
max-connections-per-route: 100
~~~
> **max-connections**:最大連接數**max-connections-per-route**:每個url的連接數
### 2\. 開啟Feign請求響應壓縮
開啟壓縮可以有效節約網絡資源,但是會增加CPU壓力,建議把最小壓縮的文檔大小適度調大一點
~~~
## 開啟Feign請求響應壓縮
feign.compression.request.enabled=true
feign.compression.response.enabled=true
## 配置壓縮文檔類型及最小壓縮的文檔大小
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048
~~~
## 三、Ribbon參數調優
主要調整請求的超時時間,是否重試
> 如果業務沒有做冪等性的話建議把重試關掉ribbon.MaxAutoRetriesNextServer=0
~~~
## 從注冊中心刷新servelist的時間 默認30秒,單位ms
ribbon.ServerListRefreshInterval=15000
## 請求連接的超時時間 默認1秒,單位ms
ribbon.ConnectTimeout=30000
## 請求處理的超時時間 默認1秒,單位ms
ribbon.ReadTimeout=30000
## 對所有操作請求都進行重試,不配置這個MaxAutoRetries不起作用 默認false
#ribbon.OkToRetryOnAllOperations=true
## 對當前實例的重試次數 默認0
#ribbon.MaxAutoRetries=1
## 切換實例的重試次數 默認1
ribbon.MaxAutoRetriesNextServer=0
~~~
> 如果`MaxAutoRetries=1`和`MaxAutoRetriesNextServer=1`請求在1s內響應,超過1秒先同一個服務器上重試1次,如果還是超時或失敗,向其他服務上請求重試1次。那么整個ribbon請求過程的超時時間為:**ribbonTimeout = (ribbonReadTimeout + ribbonConnectTimeout) \* (maxAutoRetries + 1) \* (maxAutoRetriesNextServer + 1)**
- 項目介紹
- 項目聲明
- 項目簡介
- 架構設計
- 項目亮點功能介紹
- 技術棧介紹
- 核心功能
- 運行環境
- 項目更新日志
- 文檔更新日志
- F&Q
- 部署教程
- 環境準備
- JDK安裝
- JDK1.8,17共存
- maven
- 分布式緩存Redis
- 單機版
- 集群
- 注冊&配置中心alibaba/nacos
- 介紹
- Nacos安裝
- Nacos配置中心
- Nacos注冊發現
- Nacos生產部署方案
- 服務監控-BootAdmin
- 基本介紹
- 如何使用
- 整合Admin-Ui
- 客戶端配置
- 鏈路追蹤
- 基本介紹
- SkyWalking-1
- Skywalking-1
- 消息隊列
- Kafka
- docker安裝kafka
- Linux集群
- Maven私服
- nexus安裝部署
- nexus使用介紹
- 全文搜索elasticsearch
- windows集群搭建
- docker安裝es
- ElasticHD
- linux集群部署
- 統一日志解決方案
- 日志解決方案設計
- 介紹與相關資料
- ELK安裝部署
- elasticsearch 7.5
- logstash-7.5
- kibana-7.5
- filebeat
- 服務監控-Prometheus
- Prometheus安裝配置
- Prometheus介紹
- grafana
- 持續集成部署CICD
- 自動化部署Jenkins
- 安裝部署win
- 打包發布遠程執行
- 安裝部署linux
- jenkins+gitlab+docker容器化工程自動化部署
- Git
- CICD說明
- 阿里云效
- CentOS_MYSQL安裝
- docker
- 安裝
- Docker安裝Nginx
- Docker部署啟動springboot
- dockerCompose
- harbor
- Docker私有鏡像倉庫
- Portainer
- Docker遠程連接設置
- 打包工程
- 必要啟動模塊
- 核心模塊
- 登錄認證
- 緩存功能
- 日志模塊
- 分布式鎖
- 消息隊列
- 異常處理
- 系統接口
- 參數驗證
- es檢索
- 數據導出
- 系統設計
- 系統總體架構
- 擴展模塊(可選)
- 限流熔斷alibaba/sentinel
- 使用Sentinel實現gateway網關及服務接口限流
- Sentinel使用Nacos存儲規則及同步
- 服務調用Feign
- Feign基本介紹
- 如何使用
- 負載均衡
- 請求超時
- 請求攔截器
- 分布式任務調度
- XXL-JOB
- 分布式事務
- TX-LCN
- Seata
- Seata原理解析
- 數據庫分庫分表
- swagger文檔
- 分布式ID生成器解決方案
- 服務網關CloudGateway
- 基本介紹
- 使用網關
- 路由配置
- 全局過濾器
- 服務認證授權架構設計
- 認證服務流程
- 授權服務流程
- 系統冪等性設計與實踐
- 分布式日志鏈路跟蹤
- 實時搜索系統設計
- 應用性能
- 壓力測試工具
- Apache JMeter介紹和安裝
- ApacheJMeter使用
- JVM
- JVM性能調優
- 常見JVM內存錯誤及解決方案
- JVM 分析工具詳解
- Spring Cloud性能調優
- Linux運維
- Linux 常用命令
- Linux開啟端口