Spring Cloud常见问题与总结(三)

版权声明:本文为博主原创文章,可自由转载、引用,但需注明文章出处。 https://blog.csdn.net/StarskyBoy/article/details/83662685

一.Spring Cloud各组件重试

Spring Cloud各组件的重试配置。

早期,Spring Cloud的重试机制是比较混乱的-各个组件都有自己的重试机制,例如Ribbon、Feign、Zuul。官方也意识到了这个问题,并对重试相关逻辑进行了改造与简化。

在Spring Cloud Edgware中,配置重试是非常简单的。

重试步骤

1.重试依赖spring-retry,因此引入重试依赖

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

2.配置重试

<client>
  ribbon:
    # 同一实例最大重试次数,不包括首次调用
    MaxAutoRetries: 1 
    # 重试其他实例的最大重试次数,不包括首次所选的server
    MaxAutoRetriesNextServer: 2 
    # 是否所有操作都进行重试
    OkToRetryOnAllOperations: false

其中<client>是Ribbon Client名称,表示对指定名称的Ribbon Client进行重试。如果省略,则表示对所有Ribbon Client都进行重试。

3.对于Zuul,重试特性默认关闭。可使用zuul.retryable=true全局打开重试,也可使用zuul.routes.<routename>.retryable=true打开指定<routename>重试。

基于HTTP响应码重试

Spring Cloud也支持基于HTTP响应码进行重试,只需使用类似如下的配置即可:

<clientName>:
  ribbon:
    retryableStatusCodes: 404,502

关闭重试

1.对于其它组件,可配置spring.cloud.loadbalancer.retry.enabled=false.

2.对于zuul,可配置zuul.retryable=false或zuul.routes.<routename>.retryable=true.

注意点

  • Hystrix的超时时间必须大于超时的时间,否则,一旦Hystrix超时,就没办法继续重试了。
  • 一般来说,不建议将ribbon.OkToRetryOnAllOperations 设为true。因为一旦启用该配置,则表示重试任何操作,包括POST请求,而由于缓存了请求体,此时可能会影响服务器的资源。

参考文档

http://cloud.spring.io/spring-cloud-static/Edgware.RELEASE/single/spring-cloud.html#retrying-failed-requests

 

二.Spring Cloud各组件调优

Spring Cloud各组件的调优配置。

注:只讨论组件本身的优化配置,不讨论JVM参数配置。

1.Tomcat参数

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。

2.Hystrix参数

若隔离策略是THREAD则参数为:

hystrix.threadpool.<HystrixThreadPoolKey>.coreSize: 10
hystrix.threadpool.<HystrixThreadPoolKey>.maximumSize: 10
hystrix.threadpool.<HystrixThreadPoolKey>.maxQueueSize: -1 # 如该值为-1,那么使用的是SynchronousQueue,否则使用的是LinkedBlockingQueue。注意,修改MQ的类型需要重启。例如从-1修改为100,需要重启,因为使用的Queue类型发生了变化

若将HystrixThreadPoolKey改为default,则表示通用配置。

若隔离策略是SEMAPHORE则参数为:

hystrix.command.<HystrixThreadPoolKey>.execution.isolation.strategy: SEMAPHORE
hystrix.command.<HystrixThreadPoolKey>.execution.isolation.semaphore.maxConcurrentRequests: 10 # 默认值

若将HystrixThreadPoolKey改为default,则表示通用配置。

3.Feign参数

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

4.zuul参数

我们知道Hystrix有隔离策略:THREAD 以及SEMAPHORE ,默认是 SEMAPHORE

当Zuul的隔离策略为SEMAPHORE,此时可进行如下设置。

设置默认最大信号量:

zuul:
  semaphore:
    max-semaphores: 100 # 默认值

设置指定服务的最大信号量:

zuul:
  eureka:
    <commandKey>:
      semaphore:
        max-semaphores: 100 # 默认值

参考:

当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

除此之外,还可以使用如下配置进行调优。

  • 对于执行SimpleHostRoutingFilter过滤器的路由,可将路由配置如下:
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 # 默认值
  • 对于执行RibbonRoutingFilter的路由,可使用如下属性配置并发参数:
    <service-Id>:
      ribbon:
        MaxTotalConnections: 0   # 默认值
        MaxConnectionsPerHost: 0 # 默认值

    相关代码:org.springframework.cloud.netflix.ribbon.apache.HttpClientRibbonConfiguration

关闭过滤器

Zuul大多数功能都是基于过滤器是实现的。因此,如果一些过滤器使用不到,可考虑关闭,特别是,目前一些过滤器的实现并不高效。

例如FormBodyWrapperFilter,目前内部是通过加同步锁的方式实现的,性能较低。因此,如果你的微服务不包含Form表单,完全可以关闭该过滤器,以获取最大性能。

更多精彩内容,请扫我有惊喜。

猜你喜欢

转载自blog.csdn.net/StarskyBoy/article/details/83662685
今日推荐