当前位置:网站首页>Starting from 1.5, build a microservice framework link tracking traceid
Starting from 1.5, build a microservice framework link tracking traceid
2022-07-07 15:22:00 【Wukong chat architecture】
This is Wukong's first 156 Original articles
Official website :www.passjava.cn
Hello , I'm Wukong .
Preface
Recently, I am building a basic version of the project framework , be based on SpringCloud Microservice framework .
If you put SpringCloud This framework is used as 1
, Now there are some basic components, such as swagger/logback Wait, that's it 0.5 , Then I'm here 1.5 The base Assemble on , Complete a microservice project framework .
Why build Second generation wheel Well ? Isn't the ready-made project framework on the market fragrant ?
Because the project team is not allowed to use external ready-made frameworks , such as Ruoyi. In addition, our project needs have their own characteristics , Technology selection will also choose the framework we are familiar with , So it's also a good choice to build the second generation wheels by yourself .
Core functions
The following core functions need to be included :
Split multiple micro service modules , Draw out one demo Microservice module for expansion , Completed
Extract core framework modules , Completed
Registry Center Eureka, Completed
The remote invocation OpenFeign, Completed
journal logback, contain traceId track , Completed
Swagger API file , Completed
Configure file sharing , Completed
Log retrieval ,ELK Stack, Completed
Customize Starter, undetermined
Consolidated cache Redis,Redis Sentinel high availability , Completed
Consolidate databases MySQL,MySQL High availability , Completed
Integrate MyBatis-Plus, Completed
Link tracking component , undetermined
monitor , undetermined
Tool class , To be developed
gateway , Technology selection to be determined
Audit log entry ES, undetermined
distributed file system , undetermined
Timing task , undetermined
wait
This article is about log link tracking .
One 、 Pain points
It hurts a little : Multiple logs in the process cannot be traced
A request calls , Suppose you will call more than a dozen methods on the back end , Print the log more than ten times , These logs cannot be concatenated .
As shown in the figure below : The client calls the order service , Methods in order service A Calling method B, Method B Calling method C.
Method A Print the first log and the fifth log , Method B Print the second log , Method C Print the third log and the fourth log , But this 5 This log has no connection , The only connection is that time is printed in chronological order , But if there are other concurrent request calls , It will interfere with the continuity of the log .
Pain point two : How to correlate logs across Services
Every micro service will record its own log of this process , How to correlate logs across processes ?
As shown in the figure below : Order service and coupon service belong to two micro Services , Deployed on two machines , Order service A Method to call the coupon service remotely D Method .
Method A Print the log to the log file 1 in , Recorded 5 Logs , Method D Print the log to the log file 2 in , Recorded 5 Logs . But this 10 Logs cannot be associated .
Pain point three : How to correlate logs across threads
How the logs of the main thread and the sub thread are related ?
As shown in the figure below : Method of main thread A Started a sub thread , The sub thread executes the method E.
Method A Printed the first log , Sub thread E The second log and the third log were printed .
It hurts four : The third party calls our service , How to track ?
The core problem to be solved in this article is the first and second problems , Multithreading has not been introduced yet , At present, there is no third party to call , We will optimize the third and fourth questions later .
Two 、 programme
1.1 Solution
① Use Skywalking traceId Link tracking
② Use Elastic APM Of traceId Link tracking
③ MDC programme : Make your own traceId and put To MDC Inside .
At the beginning of the project , Don't introduce too many middleware , Try a simple and feasible solution first , So here is the third solution MDC.
1.2 MDC programme
MDC(Mapped Diagnostic Context) Used to store context data for a specific thread running context . therefore , If you use log4j Logging , Each thread can have its own MDC, The MDC Global to the entire thread . Any code belonging to the thread can easily access the thread's MDC Exists in .
3、 ... and 、 Principle and practice
2.1 Track multiple logs of a request
Let's first look at the first pain point , How to in a request , Connect multiple logs .
The principle of this scheme is shown in the figure below :
(1) stay logback Add... To the log format in the log configuration file %X{traceId} To configure .
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{traceId} %-5level %logger - %msg%n</pattern>
(2) Customize an interceptor , From request header
In order to get traceId
, If it exists, put it in MDC in , Otherwise, use it directly UUID treat as traceId, Then put MDC in .
(3) Configure interceptors .
When we print the log , It will print automatically traceId, As shown below , Of multiple logs traceId identical .
Sample code
Interceptor code :
/**
* @author www.passjava.cn, official account : Wukong chat structure
* @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 {
// Prevent memory leaks
MDC.remove("traceId");
}
}
Configure interceptors :
/**
* @author www.passjava.cn, official account : Wukong chat structure
* @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 Track multiple logs across Services
The schematic diagram of the solution is shown below :
The order service calls the coupon service remotely , You need to add OpenFeign Interceptor , What the interceptor does is go Requested header Add traceId, When calling the coupon service in this way , From the header Get this request traceId.
The code is as follows :
/**
* @author www.passjava.cn, official account : Wukong chat structure
* @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));
}
}
In the logs printed by two microservices , Two logs traceId Agreement .
Of course, these logs will be imported into Elasticsearch Medium , And then through kibana Visual interface search traceId, You can string the whole call link !
Four 、 summary
This article passes the interceptor 、MDC function , The full link is added traceId, And then traceId Output to log , You can trace the call link through the log . Whether it's in-process method level calls , Or cross process service invocation , Can be tracked .
In addition, the log also needs to pass ELK Stack Technology imports logs into Elasticsearch in , Then you can search traceId, The whole call link is retrieved .
- END -
边栏推荐
- 暑期安全很重要!应急安全教育走进幼儿园
- Wechat applet 01
- Niuke real problem programming - day16
- CTFshow,信息搜集:web5
- Used by Jetson AgX Orin canfd
- Ctfshow, information collection: web14
- PAT 甲级 1103 Integer Factorizatio
- Summer safety is very important! Emergency safety education enters kindergarten
- Niuke real problem programming - Day17
- CTFshow,信息搜集:web12
猜你喜欢
Niuke real problem programming - Day17
TypeScript 发布 4.8 beta 版本
Wechat applet 01
Briefly describe the working principle of kept
Niuke real problem programming - day20
【数字IC验证快速入门】24、SystemVerilog项目实践之AHB-SRAMC(4)(AHB继续深入)
CTFshow,信息搜集:web6
[server data recovery] data recovery case of raid failure of a Dell server
【OBS】RTMPSockBuf_ Fill, remote host closed connection.
Apache multiple component vulnerability disclosure (cve-2022-32533/cve-2022-33980/cve-2021-37839)
随机推荐
数学建模——什么是数学建模
Lidar knowledge drops
知否|两大风控最重要指标与客群好坏的关系分析
如何在opensea批量发布NFT(Rinkeby测试网)
PG basics -- Logical Structure Management (locking mechanism -- table lock)
jacoco代码覆盖率
CTFshow,信息搜集:web9
Deformable convolutional dense network for enhancing compressed video quality
【OBS】RTMPSockBuf_ Fill, remote host closed connection.
什么是数据泄露
【兰州大学】考研初试复试资料分享
#HPDC智能基座人才发展峰会随笔
全日制研究生和非全日制研究生的区别!
Niuke real problem programming - day20
Why do we use UTF-8 encoding?
从 1.5 开始搭建一个微服务框架链路追踪 traceId
Ctfshow, information collection: web14
Window环境下配置Mongodb数据库
15、文本编辑工具VIM使用
Write a ten thousand word long article "CAS spin lock" to send Jay's new album to the top of the hot list