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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • git操作名词解释

    git操作名词解释

    2022年3月3日
    64
  • servlet setattribute用法_servlet禁用session

    servlet setattribute用法_servlet禁用session这两天一直在做手机验证码的工作,ajax一下子就连通了,但是session存放发送给手机的随机验证码就无法读出来了(其实不是无法读出来,往下看),导致无法验证用户填写的手机验证码,于是我查了session的一些过期设置,还一度怀疑setMaxInteractiveInterval()的参数单位是不是毫秒。弄了下个下午之后实在受不了,我一直往session是不是第二次请求action时就过期了的方向去

    2022年10月11日
    4
  • dex文件详解

    dex文件详解1、基本概念能被DVM虚拟机识别,加载并执行的文件格式2、生成dex文件1、通过IDE自动帮我们build生成2、手动通过dx命令去生成dex文件3、在手机上手动运行dex文件3、使用dx命令来生成dex文件首先得要先配置dx环境变量,这个环境变量怎么配呢?找到的sdk的安装目录,然后进入build-tools目录,这里是你电脑上的所有sdk的安装目录,随便选择一个进去,就可以知道dx.b

    2022年6月27日
    63
  • JSP动作元素

    JSP动作元素分类<jsp:includepage="content.jsp"></jsp:include>使用<%@include%>

    2021年12月24日
    46
  • 日志采集系统flume和kafka有什么区别及联系,它们分别在什么时候使用,什么时候又可以结合?

    日志采集系统flume和kafka有什么区别及联系,它们分别在什么时候使用,什么时候又可以结合?日志采集系统flume和kafka有什么区别及联系,它们分别在什么时候使用,什么时候又可以结合?观点一:简言之:这两个差别很大,使用场景区别也很大。先说flume:日志采集。线上数据一般主要是落地文件或者通过socket传输给另外一个系统。这种情况下,你很难推动线上应用或服务去修改接口,直接向kafka里写数据。这时候你可能就需要flume这样的系统帮你去做传输。对于数量级别,做过单机upd的fl…

    2022年6月23日
    39
  • spring 注解验证@NotNull等使用方法「建议收藏」

    spring 注解验证@NotNull等使用方法「建议收藏」常用标签@Null被注释的元素必须为null@NotNull被注释的元素不能为null@AssertTrue被注释的元素必须为true@AssertFalse被注释的元素必须为false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(

    2022年6月13日
    36

发表回复

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

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