成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從 1.5 開始搭建一個微服務框架——鏈路追蹤 TraceId

開發 架構
本篇通過攔截器、MDC 功能,全鏈路加入了 traceId,然后將 traceId 輸出到日志中,就可以通過日志來追蹤調用鏈路。不論是進程內的方法級調用,還是跨進程間的服務調用,都可以進行追蹤。

你好,我是悟空。

前言

最近在搭一個基礎版的項目框架,基于 SpringCloud 微服務框架。

如果把 SpringCloud 這個框架當做 1,那么現在已經有的基礎組件比如 swagger/logback 等等就是 0.5 ,然后我在這 1.5 基礎上進行組裝,完成一個微服務項目框架。

為什么要造二代輪子呢?市面上現成的項目框架不香嗎?

因為項目組不允許用外部的現成框架,比如 Ruoyi。另外因為我們的項目需求具有自身的特色,技術選型也會選擇我們自己熟悉的框架,所以自己來造二代輪子也是一個不錯的選擇。

核心功能

需要包含以下核心功能:

  • 多個微服務模塊拆分,抽取出一個 demo 微服務模塊供擴展,已完成
  • 提取核心框架模塊,已完成
  • 注冊中心 Eureka,已完成
  • 遠程調用 OpenFeign,已完成
  • 日志 logback,包含 traceId 跟蹤,已完成
  • Swagger API 文檔,已完成
  • 配置文件共享,已完成
  • 日志檢索,ELK Stack,已完成
  • 自定義 Starter,待定
  • 整合緩存 Redis,Redis 哨兵高可用,已完成
  • 整合數據庫 MySQL,MySQL 高可用,已完成
  • 整合 MyBatis-Plus,已完成
  • 鏈路追蹤組件,待定
  • 監控,待定
  • 工具類,待開發
  • 網關,技術選型待定
  • 審計日志進入 ES,待定
  • 分布式文件系統,待定
  • 定時任務,待定
  • 等等

本篇要介紹的內容是關于日志鏈路追蹤的。

一、痛點

痛點一:進程內的多條日志無法追蹤

一個請求調用,假設會調用后端十幾個方法,打印十幾次日志,無法將這些日志串聯起來。

如下圖所示:客戶端調用訂單服務,訂單服務中方法 A 調用方法 B,方法 B 調用方法 C。

方法 A 打印第一條日志和第五條日志,方法 B 打印第二條日志,方法 C 打印第三條日志和第四條日志,但是這 5 條日志并沒有任何聯系,唯一的聯系就是時間是按照時間循序打印的,但是如果有其他并發的請求調用,則會干擾日志的連續性。

圖片

痛點二:跨服務的日志如何進行關聯

每個微服務都會記錄自己這個進程的日志,跨進程的日志如何進行關聯?

如下圖所示:訂單服務和優惠券服務屬于兩個微服務,部署在兩臺機器上,訂單服務的 A 方法遠程調用優惠券服務的 D 方法。

方法 A 將日志打印到日志文件 1 中,記錄了 5 條日志,方法 D 將日志打印到日志文件 2 中,記錄了 5 條日志。但是這 10 條日志是無法關聯起來的。

圖片

痛點三:跨線程的日志如何關聯

主線程和子線程的日志如何關聯?

如下圖所示:主線程的方法 A 啟動了一個子線程,子線程執行方法 E。

方法 A 打印了第一條日志,子線程 E 打印了第二條日志和第三條日志。

圖片

痛點四:第三方調用我們的服務,如何追蹤?

本篇要解決的核心問題是第一個和第二個問題,多線程目前還未引入,目前也沒有第三方來調用,后期再來優化第三個和第四個問題。

二、方案

1.1 解決方案

① 使用 Skywalking traceId 進行鏈路追蹤

② 使用 Elastic APM 的 traceId 進行鏈路追蹤

③ MDC 方案:自己生成 traceId 并 put 到 MDC 里面。

項目初期,先不引入過多的中間件,用簡單可行的方案先嘗試,所以這里用第三種方案 MDC。

1.2 MDC 方案

MDC(Mapped Diagnostic Context)用于存儲運行上下文的特定線程的上下文數據。因此,如果使用 log4j 進行日志記錄,則每個線程都可以擁有自己的MDC,該 MDC 對整個線程是全局的。屬于該線程的任何代碼都可以輕松訪問線程的 MDC 中存在的值。

三、原理和實戰

2.1 追蹤一個請求的多條日志

我們先來看第一個痛點,如何在一個請求中,將多條日志串聯起來。

該方案的原理如下圖所示:

圖片

(1)在 logback 日志配置文件中的日志格式中添加 %X{traceId} 配置。

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{traceId} %-5level %logger - %msg%n</pattern>

(2)自定一個攔截器,從請求的 header 中獲取 traceId ,如果存在則放到 MDC 中,否則直接用 UUID 當做 traceId,然后放到 MDC 中。

(3)配置攔截器。

當我們打印日志的時候,會自動打印 traceId,如下所示,多條日志的 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 跨服務跟蹤多條日志

解決方案的原理圖如下所示:

圖片

訂單服務遠程調用優惠券服務,需要在訂單服務中添加 OpenFeign 的攔截器,攔截器里面做的事就是往 請求的 header 中添加 traceId,這樣調用到優惠券服務時,就能從 header 中拿到這次請求的 traceId。

代碼如下所示:

/**
* @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));
}
}

兩個微服務打印的日志中,兩條日志的 traceId 一致。

圖片

當然這些日志都會導入到 Elasticsearch 中的,然后通過 kibana 可視化界面搜索 traceId,就可以將整個調用鏈路串起來了!

四、總結

本篇通過攔截器、MDC 功能,全鏈路加入了 traceId,然后將 traceId 輸出到日志中,就可以通過日志來追蹤調用鏈路。不論是進程內的方法級調用,還是跨進程間的服務調用,都可以進行追蹤。

另外日志還需要通過 ELK Stack 技術將日志導入到 Elasticsearch 中,然后就可以通過檢索 traceId,將整個調用鏈路檢索出來了。

責任編輯:武曉燕 來源: 悟空聊架構
相關推薦

2019-08-21 17:41:29

操作系統軟件設計

2020-09-11 09:44:04

微服務分布式鏈路

2022-05-23 08:23:24

鏈路追蹤SleuthSpring

2023-12-15 09:57:13

微服務鏈路服務

2020-04-07 15:12:07

微服務架構數據

2022-12-15 22:01:04

TLog日志標簽

2022-05-25 08:23:32

ZipKinTwitter開源項目

2025-03-11 14:16:09

2024-08-21 08:09:17

2022-08-05 10:03:17

分布式微服務

2023-10-16 23:43:52

云原生可觀測性

2018-08-15 10:51:01

JavaSpring MVC框架

2017-05-08 14:27:49

PHP框架函數框架

2017-05-25 12:40:06

SOA微服務系統

2022-07-22 07:59:17

日志方案

2023-08-24 22:13:31

2020-12-16 09:24:18

Skywalking分布式鏈路追蹤

2024-06-07 13:04:31

2023-01-30 22:34:44

Node.js前端

2023-08-02 11:39:11

鏈路追蹤技術微服務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人中文字幕 | 成人中文字幕在线观看 | 欧美亚洲激情 | 日韩一级免费电影 | 亚洲国产欧美在线人成 | 婷婷久久网 | 久久精品97 | 欧美日韩国产一区二区三区 | 久久久久国产精品一区二区 | 亚洲精品大全 | www.午夜| 亚洲乱码国产乱码精品精98午夜 | 精品毛片 | 国产精品久久久久久久久久久久久 | 精品国产18久久久久久二百 | 国产精品永久在线观看 | 欧美日韩一区二区三区四区 | 人碰人操| 精品视频免费 | 亚洲网站免费看 | 一区二区免费看 | 国产免费看 | 波多野结衣一区二区 | www.99re| 亚洲免费高清 | 欧美激情视频一区二区三区免费 | 久久99这里只有精品 | 欧美a在线 | 毛片网站在线观看 | 天天看天天爽 | 久久国产精品免费一区二区三区 | 国产激情在线 | 91免费视频观看 | 午夜视频在线观看一区二区 | 美女视频一区二区三区 | 狠狠色网 | 一区二区免费在线观看 | 91久久国产综合久久91精品网站 | 久久国产成人精品国产成人亚洲 | 精品一区二区在线视频 | 日韩av一区二区在线观看 |