zuul的性能调优

zuul的性能调优

在项目实践中,使用jemeter多线程并发访问微服务中的接口时候,在Zuul层出现异常、超时等,从而导致整个请求失败。经过实践,通过调整Zuul的参数、设计高可用架构等可提升TPS、QPS。

Zuul参数剖析

zuul下的routes节点可配置路由转发规则
设置全局ribbon


ribbon:
  ReadTimeout: 60000
  ConnectTimeout: 60000
  MaxAutoRetriesNextServer: 1
  MaxAutoRetries: 1  

设置单个路由

zuul:
 routes:
  echo:
   path:/ myusers / **
   serviceId:myusers-service
   stripPrefix:true
 
myusers-service:
 ribbon:#负载
  NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
  listOfServers:http://example1.com,http://example2.com
  ConnectTimeout:1000 
  ReadTimeout:3000 
  MaxTotalHttpConnections:500 
  MaxConnectionsPerHost:100

如上面的配置,HTTP请求中满足 /myusers/** 规则转发到myuser-service服务。结合ribbon,可支持myusers-service多实例的动态负载。实际项目中可集成eureka或者consul等自动获取listOfServers(多实例服务hosts列表)。

semaphore(信号量)

在spring cloud Zuul中有2种对路由的隔离机制,其默认的是信号量(semaphore)对路由做隔离,默认值是100,当一个路由请求的信号量高于100就返回500。

zuul:
 semaphore:
  max-semaphores: 5000 #设置全部路由最大信号量
 routes:
  orchestration:
  service-id: orchestration
resource-manager:
  service-id: resource-manager
   semaphore:
    max-semaphores: 5000 #针对单个服务的路由设置最大信号量

设置信号量,可在Zuul节点下对所有路由统一设置信号量(semaphore)大小,在实际项目中推荐为每个服务设置不同的信号量(semaphore)。

ribbon

SpringCloud中ribbon提供负载均衡能力,实际项目中后端不同服务都是多实例,因此从Zuul路由到某个服务也需要支持负载均衡。

zuul:
 ribbon:
  OkToRetryOnAllOperations:true     #全部请求开启重试机制
  ReadTimeout: 6000                 #请求处理超时时间
  ConnectTimeout: 6000              #请求连接超时时间
  MaxTotalHttpConnections: 1000     #最大http连接数
  MaxConnectionsPerHost: 100        #每个host最大连接数
  MaxAutoRetries: 10                #最大重试次数
  MaxAutoRetriesNextServer: 10      #切换实例的重试次数
 eureka:
  enabled: true

在高并发或者后端服务由于网络等原因,导致请求某一瞬间发生故障,也许后端服务只是暂时不可达或者响应比较慢。通过调整响应时间以及重试次数提高请求成功率。

hystrix

hystrix(熔断),当通过服务网关(基于Zuul实现)调用后端服务时候,难免会出现网络、响应超时等情况。通过hystrix可断掉与后端服务的连接,防止拖垮网关服务器。也可以通过hystrix实现服务降级,当发生异常时候,通过fallback处理熔断(比如:返回一些用户能看懂的错误提示等)。

hystrix:
 threadpool:
  default:
   coreSize: 1000   #线程池数量
 command:
  default:
   execution:
    isolation:
      thread:
        timeoutInMilliseconds: 60000  #发生熔断的超时时间
        strategy: SEMAPHORE   #隔离策略
       semaphore:
        max-semaphores: 2000 #信号量大小

高并发下常见Zuul异常

在高并发下,针对不同的系统架构、业务场景。需要自己调整Zuul各组件参数来满足性能需求。我们在使用jemeter进行并发测试,发现Zuul(服务网关)层出现了一些异常信息,解决了这些异常信息,QPS,TPS都提高了不少。

  • 无法获取信号量(semaphore异常)

spring cloud zuul : could not acquire a semaphore for execution and no fallback
available.
无法获取信号量,系统默认每个路由的信号量为100,当后端一个实例且并发大于100就会经常出现这个异常信息

调优配置:

zuul:
 semaphore:
  max-semaphores: 5000 #可根据系统需要支持的并发数适当增加信号量的大小
  
  • 超时

异常信息:

connect time out…
当并发访问时,有些服务所在主机响应可能会比较慢,或者某些业务本身比较耗时(比如上传一个大文件的接口)。如果在Zuul层设置的超时时间小于足业务的耗时, 会导致正常的业务请求失败。

调优配置:

ribbon:
 ReadTimeout: 6000                 #请求处理超时时间
 ConnectTimeout: 6000              #请求连接时间根据业务可适当调大超时时间

熔断

异常信息:

short-circuited and no fallback available
并发访问时,后端某些服务发生熔断

调优配置:

hystrix:
 command:
  default:
   execution:
    isolation:
      thread:
        timeoutInMilliseconds: 60000  #发生熔断的超时时间调整熔断超时时间,熔断时间太短,些耗时的业务部不能work熔断时太长,Zuul服务器可能会被拖垮。所以根据具体业务找到一个合适值。
ribbon:
 OkToRetryOnAllOperations:true     #全部请求开启重试机制
 ReadTimeout: 6000                 #请求处理超时时间
 ConnectTimeout: 6000              #请求连接超时时间
 MaxAutoRetries: 10                #最大重试次数调整重试次数,实际项目中由于网络或者资源不够,偶尔会出现后端服务不能访问,一次访问失败不能代表后端服务就挂了。因此开启重试机制,调整重试次数。在一定时间内,重试几次都失败,我们才认为后端服务挂了。

zuul 1.x 与2.x的区别与总结

1、1.x 同步阻塞,编程模型简单,社区成熟,通过调整参数能满足生产性能需求
2、2.x 异步非阻塞,相对编程模型复杂,刚出来也许还有些坑(bug),追求更好性能可以尝试

当高并发情况下,服务网关服务器(Zuul)可通过以下方法提高支持并发的能力。
1、调整Zuul组件参数
2、支持Zuul高可用,多实例
3、选择异步、非阻塞版本

转载:https://mp.weixin.qq.com/s/7S9zPM5lBDtOwtNJ5JOZyQ
https://blog.csdn.net/zhangzijiejiayou/article/details/101070379/

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
"getaway zuul" 是一个网络流行语,原意是指一种通过转移注意力或脱身的方式来逃避困难或尴尬局面。这个短语来源于电影《捍卫者联盟》中一只名叫尤尔的角色,它具有很强的逃避能力。 在生活中,我们经常面临各种挑战和压力,有时候可能会感到束手无策或不知所措。这时候,采用getaway zuul的方式可能会给我们带来一些启示。 getaway zuul提醒我们要学会转移注意力和寻找解决问题的新角度。当我们陷入僵局时,可以试着暂时将焦点从问题上转移到其他事物上,例如参加一项爱好活动、与朋友聚会或者只是简单地放松自己。通过转移注意力,我们的思维可能会得到缓解,从而更容易找到解决问题的新方向。 此外,getaway zuul也提醒我们要有一种适时的“脱身”能力。当我们身陷困境或者面对尴尬场面时,有时候选择适当地离开或者改变环境可能会更加明智。这样可以减少冲突的升级或者尴尬的尺度,更有利于我们保持心态的平衡和保护自己的形象。 然而,getaway zuul并不意味着逃避责任或者逃避困难。在面对挑战时,我们要有勇气正视问题,并采取积极的行动来解决。getaway zuul更倾向于提醒我们要灵活应对情况,用更智慧的方式处理问题,而不是盲目地与问题对抗。 在人生的旅途中,getaway zuul 可以给我们带来新的思维角度,帮助我们更好地应对挑战与压力。我们需要学会寻找平衡点,既不被困扰,也不盲目逃避,而是用更明智的方式面对困难,获得更好的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上编程2705

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值