当前位置:网站首页>从 1.5 开始搭建一个微服务框架——调用链追踪 traceId
从 1.5 开始搭建一个微服务框架——调用链追踪 traceId
2022-07-06 00:33:00 【InfoQ】
前言
1
核心功能
- 多个微服务模块拆分,抽取出一个 demo 微服务模块供扩展,已完成
- 提取核心框架模块,已完成
- 注册中心 Eureka,已完成
- 远程调用 OpenFeign,已完成
- 日志 logback,包含 traceId 跟踪,已完成
- Swagger API 文档,已完成
- 配置文件共享,已完成
- 日志检索,ELK Stack,已完成
- 自定义 Starter,待定
- 整合缓存 Redis,Redis 哨兵高可用,已完成
- 整合数据库 MySQL,MySQL 高可用,已完成
- 整合 MyBatis-Plus,已完成
- 链路追踪组件,待定
- 监控,待定
- 工具类,待开发
- 网关,技术选型待定
- 审计日志进入 ES,待定
- 分布式文件系统,待定
- 定时任务,待定
- 等等
一、痛点
痛点一:进程内的多条日志无法追踪
痛点二:跨服务的日志如何进行关联
痛点三:跨线程的日志如何关联
痛点四:第三方调用我们的服务,如何追踪?
二、方案
1.1 解决方案
1.2 MDC 方案
三、原理和实战
2.1 追踪一个请求的多条日志
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{traceId} %-5level %logger - %msg%n</pattern>
header
traceId
示例代码
/**
* @author www.passjava.cn,公众号:悟空聊架构
* @date 2022-07-05
*/
@Service
public class LogInterceptor extends HandlerInterceptorAdapter {
private static final String TRACE_ID = "traceId";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String traceId = request.getHeader(TRACE_ID);
if (StringUtils.isEmpty(traceId)) {
MDC.put("traceId", UUID.randomUUID().toString());
} else {
MDC.put(TRACE_ID, traceId);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//防止内存泄露
MDC.remove("traceId");
}
}
/**
* @author www.passjava.cn,公众号:悟空聊架构
* @date 2022-07-05
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Resource
private LogInterceptor logInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logInterceptor).addPathPatterns("/**");
}
}
2.2 跨服务跟踪多条日志
/**
* @author www.passjava.cn,公众号:悟空聊架构
* @date 2022-07-05
*/
@Configuration
public class FeignInterceptor implements RequestInterceptor {
private static final String TRACE_ID = "traceId";
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header(TRACE_ID, (String) MDC.get(TRACE_ID));
}
}
四、总结
边栏推荐
- AtCoder Beginner Contest 258【比赛记录】
- Location based mobile terminal network video exploration app system documents + foreign language translation and original text + guidance records (8 weeks) + PPT + review + project source code
- Leetcode Fibonacci sequence
- notepad++正則錶達式替換字符串
- MIT博士论文 | 使用神经符号学习的鲁棒可靠智能系统
- MySql——CRUD
- Data analysis thinking analysis methods and business knowledge - analysis methods (III)
- Atcoder beginer contest 258 [competition record]
- How spark gets columns in dataframe --column, $, column, apply
- 数据分析思维分析方法和业务知识——分析方法(三)
猜你喜欢
Data analysis thinking analysis methods and business knowledge - analysis methods (III)
FFT learning notes (I think it is detailed)
Notepad++ regular expression replacement string
Folding and sinking sand -- weekly record of ETF
Calculate sha256 value of data or file based on crypto++
XML Configuration File
如何制作自己的机器人
Hardware and interface learning summary
uniapp开发,打包成H5部署到服务器
Classic CTF topic about FTP protocol
随机推荐
Date类中日期转成指定字符串出现的问题及解决方法
Knowledge about the memory size occupied by the structure
Spark获取DataFrame中列的方式--col,$,column,apply
MySQL storage engine
devkit入门
Codeforces gr19 D (think more about why the first-hand value range is 100, JLS yyds)
Data analysis thinking analysis methods and business knowledge -- analysis methods (II)
NLP basic task word segmentation third party Library: ICTCLAS [the third party library with the highest accuracy of Chinese word segmentation] [Chinese Academy of Sciences] [charge]
Multithreading and high concurrency (8) -- summarize AQS shared lock from countdownlatch (punch in for the third anniversary)
MySql——CRUD
[designmode] composite mode
MySQL functions
Choose to pay tribute to the spirit behind continuous struggle -- Dialogue will values [Issue 4]
STM32 configuration after chip replacement and possible errors
Meta AI西雅图研究负责人Luke Zettlemoyer | 万亿参数后,大模型会持续增长吗?
Pointer pointer array, array pointer
Idea远程提交spark任务到yarn集群
Introduction of motor
STM32按键消抖——入门状态机思维
FFT learning notes (I think it is detailed)