当前位置:网站首页>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 -
About me
8 Years of Internet development experience , Good at micro Services 、 Distributed 、 Architecture design . At present, he is engaged in infrastructure and performance optimization in a large listed company .
InfoQ Signed on 、 Signed author of blue bridge 、 Alibaba cloud expert Blogger 、51CTO Sensation .
Join the knowledge planet , Roll together , The ticket price is currently the lowest in the whole network ~ There is a punch in and book donation activity on the planet , Please attend in time ~

Wukong's many technical topics :
33 piece SpringCloud actual combat , reply PDF obtain .
8 Distributed algorithm article , reply Distributed obtain .
7 piece JVM Special training , reply JVM obtain .
Elasticsearch Somersault cloud blue book 1.0, reply ES obtain
Necessary information for interview , Pay attention to get .↓↓
边栏推荐
- [server data recovery] a case of RAID data recovery of a brand StorageWorks server
- 【数字IC验证快速入门】24、SystemVerilog项目实践之AHB-SRAMC(4)(AHB继续深入)
- Apache multiple component vulnerability disclosure (cve-2022-32533/cve-2022-33980/cve-2021-37839)
- CTFshow,信息搜集:web6
- CTFshow,信息搜集:web14
- Niuke real problem programming - Day17
- What are the safest securities trading apps
- 众昂矿业:萤石继续引领新能源市场增长
- [make a boat diary] [shapr3d STL format to gcode]
- Ctfshow, information collection: web9
猜你喜欢

【数字IC验证快速入门】24、SystemVerilog项目实践之AHB-SRAMC(4)(AHB继续深入)

CTFshow,信息搜集:web7

Do you know the relationship between the most important indicators of two strong wind control and the quality of the customer base

There is a cow, which gives birth to a heifer at the beginning of each year. Each heifer has a heifer at the beginning of each year since the fourth year. Please program how many cows are there in the

银行需要搭建智能客服模块的中台能力,驱动全场景智能客服务升级

Used by Jetson AgX Orin canfd

Zhiting doesn't use home assistant to connect Xiaomi smart home to homekit

Ctfshow, information collection: web2

15、文本编辑工具VIM使用

Jetson AGX Orin CANFD 使用
随机推荐
Notes HCIA
什么是数据泄露
CTFshow,信息搜集:web3
How to release NFT in batches in opensea (rinkeby test network)
Pit avoidance: description of null values in in and not in SQL
Ctfshow, information collection: web10
CTFshow,信息搜集:web2
Bits and Information & integer notes
使用cpolar建立一个商业网站(2)
Ctfshow, information collection: Web3
@ComponentScan
Delete a whole page in word
【数字IC验证快速入门】24、SystemVerilog项目实践之AHB-SRAMC(4)(AHB继续深入)
【服务器数据恢复】戴尔某型号服务器raid故障的数据恢复案例
Connecting FTP server tutorial
With 8 modules and 40 thinking models, you can break the shackles of thinking and meet the thinking needs of different stages and scenes of your work. Collect it quickly and learn it slowly
上半年晋升 P8 成功,还买了别墅!
【搞船日记】【Shapr3D的STL格式转Gcode】
写一篇万字长文《CAS自旋锁》送杰伦的新专辑登顶热榜
[server data recovery] a case of RAID data recovery of a brand StorageWorks server





