网关功能
性能瓶颈分析
执行主要时间分布排名:
1.接受用户请求处理,占比 33%
2.执行黑白名单、jwt业务逻辑,占比20%
3.数据写入、连接处理,占比20%
4.后端响应数据处理,占比11%
业务代码占用cpu时间并不长,大部分都是在执行reactor内部逻辑
为了抽象reactor操作本身就是层层封装
有一些观测组件向里面插入了拦截操作
链路跟踪组件sleuth的节点分布在各个操作中
sleuth组件会将操作植入ractor 操作节点
打印线程堆栈,经常可以看到这个堆栈
链路组件sleuth依赖MDC进行日志trace信息透传。LogbackMDCAdapter是做了本地线程变量,但是处理过程会在多个线程上切换,导致了锁竞争
一个pipeline执行路径往往会出现两个分叉
推测:netty解析时,只会解码http head,body只会在需要的时候再处理。待验证
总结:
目前网关cpu是主要资源瓶颈
网关基于事件循环模型进行处理,线程较少,线程切换不是主要瓶颈
事件循环路径上并没有io阻塞的情况,io非核心瓶颈
扩展组件占cpu资源很小,主要资源消耗还是框架自身代码
优化方案
压测报告
代码改造
日志格式
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 可配置变量 -->
<springProperty scop="context" name="APPLICATION_NAME" source="spring.application.name" defaultValue="xxxxxx" />
<!-- 工程相关日志,日志级别 TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF(关闭日志输出) -->
<variable name="APPLICATION_LOG_LEVEL" value="${APPLICATION_LOG_LEVEL:-INFO}" />
<variable name="ROOT_LOG_LEVEL" value="${ROOT_LOG_LEVEL:-INFO}" />
<variable name="DEVTOOLS_LOG_LEVEL" value="${DEVTOOLS_LOG_LEVEL:-WARN}" />
<conversionRule conversionWord="XBTraceId" converterClass="com.xxxxxx.gateway.vip.log.XB3TraceIdConverter" />
<conversionRule conversionWord="XBSpanId" converterClass="com.xxxxxx.gateway.vip.log.XB3SpanIdConverter" />
<appender name="asyncConsoleAppender" class="net.logstash.logback.appender.LoggingEventAsyncDisruptorAppender">
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<!-- UTC 等等 -->
<timeZone>Asia/Shanghai</timeZone>
</timestamp>
<pattern>
<pattern>
{
"hostname": "${HOSTNAME}",
"severity": "%level",
"service": "${APPLICATION_NAME:-}",
"trace": "%XBTraceId{-}",
"span": "%XBSpanId{-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message %ex{full}"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
</appender>
<!-- application -->
<logger name="com.xxxxxx" level="${APPLICATION_LOG_LEVEL}" />
<!-- spring boot ConditionEvaluationDeltaLoggingListener 日志 -->
<logger name="org.springframework.boot.devtools.autoconfigure.ConditionEvaluationDeltaLoggingListener"
level="${DEVTOOLS_LOG_LEVEL}" />
<logger name="brave.Tracer"
level="${DEVTOOLS_LOG_LEVEL}" />
<root level="${ROOT_LOG_LEVEL}">
<appender-ref ref="asyncConsoleAppender" />
</root>
</configuration>
configuation
package com.xxxxxx.starter.autoconfigure.config;
import brave.Tracer;
import brave.Tracing;
import com