palace是什么牌子| 杨柳代表什么生肖| 晚上吃什么| 梅花是什么颜色| 顺子是什么意思| 海螺吃什么| 杠杆炒股是什么意思| 膝关节疼痛吃什么药好| 胸口有痣代表什么意思| 直肠炎是什么症状| 美缝剂什么牌子的好| 血冲脑是什么原因引起| 肝脏纤维化是什么意思| 为什么男人喜欢邓文迪| 生理期肚子疼吃什么药| 小别胜新婚是什么意思| 主人是什么意思| 指甲空了是什么原因| 妹汁是什么| 玉米属于什么类食物| 什么是产品| 决堤是什么意思| 身上有淤青是什么原因| 章子怡是什么脸型| 笑靥如花什么意思| 慢性宫颈炎是什么意思| 芝麻什么时候种| 纯粹什么意思| 肠镜前一天吃什么| 什么叫玄关| 小孩子口臭是什么原因| 46什么意思| 窦骁的父母是干什么的| 鼻尖疼是什么原因| 糖类抗原125偏高是什么意思| 孩子肚子疼挂什么科| 跨界是什么意思| 向日葵代表什么象征意义| 膝盖痒是什么原因| 蓝莓对身体有什么好处| 吃什么对眼睛好| 白蚂蚁长什么样子图片| 脸上经常长痘痘是什么原因| 蛀牙的早期症状是什么| 上火了喝什么降火最快| 吃了避孕药不能吃什么东西| 深夜里买醉是什么歌| 骨痂是什么意思| 侧记是什么意思| lsil什么意思| 过敏性结膜炎用什么眼药水最好| 晕车药叫什么名字| 头发容易断是什么原因| 圆脸适合什么发型| 扩容是什么意思| 经常手瘾吃什么药| 刷牙时牙酸是什么原因| 为什么会感染hpv| 海市蜃楼是什么现象| 砧板是什么工作| 初字五行属什么| 沐五行属性是什么| 子官肌瘤吃什么食物| 为什么会长老年斑| 饭局是什么意思| 金牛男喜欢什么类型的女生| 胃疼想吐恶心是什么原因| 三个大是什么字| 啤酒和什么不能一起吃| 车牌字体是什么字体| 戳是什么意思| 奶头疼是什么原因| 水奶和奶粉什么区别| 土生金是什么意思| 梦到自己结婚什么意思| 什么是社恐| 女孩学什么专业好就业| 幽门螺杆菌用什么药| 羊驼吃什么| 火命适合什么颜色| 手足口疫苗叫什么名字| 不妄作劳什么意思| 胎盘后壁是什么意思| 私联是什么意思| 诊查费是什么| 痛风是什么引起的| 1025是什么星座| 狗吐黄水吃什么药| 老年人腿浮肿是什么原因引起的| 梦见死人和棺材预示着什么| 乙肝复查检查什么项目| 煮茶叶蛋用什么茶| 个子矮穿什么好看| 请多指教是什么意思| 迦字五行属什么| 什么叫切片| 猪朋狗友是什么意思| 让您费心了是什么意思| 复杂囊肿是什么意思| 阴虱用什么药可以根除| hcv是什么| 梦见买豆腐是什么意思| 减肥吃什么米| 乳铁蛋白是什么| 顾名思义的顾什么意思| 7月6日是什么节日| 椅子像什么| 阳历3月是什么星座| 西米露是什么做的| m表示什么| 返点是什么意思| 什么预警停课| 补位是什么意思| pvc是什么意思| 尿道口感染吃什么药| 可悲可叹是什么意思| 精子有点黄是什么原因| 连长是什么级别| 第一胎打掉会有什么影响| 儿童中耳炎用什么药最好| 经常口腔溃疡是什么原因| 下面瘙痒是什么原因| 早餐吃什么比较好| 最快的减肥运动是什么| 鲨鱼为什么怕海豚| 6.1什么星座| 三虫念什么| 心脏突然剧烈跳动是什么原因| 树大招风的意思是什么| 黄热病是什么病| 粘连是什么意思| 统招是什么意思| 红豆大红豆芋头是什么歌| 手机为什么突然关机| 30度穿什么衣服合适| 前列腺钙化灶是什么| 鹤字五行属什么| 什么是菊粉| 解辣喝什么| 黑米和紫米有什么区别| 桂花是什么生肖| 念珠菌和霉菌有什么区别| may是什么意思| 口腔溃疡是什么样子| 1020是什么星座| 脑梗能吃什么水果| 谷子是什么| 感染艾滋病有什么症状| 一清二白是什么意思| 甜瓜不能和什么一起吃| 水煎是什么意思| 眼睛下面有痣代表什么| dht是什么意思| 枸杞搭配什么喝最好| 一什么天安门| 肺结节吃什么好| 什么是肾阴虚和肾阳虚| 防微杜渐是什么意思| 猪宝是什么东西| 正月二十是什么星座| 喉咙扁桃体发炎吃什么药| 5月23号是什么星座| 一般什么人戴江诗丹顿| 钛是什么颜色| 今年清明节有什么讲究| 盐酸安罗替尼胶囊主要治疗什么| 盆腔ct能检查出什么病| 股骨头坏死有什么症状| 切片是什么| 出火是什么意思| 查乙肝挂什么科| 手淫过多会导致什么| 龟苓膏是什么| 头晕用什么药好| 脚肿了是什么原因引起的| 眼开大财主是什么生肖| 环比是什么意思| 二狗子是什么意思| 恩惠是什么意思| 真人是什么意思| mg是什么意思| 1907年属什么生肖| 什么是春梦| 感冒能吃什么| 生粉是什么粉| 病人打白蛋白意味着什么| 肿瘤长什么样| 什么面| 鼻炎看什么科| 左是什么结构的字| 子宫破裂有什么征兆| 用什么刷牙能使牙齿变白| 平衡液是什么| 文曲星什么意思| 胎停是什么原因引起的| 阴毛长虱子用什么药| 贴图是什么意思| 禾真念什么| 西湖醋鱼是什么鱼| 鳄鱼的天敌是什么动物| 为什么尿黄| 摩羯座是什么象星座| 玫琳凯属于什么档次| 姨太太是什么意思| 黄芪泡水有什么好处| 七月什么星座| 我会送你红色玫瑰是什么歌| 谷丙转氨酶什么意思| winbond是什么品牌| 烤箱可以烤些什么东西| 5月31号是什么星座| 中国发明了什么| 甲胎蛋白增高说明什么| 副团级是什么军衔| 头痛头晕吃什么药| 女生小便带血是什么原因| havva是什么牌子| 销魂什么意思| 总打哈欠是什么原因| pending是什么意思| 刘嘉玲什么星座| 危楼高百尺的危是什么意思| 雪花秀属于什么档次| 坐怀不乱柳下惠什么意思| 辽宁古代叫什么| 仁波切是什么意思| hepes缓冲液是什么| 斯德哥尔摩综合征是什么| 胎儿左心室灶状强回声是什么意思| 小孩便秘吃什么药| 茂盛的意思是什么| 什么东西止血最快最好| 栀子有什么作用与功效| 报单什么意思| 3月13日是什么星座| 唾液酸酶阳性是什么意思| 樵夫是什么生肖| 农历6月28日是什么星座| 牛百叶是什么部位| 什么水果补气血| 什么是胆囊炎| 圆明园是什么时候被烧的| 爱出汗是什么原因女人| 反复感冒是什么原因引起的| 什么是bp| 雨花斋靠什么盈利| 为什么男人喜欢女人的胸| 胸口闷堵是什么原因| 喝酒对身体有什么好处和坏处| 什么症状吃保心丸| 什么牌子的沐浴露好| 减肥什么东西不能吃| 三乙醇胺是什么东西| 怎么知道自己什么血型| 干什么能挣钱快| 8月12号是什么星座| 舌头有问题看什么科| 为什么人会流泪| 什么牌助听器好| 实性结节什么意思| 吃鹅蛋有什么好处和坏处| 无缘无故头疼是什么原因| 什么街道| 吃什么药可以流产| 百度

我国将大幅修改环保标准 水土气标准均将修订

本文介绍了一种基于SpringBoot的简单流量标记方案,通过自定义拦截器与logback日志格式化,实现对正常流量与压测流量的区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

在全链路压测中生成流量后,实际业务中需要区分流量(正常流量 & 压测流量),我们称之为链路打标,也可以叫做流量标记,而一般对外的接口都是使用 http 的方式暴露的,http 是一个比较通用的协议,一般我们会通过 header 的增加一个标记项。例如 key 是 “flag”,value 是你需要携带的数据,可以是普通的字符串,也可以 json 串,但是要注意控制 value 的长度,因为中间件有限制 header 的长度。

在向下游服务发起请求时,如果是压测流量把 header 头中的标记字段往下透传,下游继续在业务中往下透传,接收到如果是压测流量,就使用相应的压测数据。

我们知道目前微服务架构中「分布式跟踪系统」作为基础设施,不会限制「使用线程池等会池化复用线程的组件」,并期望对业务逻辑尽可能的透明。从技术能力上讲,「全链路压测」 与 「分布式跟踪系统」 是一样的,即链路打标。
目前市面上,几乎所有分布式链路跟踪的实现,理论基础都是基于 Google Dapper 的那篇论文,其中最重要的核心概念就是 traceIdspanId

Google Dapper 的原理可以参考:

二、设计方案

我们这里演示的 demo 很简单,主要就是使用自定义拦截器和 logback 日志自定义格式化跟踪:

  • 首先流量标记在客户端上生成,在请求业务接口的时候传递给服务端;
  • 然后服务端进行拦截,在请求真正的接口前获取 header 中传递的标记,并存储在 ThreadLocal 中,做为请求线程共享的局部变量;
  • 在请求结束的时候需要手动调用 remove() 方法清除 Map 中的标记条目,避免内存泄漏,标记随着时间推移会有很多;
  • 最后借助 logback 实现自定义日志打印跟踪(线上需要做到日志隔离)。

ThreadLocal 知识参考:

三、demo 实现

1、开发环境

  • IDEA 2020.10
  • Maven 3.6.2
  • SpringBoot 2.2.0

2、构建项目

新建一个 SpringBoot 工程,并引包:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3、自定义拦截器

创建 FlagTrackInterceptor 拦截器类:

/**
 * @Description: 标记追踪拦截器
 * @Param:
 * @return:
 * @Author: zuozewei
 * @Date: 2021/3/15
 */

@Component
public class FlagTrackInterceptor implements HandlerInterceptor {
    /**
     * 存储 flag
     */
    private static final ThreadLocal<String> FLAG_THREAD_LOCAL = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /**
         * 获取请求头 header 中传递的 flag,若没有,则 UUID 代替
         */
        String flag = Optional.ofNullable(request.getHeader("flag")).orElse(UUID.randomUUID().toString().replaceAll("-",""));
        // 请求前设置
        FLAG_THREAD_LOCAL.set(flag);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 移除,防止内存泄漏
        FLAG_THREAD_LOCAL.remove();
    }

    public static String getFlag() {
        return FLAG_THREAD_LOCAL.get();
    }

    public static void setFlag(String flag){
        FLAG_THREAD_LOCAL.set(flag);
    }

}

这里处理 flag,通过 ThreadLocal 使用,可以保证每个请求都拥有唯一的一个流量标记。

4、注册自定义拦截器

新建 CustomInterceptorConfig 自定义拦截器注册配置类:

**
 * @Description: 注册自定义拦截器
 * @Param:
 * @return:
 * @Author: zuozewei
 * @Date: 2021/3/26
 */

@Configuration
public class CustomInterceptorConfig implements WebMvcConfigurer {

    @Autowired
    private FlagTrackInterceptor flagTrackInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(flagTrackInterceptor);
    }
}

5、自定义 logback 日志格式化

新建 FlagPatternConverter 自定义日志格式化类:

/**
 * @Description:  自定义日志格式化
 * @Param:
 * @return:
 * @Author: zuozewei
 * @Date: 2021/3/26
 *
 */

public class FlagPatternConverter extends ClassicConverter {
    @Override
    public String convert(ILoggingEvent iLoggingEvent) {
        String flag = FlagTrackInterceptor.getFlag();
        return StringUtils.isEmpty(flag) ? "flag" : flag;
    }
}

需要继承 ClassicConverter 类,并重写 convert 方法,继承 PatternLayout,加入自己要自定义的内容,对于全链路压测,需要加入的是流量标记。

6、控制器

新建 FlagTrackController 控制器类:

/**
 * @Description:  测试日志追踪
 * @Param:
 * @return:
 * @Author: zuozewei
 * @Date: 2021/3/26
 */

@Slf4j
@RestController
@RequestMapping("/test")
public class FlagTrackController {

    @GetMapping("/log")
    public String flagTrack(){
        log.info("-----> 测试 info <-----");
        log.warn("-----> 测试 warn <-----");
        log.error("-----> 测试 error <-----");
        return null;
    }

}

7、logback 日志配置文件

创建 logback 日志配置文件 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 获取 flag 配置类-->
    <conversionRule conversionWord="flag" converterClass="com.zuozewei.flagtrack.config.FlagPatternConverter" />
    <!-- 自定义 logback 日志格式-->
    <property name="CUSTOM_LOG_PATTERN"
              value="[[[%date{yyyy-MM-dd HH:mm:ss} | %-5level | %flag | %thread | %file:%line | %logger : %.1000m]]]%n" />

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CUSTOM_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <!-- 控制台打印 -->
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

最后,我们需要在 logback.xml 里面配置一下日志的 pattern 和 PatternLayout

8、项目结构

最终的项目结构如下:
项目结构

四、测试

1、正常流量

通过 Postman 模拟请求:http://localhost:8080/test/log(header 中不添加 flag )

Postman 测试

控制台输出日志结果如下:
正常流量

2、流量标记

通过 Postman 模拟请求:http://localhost:8080/test/log(header 中添加标记 「flag:7d-test」 )
Postman 测试

控制台输出日志结果如下:
在这里插入图片描述

五、小结

简单基于 SpringBoot,使用拦截器及自定义日志演示一个简单的单体服务流量标记方案。如果接口内部存在多线程异步调用,这时用上面提供的方案的流量标记还会有效吗?如果不能实现真实的链路传递,那么又该如何实现呢?

源码地址:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zuozewei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
小孩有积食吃什么调理 洗衣机单漂洗是什么意思 什么茶可以减肥消脂 智齿拔了有什么影响 茉莉什么时候开花
班门弄斧是什么意思 奋不顾身的顾是什么意思 哺乳期妈妈感冒了可以吃什么药 7月17什么星座 双向是什么意思
哮喘病应该注意什么 夫妻肺片里面都有什么 硬下疳是什么样子 梦见小猪仔什么意思 什么酒不能喝打一生肖
流鼻涕咳嗽吃什么药 相忘于江湖是什么意思 月经量多是什么原因引起的 记吃不记打的下一句是什么 肩胛骨缝疼吃什么药
睡觉腿麻是什么原因引起travellingsim.com 觅是什么意思hcv8jop8ns1r.cn 尿酸高喝什么茶hcv7jop5ns5r.cn 常务副县长什么级别hcv9jop7ns0r.cn 肌酐激酶高是什么原因helloaicloud.com
何许人也是什么意思hcv8jop4ns7r.cn 洛阳白马寺求什么最灵hcv8jop1ns4r.cn 焖是什么意思hcv8jop8ns0r.cn 无回声结节是什么意思gangsutong.com 梦到老公出轨是什么意思hcv9jop4ns8r.cn
淋巴结反应性增生是什么意思hcv9jop0ns7r.cn 石青色是什么颜色hcv9jop4ns8r.cn minute什么意思hcv9jop1ns6r.cn 脸上长痘痘用什么药膏效果好hcv9jop4ns7r.cn 肾结石吃什么hcv8jop8ns4r.cn
大便发绿色是什么原因hebeidezhi.com 过敏性紫癜什么症状1949doufunao.com 吃什么能提高性功能hcv7jop4ns5r.cn 红烧肉可以放什么配菜hcv8jop8ns0r.cn 蜂蜜水什么时候喝好jingluanji.com
百度