最近在调整springcloud的高并发下的配置,留下脚印

ps:终于服务没有限制了,然后卡在了mysql上,单库单表亿级数据基数,tps4000怎么都上不去了。不要跟我说啥分库分表,要钱的,成本...

    又得跟mysql优化刚一波了。

一、整体架构来说吧

1.       Zuul  tomcat+hystrix+ribbon     作为网关使用

2.       Web-center (tomcat+hystrix+ribbon+fegion) 作为对外提服务

3.       Service (tomcat)        内部的微服务

如上是主要结构以及对应限制点


二、关键性配置

    此处不会列出所有配置,只是指出哪里位置需要配置,详细的配置在网上搜搜吧,有一大堆。配置成啥样,这也得按照实际的服务器及服务情况来配置,还有各种针对某个微服务进行配置等等。。。太多了

2.1 首先zuul tomcat+hystrix+ribbon)开始吧。

  2.1.1 tomcat 

关键性配置如下。

  2.1.1.1  AccuotCount 

accept队列的长度;当accept队列中连接的个数达到acceptCount时,队列满,进来的请求一律被拒绝。默认值是100

  2.1.1.2 maxConnections

Tomcat在任意时刻接收和处理的最大连接数。当Tomcat接收的连接数达到maxConnections时,Acceptor线程不会读取accept队列中的连接;这时accept队列中的线程会一直阻塞着,直到Tomcat接收的连接数小于maxConnections。如果设置为-1,则连接数不受限制。

默认值与连接器使用的协议有关:NIO的默认值是10000APR/native的默认值是8192,而BIO的默认值为maxThreads(如果配置了Executor,则默认值是ExecutormaxThreads)。

windows下,APR/nativemaxConnections值会自动调整为设置值以下最大的1024的整数倍;如设置为2000,则最大值实际是1024


  2.1.1.3 maxThreads

请求处理线程的最大数量。默认值是200Tomcat78都是的)。如果该Connector绑定了Executor,这个值会被忽略,因为该Connector将使用绑定的Executor,而不是内置的线程池来执行任务。

maxThreads规定的是最大的线程数目,并不是实际runningCPU数量;实际上,maxThreads的大小比CPU核心数量要大得多。这是因为,处理请求的线程真正用于计算的时间可能很少,大多数时间可能在阻塞,如等待数据库返回数据、等待硬盘读写数据等。因此,在某一时刻,只有少数的线程真正的在使用物理CPU,大多数线程都在等待;因此线程数远大于物理核心数才是合理的。

 

Spring 中的配置示例 :注(relaxed-path-chars配置 tomcat新规范中get请求中一部分特殊字符被认定为了非法字符,如需传递需要再此排除)

 

server:
  port: 8888
  tomcat:
    accept-count: 3000
    max-connections: 10000
    max-threads: 1000
    relaxed-path-chars:
    - '['
    - ']'
    - '{'
    - '}'
    relaxed-query-chars:
    - '['
    - ']'
    - '{'
- '}'


2.1.2 zuul的配置(合并上hystrixribbon的超时配置)

         当然了这里就不详细说了。网上一大堆

         信号量为例 当然还有一些超时时间,具体什么关系可以网上搜

         虽然使用了信号量hystrix不用再配置了,但是ribbon微服务的负载还是要配置相关并发量的。

zuul:
  host:
    connect-timeout-millis: 10000
    max-per-route-connections: 5000
    max-total-connections: 10000
    connection-request-timeout-millis: 10000
    socket-timeout-millis: 5000    
  semaphore:
    max-semaphores: 5000
  routes:
    web-test:
      path: /api/test/**
      service-id: iqs-web-api-test
  ribbon-isolation-strategy: semaphore
  ribbon:
    eager-load:
      enabled: true


#当然也不要丢了ribbonhystrix的超时配置

ribbon:
  #Ribbon允许最大连接数,即所有后端微服务实例请求并发数之和的最大值。
  MaxTotalConnections: 10000
  #单个后端微服务实例能接收的最大请求并发数
  MaxConnectionsPerHost: 5000
  #建议设置超时时间,以免因为等待时间过长造成请求处理失败(一)
  #Http请求中的socketTimeout
  ReadTimeout: 5000
  #Http请求中的connectTimeout
  ConnectTimeout: 10000
#重试几次 
  MaxAutoRetries: 0
#重试几个微服务
  MaxAutoRetriesNextServer: 0
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 20000


 

 

2.2 web 的配置

2.2.1 tomcat 这里就不多说了跟上面的一样。

2.2.2 hystrix 这里使用的是信号量配置

hystrix:
  command: 
    default:
      execution: 
        isolation:
          strategy: SEMAPHORE
          semaphore: 
            maxConcurrentRequests: 5000
        thread: 
          timeoutInMilliseconds: 20000


 

2.2.3 ribbon fegion

    测试中发现虽然上面全配置了,但是量还是上不去,就是卡在了这两个上面。经比对发现有个默认值,看了下源码,好像是50


 测试中发现配置任何一个都能够起作用。

ribbon:
  #Ribbon允许最大连接数,即所有后端微服务实例请求并发数之和的最大值。
  MaxTotalConnections: 10000
  #单个后端微服务实例能接收的最大请求并发数
  MaxConnectionsPerHost: 5000
  #建议设置超时时间,以免因为等待时间过长造成请求处理失败(一)
  #Http请求中的socketTimeout
  ReadTimeout: 5000
  #Http请求中的connectTimeout
  ConnectTimeout: 10000
  MaxAutoRetries: 0
  MaxAutoRetriesNextServer: 0
 
feign:
  hystrix:
    enabled: true
  httpclient:
    max-connections: 10000
    max-connections-per-route: 5000
    connection-timeout: 10000
connection-timer-repeat: 10000


 

 

2.3 service配置

         这个就没啥了就是一个tomcat配置。



乐享:知识积累,快乐无限。