国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分布式鏈路追蹤如何跨線程

這篇具有很好參考價值的文章主要介紹了分布式鏈路追蹤如何跨線程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

我們希望實現(xiàn)全鏈路信息,但是代碼中一般都會異步的線程處理。

分布式鏈路追蹤如何跨線程,java,開發(fā)語言

解決思路

我們可以對以前的 Runable 和 Callable 進(jìn)行增強。

可以使用 ali 已經(jīng)存在的實現(xiàn)方式。

TransmittableThreadLocal (TTL) 解決異步執(zhí)行時上下文傳遞的問題

核心的實現(xiàn)思路如下:

1)異步執(zhí)行前,把當(dāng)前線程的 MDC 信息放入執(zhí)行對象中。

2)異步執(zhí)行時,把執(zhí)行對象中的信息放入 MDC 等信息。

3) 異步執(zhí)行后,清空執(zhí)行對象。

問題

Runable 和 Callable 只是接口,沒有額外信息,所以需要進(jìn)行增強。

實現(xiàn)方式

接口定義

package com.github.houbb.heaven.support.concurrent.context;

import java.util.Map;

/**
 * 跨線程處理類
 *
 * @since 0.3.0
 */
public interface CrossThreadProcessor {

    /**
     * 初始化上下文
     * @param contextMap 上下文
     */
    void initContext(Map<String, Object> contextMap);

    /**
     * 執(zhí)行之前
     * @param contextMap 上下文
     */
    void beforeExecute(Map<String, Object> contextMap);

    /**
     * 執(zhí)行之后
     * @param contextMap 上下文
     */
    void afterExecute(Map<String, Object> contextMap);

}

對可執(zhí)行接口進(jìn)行增強

package com.github.houbb.heaven.support.concurrent.context;

import com.github.houbb.heaven.util.lang.SpiUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

/**
 * 跨線程處理
 *
 * 作用:用來跨線程處理傳遞信息,比如 async,線程池等。
 *
 * 比如在 aop 中,直接處理。
 *
 * <pre>
 * Object[] args = point.args();
 * Object arg0 = args[0];
 *
 * // 直接轉(zhuǎn)換為當(dāng)前的對象
 * if(arg0 instanceOf Runnable) {
 *      args[0] = new CrossThreadWrapper((Runnable)arg0);
 * } else if(arg0 instanceOf Callable) {
 *      args[0] = new CrossThreadWrapper((Callable)arg0);
 * }
 *
 * // 繼續(xù)處理
 * </pre>
 * @param <T> 泛型
 * @since 0.3.0
 */
public class CrossThreadWrapper<T> implements Runnable, Callable<T> {

    private Runnable runnable;

    private Callable<T> callable;

    /**
     * 通過 spi 獲取所有的實現(xiàn)類
     */
    private static List<CrossThreadProcessor> processorList = new ArrayList<>();

    /**
     * 上下文
     */
    private final Map<String, Object> context = new HashMap<>();

    static {
        processorList = SpiUtil.getClassImplList(CrossThreadProcessor.class);
    }

    public CrossThreadWrapper(Runnable runnable) {
        // 任務(wù)執(zhí)行之前
        this.initContext();

        this.runnable = runnable;
    }

    public CrossThreadWrapper(Callable<T> callable) {
        this.initContext();

        this.callable = callable;
    }

    @Override
    public void run() {
        try {
            beforeExecute();
            this.runnable.run();
        } finally {
            afterExecute();
        }
    }

    @Override
    public T call() throws Exception {
        try {
            beforeExecute();
            return this.callable.call();
        } finally {
            afterExecute();
        }
    }

    /**
     * 初始化上下文
     */
    protected void initContext() {
        for(CrossThreadProcessor processor : processorList) {
            processor.initContext(context);
        }
    }

    /**
     * 執(zhí)行前
     */
    protected void beforeExecute() {
        for(CrossThreadProcessor processor : processorList) {
            processor.beforeExecute(context);
        }
    }

    /**
     * 執(zhí)行之后
     */
    protected void afterExecute() {
        for(CrossThreadProcessor processor : processorList) {
            processor.afterExecute(context);
        }
    }

}

用法

實現(xiàn)接口

我們只需要實現(xiàn) CrossThreadProcessor 接口。

然后 spi 中配置,服務(wù)會自動發(fā)現(xiàn)。

aop

可以在 spring aop 中,對以前的方法執(zhí)行進(jìn)行增強。文章來源地址http://www.zghlxwxcb.cn/news/detail-724905.html

到了這里,關(guān)于分布式鏈路追蹤如何跨線程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 鏈路追蹤詳解(三):分布式鏈路追蹤標(biāo)準(zhǔn)的演進(jìn)

    鏈路追蹤詳解(三):分布式鏈路追蹤標(biāo)準(zhǔn)的演進(jìn)

    目錄 Google Dapper Twitter Zipkin Uber Jaeger OpenTracing 和 OpenCensus OpenTelemetry 小結(jié) 分布式鏈路追蹤是現(xiàn)代云計算和微服務(wù)架構(gòu)中一個關(guān)鍵技術(shù),可以讓開發(fā)者和運維團(tuán)隊理解和監(jiān)控服務(wù)請求在復(fù)雜系統(tǒng)中的完整流轉(zhuǎn)路徑。分布式鏈路追蹤技術(shù)的發(fā)展經(jīng)歷了從早期的專有解決方案到現(xiàn)代

    2024年02月05日
    瀏覽(32)
  • 進(jìn)階分布式鏈路追蹤

    進(jìn)階分布式鏈路追蹤

    ? ? ? ? ? ? ? ? ? ? ? ? https://item.jd.com/14337086.html?編輯https://item.jd.com/14337086.html “ RocketMQ 消息中間件實戰(zhàn)派上下冊”是我既“ Spring Cloud Alibaba 微服務(wù)架構(gòu)實戰(zhàn)派上下冊”之后,又一本歷時超過 1 年半的巨無霸技術(shù)實戰(zhàn)類型的書籍。 為了提高讀者閱讀本書的體驗性,本書

    2024年02月02日
    瀏覽(21)
  • 分布式鏈路追蹤

    分布式鏈路追蹤

    隨著互聯(lián)網(wǎng)業(yè)務(wù)快速擴展,軟件架構(gòu)也日益變得復(fù)雜,為了適應(yīng)海量用戶高并發(fā)請求,系統(tǒng)中越來越多的組件開始走向分布式化,如單體架構(gòu)拆分為微服務(wù)、服務(wù)內(nèi)緩存變?yōu)榉植际骄彺?、服?wù)組件通信變?yōu)榉植际较ⅲ@些組件共同構(gòu)成了繁雜的分布式網(wǎng)絡(luò)。 在大型系統(tǒng)的微

    2024年02月16日
    瀏覽(20)
  • 分布式鏈路追蹤概述

    分布式鏈路追蹤概述

    隨著系統(tǒng)設(shè)計變得日趨復(fù)雜,越來越多的組件開始走向分布式化,如微服務(wù)、分布式數(shù)據(jù)庫、分布式緩存等,使得后臺服務(wù)構(gòu)成了一種復(fù)雜的分布式網(wǎng)絡(luò)。往往前端的一個請求需要經(jīng)過多個微服務(wù)、跨越多個數(shù)據(jù)中心才能最終獲取到結(jié)果,如下圖 并且隨著業(yè)務(wù)的不斷擴張,服

    2024年02月13日
    瀏覽(25)
  • 什么是分布式鏈路追蹤

    什么是分布式鏈路追蹤

    隨著互聯(lián)網(wǎng)業(yè)務(wù)快速擴展,軟件架構(gòu)也日益變得復(fù)雜,為了適應(yīng)海量用戶高并發(fā)請求,系統(tǒng)中越來越多的組件開始走向分布式化,如單體架構(gòu)拆分為微服務(wù)、服務(wù)內(nèi)緩存變?yōu)榉植际骄彺妗⒎?wù)組件通信變?yōu)榉植际较?,這些組件共同構(gòu)成了繁雜的分布式網(wǎng)絡(luò)。 在大型系統(tǒng)的微

    2024年02月16日
    瀏覽(29)
  • 鏈路追蹤詳解(四):分布式鏈路追蹤的事實標(biāo)準(zhǔn) OpenTelemetry 概述

    鏈路追蹤詳解(四):分布式鏈路追蹤的事實標(biāo)準(zhǔn) OpenTelemetry 概述

    目錄 OpenTelemetry 是什么? OpenTelemetry 的起源和目標(biāo) OpenTelemetry 主要特點和功能 OpenTelemetry 的核心組件 OpenTelemetry 的工作原理 OpenTelemetry 的特點 OpenTelemetry 的應(yīng)用場景 小結(jié) OpenTelemetry 是一個為實現(xiàn)可觀測性的開源的框架和工具集,用于創(chuàng)建和管理遙測數(shù)據(jù),例如 traces,、metric

    2024年02月04日
    瀏覽(21)
  • 微服務(wù)之分布式鏈路追蹤

    微服務(wù)之分布式鏈路追蹤

    在微服務(wù)框架中,一個由客戶端發(fā)起的請求在后端系統(tǒng)中會經(jīng)過多個不同的的服務(wù)節(jié)點調(diào)用來協(xié)同產(chǎn)生最后的請求結(jié)果,每一個前段請求都會形成一條復(fù)雜的分布式服務(wù)調(diào)用鏈路,鏈路中的任何一環(huán)出現(xiàn)高延時或錯誤都會引起整個請求最后的失敗。 在分布式與微服務(wù)場景下,

    2024年04月22日
    瀏覽(31)
  • SkyWalking分布式鏈路追蹤學(xué)習(xí)

    SkyWalking分布式鏈路追蹤學(xué)習(xí)

    實際生產(chǎn)中,面對幾十個、甚至成百上千個的微服務(wù)實例,如果一旦某個實例發(fā)生宕機,如果不能快速定位、提交預(yù)警,對實際生產(chǎn)造成的損失無疑是巨大的。所以,要對微服務(wù)進(jìn)行監(jiān)控、預(yù)警,對微服務(wù)的調(diào)用鏈路進(jìn)行監(jiān)控,迅速定位問題 SkyWalking下載 SkyWalking官網(wǎng) elastic

    2024年02月07日
    瀏覽(51)
  • 分布式鏈路追蹤之SkyWalking

    分布式鏈路追蹤之SkyWalking

    ??在微服務(wù)架構(gòu)中,一次請求往往涉及到多個模塊,多個中間件,多臺機器的相互協(xié)作才能完成。這一系列調(diào)用請求中,有些是串行的,有些是并行的,那么如何確定這個請求背后調(diào)用了哪些應(yīng)用,哪些模塊,哪些節(jié)點及調(diào)用的先后順序?如何定位每個模塊的性能問題?本

    2023年04月20日
    瀏覽(45)
  • Zipkin開源的分布式鏈路追蹤系統(tǒng)

    Zipkin是一款開源的分布式鏈路追蹤系統(tǒng),主要功能包括: 1. 采集跟蹤數(shù)據(jù) - Zipkin client庫負(fù)責(zé)收集并上報各服務(wù)的請求信息。 2. 存儲跟蹤數(shù)據(jù) - 存儲層默認(rèn)采用Zipkin自帶的基于內(nèi)存的快速存儲,也支持整合MySQL、Cassandra等外部存儲。 3. 查詢接口 - 提供RESTful API進(jìn)行跟蹤數(shù)據(jù)查詢。

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包