springcloud gateway 性能优化

网关功能

在这里插入图片描述

性能瓶颈分析

执行主要时间分布排名:

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
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值