实用技巧:快速定位Zuul的性能瓶颈

标签: Spring Cloud Spring Cloud Zuul | 发表时间:2019-03-09 23:39 | 作者:
出处:http://www.itmuch.com/

Zuul的性能不是特别好,特别是,某些项目对Zuul进行了一些扩展,代码还不那么考究时。

如何快速定位出Zuul的性能瓶颈呢?我们知道,Zuul的核心是过滤器,Zuul大多功能都是基于过滤器实现的。

一次请求,会经过若干过滤器,如何查看每个过滤器执行的耗时呢?只需开启Zuul的Debug能力即可。

本文基于Spring Cloud Finchley,同样适用于Spring Cloud Greenwich。

Edgware及更早版本,需配置 management.security.enabled = false ,并本文的 /actuator/httptrace 改为 /trace

TIPS

如果您对Zuul的过滤器不太了解,可先阅读如下两篇文章:

开启Debug参数

1     
2
3
4
5
6
7
zuul:     
include-debug-header: true
management:
endpoints:
web:
exposure:
include: '*'

这样,只需在访问Zuul时,添加 ?debug=true 即可对Zuul进行Debug。例如监控路径 ZUUL_HOST:ZUUL_PORT/SOME_PATH 经过了哪些过滤器,性能瓶颈出现在哪个过滤器,只需构造 ZUUL_HOST:ZUUL_PORT/SOME_PATH?debug=true 即可。

请求后,访问 ZUUL_HOST:ZUUL_PORT/actuator/httptrace ,即可看到类似如下的结果:

1     
"X-Zuul-Debug-Header": ["[[[Filter pre 5 PreDecorationFilter]]][[[Filter {PreDecorationFilter TYPE:pre ORDER:5} Execution time = 1ms]]][[[{PreDecorationFilter} added retryable=false]]][[[{PreDecorationFilter} added ignoredHeaders=[authorization, set-cookie, cookie]]]][[[{PreDecorationFilter} added originResponseHeaders=[com.netflix.util.Pair@d68cf7e9]]]][[[{PreDecorationFilter} added zuulRequestHeaders={x-forwarded-host=localhost:8040, x-forwarded-proto=http, x-forwarded-prefix=/microservice-provider-user, x-forwarded-port=8040, x-forwarded-for=0:0:0:0:0:0:0:1}]]][[[{PreDecorationFilter} added requestURI=/users/1]]][[[{PreDecorationFilter} added proxy=microservice-provider-user]]][[[{PreDecorationFilter} changed executedFilters=ServletDetectionFilter[SUCCESS][0ms], Servlet30WrapperFilter[SUCCESS][0ms], DebugFilter[SUCCESS][0ms], PreDecorationFilter[SUCCESS][1ms]]]][[[{PreDecorationFilter} added serviceId=microservice-provider-user]]][[[Invoking {route} type filters]]][[[Filter route 10 RibbonRoutingFilter]]][[[Filter {RibbonRoutingFilter TYPE:route ORDER:10} Execution time = 9ms]]][[[{RibbonRoutingFilter} changed originResponseHeaders=[com.netflix.util.Pair@d68cf7e9, com.netflix.util.Pair@694b84a6, com.netflix.util.Pair@a4baea16, com.netflix.util.Pair@99438774]]]][[[{RibbonRoutingFilter} added responseDataStream=org.apache.http.conn.EofSensorInputStream@1145027a]]][[[{RibbonRoutingFilter} added zuulResponseHeaders=[com.netflix.util.Pair@694b84a6, com.netflix.util.Pair@99438774]]]][[[{RibbonRoutingFilter} added responseStatusCode=200]]][[[{RibbonRoutingFilter} added responseGZipped=false]]][[[{RibbonRoutingFilter} added ribbonResponse=org.springframework.cloud.netflix.ribbon.apache.RibbonApacheHttpResponse@5e2ce130]]][[[{RibbonRoutingFilter} changed executedFilters=ServletDetectionFilter[SUCCESS][0ms], Servlet30WrapperFilter[SUCCESS][0ms], DebugFilter[SUCCESS][0ms], PreDecorationFilter[SUCCESS][1ms], RibbonRoutingFilter[SUCCESS][9ms]]]][[[{RibbonRoutingFilter} added zuulResponse=org.springframework.cloud.netflix.ribbon.RibbonHttpResponse@1e0eabde]]][[[Filter route 100 SimpleHostRoutingFilter]]][[[Filter route 500 SendForwardFilter]]][[[Invoking {post} type filters]]][[[Filter post 1000 SendResponseFilter]]]"],     

由结果可知,该端点依次打印了请求经过了哪些过滤器、每个过滤器的耗时。 简单分析一下,就能了解Zuul的性能瓶颈了。

开启默认Debug

经过上面的配置,已实现对Zuul的Debug,但每次都要添加一个 debug=true 的小尾巴,也是挺烦的,如果不想添加,而想让Zuul默认就对请求开启Debug,该怎么办呢?

也非常简答,只需在上文的基础上,添加如下配置即可:

1     
2
3
zuul:     
debug:
request: true

这样,即使不添加 debug=true ,Zuul也会Debug。

相关源码

相关源码其实比较简单,就一个类: org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter,有兴趣的童鞋可以了解一下。

相关 [技巧 zuul 性能] 推荐:

实用技巧:快速定位Zuul的性能瓶颈

- - 周立的博客 - 关注Spring Cloud、Docker
Zuul的性能不是特别好,特别是,某些项目对Zuul进行了一些扩展,代码还不那么考究时. 如何快速定位出Zuul的性能瓶颈呢. 我们知道,Zuul的核心是过滤器,Zuul大多功能都是基于过滤器实现的. 一次请求,会经过若干过滤器,如何查看每个过滤器执行的耗时呢. 只需开启Zuul的Debug能力即可.

聊聊 API Gateway 和 Netflix Zuul

- - ScienJus's Blog
最近参与了公司 API Gateway 的搭建工作,技术选型是 Netflix Zuul,主要聊一聊其中的一些心得和体会. 本文主要是介绍使用 Zuul 且在不强制使用其他 Neflix OSS 组件时,如何搭建生产环境的 Gateway,以及能使用 Gateway 做哪些事. 不打算介绍任何关于如何快速搭建 Zuul,或是一些轻易集成 Eureka 之类的的方法,这些在官方文档上已经介绍的很明确了.

使用OAUTH2+Zuul实现认证和授权 GitHub - wiselyman/uaa-zuul:

- -
在 Spring Cloud需要使用 OAUTH2来实现多个微服务的统一认证授权,通过向 OAUTH服务发送某个类型的 grant type进行集中认证和授权,从而获得 access_token,而这个token是受其他微服务信任的,我们在后续的访问可以通过 access_token来进行,从而实现了微服务的统一认证授权.

spring-cloud中zuul的两种隔离机制实验

- - ImportNew
ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常. 查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高于100那么就拒绝服务了,返回500. 既然默认值太小,那么就在gateway的配置提高各个路由的信号量再实验.

SQL性能调优技巧

- - 数据库 - ITeye博客
Data Model设计的Tip. 以三个范式为基础,业务的独立性和原子性拆分要合适,杜绝Key的冗余和不充分依赖. 对于有NULL值的时候,说明可以拆分为子类, 如果有互斥值,比如两个字段,如果A有值,那么B就不能有值. 隐藏的约束,某个Column为A值,那么另外一个Column就必须为B值,或者某个Column只能是1~20的值.

HTML性能优化技巧

- - JavaScript - Web前端 - ITeye博客
如何提升Web页面的性能,很多开发人员从多个方面来下手如JavaScript、图像优化、服务器配置,文件压缩或是调整CSS. 很显然HTML 已经达到了一个瓶颈,尽管它是开发Web 界面必备的核心语言. HTML页面的负载也是越来越重. 大多数页面平均需要40K的空间,像一些大型网站会包含数以千计的HTML 元素,页面Size会更大.

Hibernate性能优化技巧

- - SQL - 编程语言 - ITeye博客
文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session. clear()或者session. evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象.

Java程序性能优化技巧

- - CSDN博客推荐文章
如果循环次数很多,循环体内代码处理不好问题就会被放大. for(int i=0;i

Java 性能优化的五大技巧

- - ImportNew
要对你的 java 代码进行优化,需要理解 java 不同要素之间的相互作用,以及它是如何与其运行时的操作系统进行交互的. 使用下面这五个技巧和资源,开始学习如何分析和优化你的代码吧. 在我们开始之前, 你也许会担心许可的问题. Java 为 Oracle 公司所有,遵循 Oracle 的 BCL 许可,该许可证不是一个免费/开源许可证.

性能优化的方法和技巧:系统

- tiod - 弯曲评论
从系统层次去优化系统往往有比较明显的效果. 但是,在优化之前,我们先要问一问,能否通过扩展系统来达到提高性能的目的,比如:. Scale up: 用更强的硬件替代当前的硬件. Scale out: 用更多的部件来增强系统的性能. 使用更强的硬件当然和优化没有半点关系,但是如果这是一个可以接受的方案,为什么不用这个简单易行的方案哪.