Zuul网关调优「建议收藏」

Zuul网关调优「建议收藏」网关的大部分工作是请求转发,属于IO密集型的应用,我们要在有限的资源的情况下结合公司实际请求场景做调优。一,容器选择在容器方面,undertow的呼声很高,一个是他很轻量级的,其次他属于java开发,性能也很好,笔者根据实际情况对tomcat和undertow做了一个对比默认配置下,8核cpu,tomcat启动后会初始化10个io线程,而undertow会初始化72个线程,8个IO线程,64个work线程(8*8)性能对比:写一个接口,接口中什么也不做,就睡眠2s请求个数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

网关的大部分工作是请求转发,属于IO密集型的应用,我们要在有限的资源的情况下结合公司实际请求场景做调优。

一,容器选择

在容器方面,undertow的呼声很高,一个是他很轻量级的,其次他属于java开发,性能也很好,笔者根据实际情况对tomcat和undertow做了一个对比

默认配置下,8核cpu,tomcat启动后会初始化10个io线程,而undertow会初始化72个线程,8个IO线程,64个work线程(8*8)

性能对比:写一个接口,接口中什么也不做,就睡眠2s

请求个数 tomcat tomcat(max-threads:100) undertow
50 平均耗时(ms): 2241 2241 2321
线程个数: 93 93 105
内存 94 133
100 平均耗时(ms): 2231 2021 2517
线程个数: 143 138 105
内存
200 平均耗时(ms): 2424 2788 3884
线程个数: 238 138 105
内存
300 平均耗时(ms): 3596 3753 5454
线程个数: 238 138 105
内存
400 平均耗时(ms): 3427 4623 6865
线程个数: 238 138 105
内存

从对比来看,就初始化来看,tomcat最初只初始化10个线程,而undertow则会初始化所有的线程

性能来看,tomcat也是要占优势的

tomcat 比undertow要灵活,适应高峰和低谷也比较强

二,hystrix隔离方式

zuul默认的是信号量方式,也就是控制进来的请求总量,可以全局配置,也可以配置单个服务的最大信号量,还有一种方式是线程隔离,每种路由方式会创建单独的线程池,这样的好处是一个服务的影响不会扩散到其他的服务,但是在资源有限,且服务有限的情况下,还是信号量合适,这样我们可以充分利用tomcat创建的线程池,而不用创建过多的hystrix线程池

三:ribbon相应时间:

在默认的情况下,ribbon很容易就会报错,比如read timeout等,可以通过

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

来控制,但是如果设置过长也会导致长时间的等待,建议60比较合适

四:httpclient选择

zuul默认是Appache Httpclient,呼声比较高的是okhttp

但是经过测试,okhttp的性能更好,所以可以通过

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
</dependency>

引入okhttp并在ribbon中配置:

ribbon:
  httpclient:
    enabled: false
  okhttp:
    enabled: true

五:超时配置

使用zuul时,一共有三个超时参数

1.zuul.host.socket-timeout-millis和zuul.host.connect-timeout-millis这个超时是指在使用url路由时,则使用这里的超时,ribbon配置的超时将不会生效

2.ribbon.ReadTimeout 和ribbon.ConnectTimeout这个就是服务名路由时的超时

3.hystrix.command.execution.isolation.thread.timeoutMilliseconds这个超时在线程隔离的模式下是hystrix的熔断超时,应该大于ribbon和zuul的超时,还需加上重试的时间,在信号量隔离模式下是信号量的释放时间,也就是说如果你这里配置2 ,但是接口执行时间是5s,那么到了2秒后依然会释放信号量

还有一点需要注意的是hystrix.command.default.circuitBreaker.requestVolumeThreshold默认是20,也就是说如果熔断器失败了20个后就会开启CIRCUIT_OPEN模式这个也需结合实际情况来进行配置

六:jvm参数

根据目前dev环境情况(没有数据),以及本地测试(使用jmeter提交400个请求),网关一般情况下对内存使用为80M左右,老年代为36M左右,元数据空间为63M左右,可以保守设置为堆内存代销为300M,年轻代150M, 老年代150M,

而默认情况下,NewRatio=2 ,  而在JVM的默认参数中MetaspaceSize=21M , 这样会导致前期jvm调整metaspacesize大小并发生fullgc所以咱们可以设置一下jvm参数

-Xms300m -Xmx300m -XX:NewRatio=1 -XX:MetaspaceSize=100m

该配置下程序启动发生YGC :4   FGC : 0    堆中 E:80M , T : 0 M , F : 19M , O:9M ,Me:56M 

连续发起1600次请求后:YGC:10  FGC: 0    堆中:E:71M , T:0M , F : 10M, O:34M , Me: 62M

后期可根据生产实际情况调整大小

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170623.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Gradle教程–基础篇

    Gradle教程–基础篇Gradle是什么Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。安装Gradle在AndroidStudio中新建项目成功后会下载Gradle,貌似这个过程不翻墙也是可以下载,但是访问特别慢,建议翻墙下载。那么下载的Gradle到什么地方呢,或者说Gradle的本

    2022年6月28日
    34
  • Gradle DSL method not found: ‘android()

    Gradle DSL method not found: ‘android()

    2022年3月5日
    61
  • UPX脱壳总结

    UPX脱壳总结我近期研究了一下UPX壳的脱壳方法,下面给出脱壳示例:UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒【熊猫烧香】就是使用这款加密壳。现在我们一起来脱UPX壳来揭开它的神秘面纱。首先,PEiD载入含UPX壳的程序,结果如下:UPX0.89.6-1.02/1.05-1.24->Markus&Laszlo然后用OD载入,OEP如下:

    2022年7月12日
    26
  • 鸿蒙HarmonyOS应用开发初体验[通俗易懂]

    鸿蒙HarmonyOS应用开发初体验[通俗易懂]https://developer.huawei.com/consumer/cn/forum/communityHome近期(4.12~4.25)鸿蒙OS正在举行开发者日活动,趁机参加并了解一下鸿蒙OS的现状和应用开发体验。1.开发环境搭建下载安装IDE(当前版本2.1Beta3)华为为Harmony应用开发提供了配套的IDE:DevEcoStudio(内心比较排斥这种带Eco字眼儿的命名,PPT怎么吹无所谓,开发工具咱能不能务实一点儿?)下载IDE需要登录Huawei账号,我安装.

    2022年5月18日
    51
  • 黎曼猜想和素数分布的关系_黎曼公式和素数的关系

    黎曼猜想和素数分布的关系_黎曼公式和素数的关系自然数简化到素数:黎曼猜想RiemannHypothesis及其解释(公号回复“黎曼猜想”下载PDF经典收藏版彩标资料)原创:秦陇纪数据简化DataSimp今天数据简化DataSimp导读:科学大院《黎曼猜想RiemannHypothesis简介》来自黄逸文(中国科学院数学与系统科学研究院),介绍了黎曼猜想RiemannHypothesis大概。知乎译文《黎曼猜想Riemann…

    2022年8月11日
    41
  • iOS—-SIGPIPE信号终止进程[通俗易懂]

    iOS—-SIGPIPE信号终止进程[通俗易懂]#概念:SIGPIPE,当一个程序a调用send函数向一个服务A发送信号的数据,服务A在接收数据的时候突然挂掉、无法接收数据、没有接收者,那么内核就会发送一个SIGPIPE信号,从而中断进程,导致程序退出。#调用signal(SIGPIPE,SIG_IGN);对一个已经收到FIN包的socket调用read方法,如果接收缓冲已空,则返回0,这就是常说的表示连接关闭.但第一次对其调用…

    2022年7月17日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号