最近在调整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的默认值是10000,APR/native的默认值是8192,而BIO的默认值为maxThreads(如果配置了Executor,则默认值是Executor的maxThreads)。
在windows下,APR/native的maxConnections值会自动调整为设置值以下最大的1024的整数倍;如设置为2000,则最大值实际是1024。
2.1.1.3 maxThreads
请求处理线程的最大数量。默认值是200(Tomcat7和8都是的)。如果该Connector绑定了Executor,这个值会被忽略,因为该Connector将使用绑定的Executor,而不是内置的线程池来执行任务。
maxThreads规定的是最大的线程数目,并不是实际running的CPU数量;实际上,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的配置(合并上hystrix与ribbon的超时配置)
当然了这里就不详细说了。网上一大堆
信号量为例 – 当然还有一些超时时间,具体什么关系可以网上搜
虽然使用了信号量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
#当然也不要丢了ribbon与hystrix的超时配置
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配置。
乐享:知识积累,快乐无限。