Zuul 优化时涉及到四个地方,使用的服务器[tomcat]、zuul、hystrix和ribbon。
其他springcloud 服务优化服务器[tomcat]和ribbon。
统一优化日志异步打印。
service:
Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。
Tomcat 默认的HTTP实现是采用阻塞式的Socket通信,每个请求都需要创建一个线程处理,当一个进程有500个线程在跑的话,那性能已经是很低很低了。Tomcat默认配置的最大请求数是150,也就是说同时支持150个并发。具体能承载多少并发,需要看硬件的配置,CPU越多性能越高,分配给JVM的内存越多性能也就越高,但也会加重GC的负担。当某个应用拥有 250个以上并发的时候,应考虑应用服务器的集群。操作系统对于进程中的线程数有一定的限制:
- Windows 每个进程中的线程数一般不允许超过 2000
- Linux 每个进程中的线程数一般不允许超过 1000
在Java中每开启一个线程需要耗用1MB的JVM内存空间用于作为线程栈之用,此处也应考虑。在整套系统中,调用链路会受到配置最差的应用的干扰,所以要考虑整体的优化。
tomcat的默认配置:
server:
tomcat:
accept-count: 1000
max-threads: 1000
max-connections: 2000
spring-boot-tomcat:
server:
tomcat:
max-threads: 128 # Maximum amount of worker threads.
min-spare-threads: 64 # Minimum amount of worker threads.
Accept-count: 0 #当正在处理的请求达到最大值时,可接受的等待请求数
max-connections: 0 # 最大处理请求数,一旦达到最大值,还能接受acceptCount个请求
spring-boot-undertow:
server:
undertow:
io-threads: Math.max(Runtime.getRuntime().availableProcessors(), 2) #设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接,默认取CPU核心数量,最小值为2。
worker-threads: io-threads * 8 #阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载,默认值为io-threads*8
buffer-size: #Size of each buffer in bytes.
buffers-per-region: # Number of buffer per region.
direct-buffers: # Allocate buffers outside the Java heap.
zuul设置
zuul:
retryable: true
ribbon-isolation-strategy: SEMAPHORE #ribbon 默认使用隔离级别 信号量
host:
max-total-connections: 1000 #适用于ApacheHttpClient,如果是okhttp无效。每个服务的http客户端连接池最大连接,默认是200.
max-per-route-connections: 500 #适用于ApacheHttpClient,如果是okhttp无效。每个route可用的最大连接数,默认值是20。
socket-timeout-millis: 10000 #通信超时时间,默认10s,
connect-timeout-millis: 3000 #连接超时时间,默认2s
semaphore:
max-semaphores: 1000 # 信号量100
Hystrix 参数
hystrix:
command:
- default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000 #默认1000ms
semaphore:
maxConcurrentRequests: 100
spring cloud hystrix 配置属性大全
hystrix.command.default.execution.isolation.strategy=thread
使用命令调用的隔离模式,默认采用线程隔离
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000
一个命令执行的超时时间,以毫秒为单位,默认是1s
hystrix.command.default.execution.timeout.enabled=true
是否开启超时触发,默认是开启
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
使用线程隔离时,当命令超时时是否对命令所在线程执行中断操作,默认为true,只会中断线程处于阻塞状态(如sleep,wait,join等状态),正常运行的线程都不会中断
hystrix.command.default.execution.isolation.thread.interruptOnCancel=false
使用线程隔离时,当Future取消时是否对命令所在线程执行中断操作,默认为false
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=10
使用信号量隔离时,命令调用最大的并发数,默认为10个
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=10
使用信号量隔离时,命令fallback调用的最大并发数,默认为10个
hystrix.command.default.fallback.enabled=true
是否开启fallback降级策略,默认为true
hystrix.command.default.circuitBreaker.enabled=true
是否启用熔断器,默认是启用
hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
一个滚动窗口内触发熔断的最少请求数,默认是20个。滚动窗口时间取自(metrics.rollingStats.timeInMilliseconds),默认10s内至少请求20次,熔断才发挥作用。
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000
触发熔断之后(拒绝请求),多长时间开始重新尝试执行,默认是5000ms。步骤如下:熔断器中断请求5秒后会进入半打开状态,放下一个请求进来重试,如果该请求成功就关闭熔断器,否则继续等待一个熔断时间窗口
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
设置启动熔断的错误或者延迟的比例,默认是50%。在一个滚动窗口(默认10s)如果超过50%的请求发生错误或者延迟,则触发熔断器,前提是circuitBreaker.requestVolumeThreshold条件满足
hystrix.command.default.circuitBreaker.forceOpen=false
是否强制开启熔断器,默认为false,开启之后所有请求全部拒绝,直接fallback
hystrix.command.default.circuitBreaker.forceClosed=false
是否强制关闭熔断器,默认为false,开启之后不能熔断
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000
统计滚动窗口的时间,默认为10s(并且默认滚动窗口的桶数量为10个,所以一个桶一秒钟),熔断器会使用这个时间
hystrix.command.default.metrics.rollingStats.numBuckets=10 #must metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0
统计窗口的桶数量,默认为10个,所以在一个10s的统计窗口中一个桶1秒钟
hystrix.command.default.metrics.rollingPercentile.enabled=true
是否开启监控统计功能,计算各个百分比(SLA),默认为true
hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds=60000
滚动百分比的统计时间,默认为60000即1分钟,1分钟统计一次
hystrix.command.default.metrics.rollingPercentile.numBuckets=6 #must metrics.rollingPercentile.timeInMilliseconds % metrics.rollingPercentile.numBuckets == 0
滚动百分比的桶数量,默认为6个,(在60s的窗口中10秒钟一个桶)
hystrix.command.default.metrics.rollingPercentile.bucketSize=100
每一个百分比窗口桶可以存放值得数量,默认为100即每个桶都多可以放100个值
hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds=500
健康快照之间的间隔时间,默认为500ms(错误百分比等统计)
hystrix.command.default.requestCache.enabled=true
是都缓存请求,request-scope缓存,默认为true
hystrix.command.default.requestLog.enabled=true
hystrix执行的日志是否打印,默认为true
hystrix.collapser.default.maxRequestsInBatch=Integer.MAX_VALUE
该属性设置批量处理的最大请求数量,默认值为Integer.MAX_VALUE
hystrix.collapser.default.timerDelayInMilliseconds=10
该属性设置多长时间之内算一次批处理,默认为10ms
hystrix.collapser.default.requestCache.enabled=true
是都缓存请求,request-scope缓存,默认为true
hystrix.threadpool.default.coreSize=10
设置线程池的大小,默认为10,也就是说最大并发为10
hystrix.threadpool.default.maximumSize=10
设置线程池打最大值,默认为10,只有allowMaximumSizeToDivergeFromCoreSize为true时才生效
hystrix.threadpool.default.maxQueueSize=-1
该属性设置实现的最大队列大小,默认为-1,-1代表SynchronousQueue将被使用,否则将使用一个正值的LinkedBlockingQueue,这个属性只适用于初始化期间,并且不能更改或者调整,如果修改的话需要重启
hystrix.threadpool.default.queueSizeRejectionThreshold=5
该属性设置队列大小拒绝阈值,即maxQueueSize还没有达到最大值,此值也能动态响应拒绝队列的大小,当maxQueueSize=-1时此值不起作用
hystrix.threadpool.default.keepAliveTimeMinutes=1
设置线程保持的时间,以分钟为单位,默认为1分钟,如果coreSize小于maximumSize,那么这个属性控制一个线程在不使用之后多久将被释放
hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=false
该属性允许配置maximumSize生效,当coreSize小于maximumSize时创建一个最大值为maximumSize并发的线程池,但会在相对不活动期间返回线程到系统(受keepAliveTimeInMinutes控制)
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=10000
该属性设置统计滚动窗口的持续时间,以还秒为单位。这是为线程池保留多长时间的指标,默认为1000ms
hystrix.threadpool.default.metrics.rollingStats.numBuckets=10 # must metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0
该属性设置滚动统计窗口分成桶的数量,必须能被metrics.rollingStats.timeInMilliseconds整除,默认为10
ribbon参数
ribbon:
maxAutoRetries: 1 # Max number of next servers to retry (excluding the first server)
maxAutoRetriesNextServer: 1 # Whether all operations can be retried for this client
okToRetryOnAllOperations: true # Interval to refresh the server list from the source
serverListRefreshInterval: 2000 # Interval to refresh the server list from the source
conectTimeout: 3000 # Connect timeout used by Apache HttpClient
readTimeout: 3000 # Read timeout used by Apache HttpClient
监控工具:Java VisualVM
-Dcom.sun.management.jmxremote.port=2099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.19.52.8
Feign配置参数
# Feign默认没有线程池。当使用HttpClient时,可如下设置:
feign:
httpclient:
enabled: true
max-connections: 200 # 默认值
max-connections-per-route: 50 # 默认值
#当使用OKHttp时,可如下设置:
feign:
okhttp:
enabled: true
httpclient:
max-connections: 200 # 默认值
max-connections-per-route: 50 # 默认值
如果所有的配置整合在一起则如下例子:
#zuul配置
zuul:
retryable: true
ribbon-isolation-strategy: SEMAPHORE #ribbon 默认使用隔离级别 信号量
host:
max-total-connections: 1000 #适用于ApacheHttpClient,如果是okhttp无效。每个服务的http客户端连接池最大连接,默认是200.
max-per-route-connections: 500 #适用于ApacheHttpClient,如果是okhttp无效。每个route可用的最大连接数,默认值是20。
socket-timeout-millis: 10000 #通信超时时间,默认10s,
connect-timeout-millis: 3000 #连接超时时间,默认2s
semaphore:
max-semaphores: 1000 # 信号量100
#server配置
server:
tomcat:
uri-encoding: UTF-8
max-threads: 1000 # Maximum amount of worKer threads.
min-spare-threads: 100 # Minimum amount of worker threads.
accept-count: 500 #当正在处理的请求达到最大值时,可接受的等待请求数
max-connections: 1000 # 最大处理请求数,一旦达到最大值,还能接受acceptCount个请求
connection-timeout: 10000ms
compression:
enabled: true
mime-types: application/json,application/javascript,application/xml,text/css,text/html,text/xml,text/plain
min-response-size: 2048
#feign默认全局配置
feign:
client:
config:
default:
connect-timeout: 10000
read-timeout: 30000
logger-level: full
httpclient:
enabled: true
max-connections: 2000 # 默认值
max-connections-per-route: 500 # 默认值
#ribbon配置
ribbon:
onnectTimeout: 10000
ReadTimeout: 30000
eureka:
enabled: true
http:
client:
enabled: true
日志异步打印
log4j2异步
导入
简易优化使用
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
感兴趣的:官网http://logging.apache.org/log4j/2.x/manual/async.html
Logback 异步
-1
false
256
eg:
discardingThreshold 设置为0,阈值失效;neverBlock设置为true,队列满时不挂起业务线程,直接丢弃。