使用組件 springcloud套件 + mysql
一個普通的rest請求,做個用戶基礎信息查詢,sql已進行優化 const級別,但是通過jemeter進行壓測,發現實際並發量只有20-30,經檢查后發現是配置未優化問題,解決方式如下:
1. 增加springboot mysql連接池配置,默認使用的為HikariDataSource。配置如下
spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver username: cjs-base password: xxx url: jdbc:mysql://xxx:3306/xxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true hikari: minimum-idle: 100 maximum-pool-size: 500 idle-timeout: 30000 max-lifetime: 180000 # connection-timeout: 5000 connection-test-query: select 1 connection-init-sql: select 2 #多少毫秒檢測一次連接泄露. leak-detection-threshold: 1000 test-on-borrow: true test-on-connect: true test-on-return: true test-while-idle: true #指定空閑連接檢查、廢棄連接清理、空閑連接池大小調整之間的操作時間間隔 time-between-eviction-runs-millis: 10000 #是否對連接進行包裝,防止連接關閉之后被使用. use-disposable-connection-facade: true validation-interval: 10000 alidation-query: select 3 validation-query-timeout: 5000 #設定連接校驗的超時時間,當使用Hikari connection pool時指定 alidation-timeout: 5000
其中連接池大小,根據自己項目情況配置。
2. 修改fegin配置,一般默認就好。主要是防止資源占用無法釋放,需要將超時時間設置小一些。
feign: hystrix: enabled: true okhttp: enabled: true httpclient: enabled: false client: config: feignName: connectTimeout: 1000 readTimeout: 1000 compression: request: enabled: true response: enabled: true
3.修改hystrix配置,將連接池大小設置為大於需要的並發量
hystrix: threadpool: default: coreSize: 500 maxQueueSize: 1000 command: default: circuitBreaker: requestVolumeThreshold: 50 execution: isolation: semaphore: maxConcurrentRequests: 1000 strategy: SEMAPHORE thread: timeoutInMilliseconds: 1000 shareSecurityContext: true
4.修改ribbon配置
#請求處理的超時時間 ribbon: ReadTimeout: 1000 ConnectTimeout: 1000
5. 增加微服務的實例數量,在k8s中將各微服務的數量按需擴容,我這邊每個微服務擴容為3個實例,加上以上的配置優化,並發量大約可控制在250左右,已滿足當前業務需求。 如還需要進一步的優化,可采用加大服務實例、增加NOSQL的實現方式來實現