Spring Cloud各组件的重试配置。
早期,Spring Cloud的重试机制是比较混乱的-各个组件都有自己的重试机制,例如Ribbon、Feign、Zuul。官方也意识到了这个问题,并对重试相关逻辑进行了改造与简化。
在Spring Cloud Edgware中,配置重试是非常简单的。
1.重试依赖spring-retry,因此引入重试依赖
org.springframework.retry
spring-retry
2.配置重试
ribbon:
# 同一实例最大重试次数,不包括首次调用
MaxAutoRetries: 1
# 重试其他实例的最大重试次数,不包括首次所选的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都进行重试
OkToRetryOnAllOperations: false
其中
3.对于Zuul,重试特性默认关闭。可使用zuul.retryable=true全局打开重试,也可使用zuul.routes.
Spring Cloud也支持基于HTTP响应码进行重试,只需使用类似如下的配置即可:
:
ribbon:
retryableStatusCodes: 404,502
1.对于其它组件,可配置spring.cloud.loadbalancer.retry.enabled=false.
2.对于zuul,可配置zuul.retryable=false或zuul.routes.
ribbon.OkToRetryOnAllOperations
设为true。因为一旦启用该配置,则表示重试任何操作,包括POST请求,而由于缓存了请求体,此时可能会影响服务器的资源。http://cloud.spring.io/spring-cloud-static/Edgware.RELEASE/single/spring-cloud.html#retrying-failed-requests
Spring Cloud各组件的调优配置。
注:只讨论组件本身的优化配置,不讨论JVM参数配置。
Spring Boot默认内嵌了Tomcat。因此,可对Tomcat的并发参数进行优化。
server:
tomcat:
max-connections: <最大连接数>
max-threads: <最大线程数>
min-spare-threads: <最小空闲线程数>
accept-count: <当tomcat启动的线程数达到最大时,接收排队请求数>
Spring Boot也支持使用Jetty或Undertow来替代tomcat,具体可看https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties。
若隔离策略是THREAD则参数为:
hystrix.threadpool..coreSize: 10
hystrix.threadpool..maximumSize: 10
hystrix.threadpool..maxQueueSize: -1 # 如该值为-1,那么使用的是SynchronousQueue,否则使用的是LinkedBlockingQueue。注意,修改MQ的类型需要重启。例如从-1修改为100,需要重启,因为使用的Queue类型发生了变化
若将HystrixThreadPoolKey改为default,则表示通用配置。
若隔离策略是SEMAPHORE则参数为:
hystrix.command..execution.isolation.strategy: SEMAPHORE
hystrix.command..execution.isolation.semaphore.maxConcurrentRequests: 10 # 默认值
若将HystrixThreadPoolKey改为default,则表示通用配置。
Feign默认使用JDK原声的URLConnection发送HTTP请求,没有连接池。在实际项目中,我们往往希望使用线程池来管理HTTP。要想使用线程池,需使用Apache HttpClient或OKHttp。
当使用Apache HttpClient,可配置连接数等信息:
feign:
httpclient:
enabled: true
max-connections: 200 # 默认值
max-connections-per-route: 50 # 默认值
代码详见:
org.springframework.cloud.netflix.feign.FeignAutoConfiguration.HttpClientFeignConfiguration#connectionManager
org.springframework.cloud.netflix.feign.ribbon.HttpClientFeignLoadBalancedConfiguration.HttpClientFeignConfiguration#connectionManager
当使用OKHttp时,可如下设置:
feign:
okhttp:
enabled: true
httpclient:
max-connections: 200 # 默认值
max-connections-per-route: 50 # 默认值
代码详见:
org.springframework.cloud.netflix.feign.FeignAutoConfiguration.OkHttpFeignConfiguration#httpClientConnectionPool
。org.springframework.cloud.netflix.feign.ribbon.OkHttpFeignLoadBalancedConfiguration.OkHttpFeignConfiguration#httpClientConnectionPool
。我们知道Hystrix有隔离策略:THREAD
以及SEMAPHORE
,默认是 SEMAPHORE
。
当Zuul的隔离策略为SEMAPHORE,此时可进行如下设置。
设置默认最大信号量:
zuul:
semaphore:
max-semaphores: 100 # 默认值
设置指定服务的最大信号量:
zuul:
eureka:
:
semaphore:
max-semaphores: 100 # 默认值
参考:
在Brixton.SR5及更早版本中,是 RibbonCommand
,从Brixton.SR6
开始,
只需写
即可,即:服务注册到Eureka Server上的名称。当Zuul的隔离策略为Thread(
zuul:
ribbon-isolation-strategy: thread
)时,首先,在Edgware及更高版本中,Zuul支持为微服务设置独立的Hystrix线程池
参考:http://www.itmuch.com/spring-cloud/edgware-new-zuul-hystrix-thread-pool/
zuul:
threadPool:
useSeparateThreadPools: true
除此之外,还可以使用如下配置进行调优。
zuul:
routes:
user-route: # 该配置方式中,user-route只是给路由一个名称,可以任意起名。
url: http://localhost:8000/ # 指定的url
path: /user/** # url对应的路径。
可使用如下属性配置并发参数:
zuul:
host:
max-total-connections: 200 # 默认值
max-per-route-connections: 20 # 默认值
:
ribbon:
MaxTotalConnections: 0 # 默认值
MaxConnectionsPerHost: 0 # 默认值
相关代码:org.springframework.cloud.netflix.ribbon.apache.HttpClientRibbonConfiguration
关闭过滤器
Zuul大多数功能都是基于过滤器是实现的。因此,如果一些过滤器使用不到,可考虑关闭,特别是,目前一些过滤器的实现并不高效。
例如FormBodyWrapperFilter,目前内部是通过加同步锁的方式实现的,性能较低。因此,如果你的微服务不包含Form表单,完全可以关闭该过滤器,以获取最大性能。
更多精彩内容,请扫我有惊喜。