springcloud 服务优化

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异步

导入

com.lmax

disruptor

3.4.2

简易优化使用

  • 方法1. 相应classpath下创建一个叫log4j2.component.properties的文件(maven项目直接放在main/resources就好),内容如下:

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

  • 方法2.如果使用使用Logger 输入日志的话异步直接替换为AsyncLogger,Root替换为AsyncRoot即可。

感兴趣的:官网http://logging.apache.org/log4j/2.x/manual/async.html

 

  Logback 异步

-1

false

256

eg:

discardingThreshold 设置为0,阈值失效;neverBlock设置为true,队列满时不挂起业务线程,直接丢弃。

你可能感兴趣的:(#,spring,springcloud,zuul)