• logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统


    logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统

           logback官方文档中第8章Mapped Diagnostic Context给我们提供了一些分布式系统的跟踪系统实现的方法。

          logback设计的一个目标之中的一个是对分布式应用系统的审计和调试。现实世界的分布式系统须要同一时候处理非常多client的请求。

    在这样一个典型的多线程应用系统,不同的线程处理不同的client请求。

         那我们怎样跟踪这些请求呢。目地想要知道请求响应的时间、请求成功与否、跟踪异常失败信息等等。

    要做到这些功能,我们必须给每一个请求盖一个唯一的“邮戳”。

    这个“邮戳”必须尾随着请求线程的前行而存放一些实用的信息。

       logback框架中的MDC就是用来存放这些“邮戳”的。这个MDC的实现有点太普通,毕竟底层是个

    <span style="font-size:18px;">  final InheritableThreadLocal<Map<String, String>> copyOnInheritThreadLocal = new InheritableThreadLocal<Map<String, String>>();
    </span>

      (类:ch.qos.logback.classic.util.LogbackMDCAdapter)

          我们依据logback这个代码。我们能够用ThreadLocal保存我们自己定义的一个object类。这个类保存了一些调用过程中重要的信息(当然依据是否须要跟踪应用内部线程中还有线程处理业务的信息,能够选择InheritableThreadLocal)。

     

      大多情况下。我们的应用要么是RPC服务。要么就是web应用。前端展示给用户的网页是应用请求的最開始端,当然这个普通情况下调用的是java web MVC框架服务。这个web MVC框架的主要任务那就是每当有请求时,必须自己主动保存我们想要保存的信息,logback这章文档也给出了最好的答案:servlet Filter

     

    依据这个思想:我们代码大致例如以下:

    ThreadLocal

    public class UserServletFilter implements Filter {
    
       
      public void destroy() {
      }
    
      public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    
        //这里要保存一些信息到我们<strong>ThreadLocal</strong>内。是否打印日志信息
    
        try {
          chain.doFilter(request, response);
        } finally {
          if (successful ) {
             //保存成功信息等等
          }
          //失败信息是否须要保存,是否打印日志信息
     }
      }
    
      public void init(FilterConfig arg0) throws ServletException {
      }
      
    
      
       
    }

    我们主要做的是保存什么信息到ThreadLocal。或者从请求信息那里得到什么信息然后保存在ThreadLocal里面。及日志的信息输出(日志的目的是收集日志进行分析)。

      普通情况下,我们的web不只一个filter,所以我们要确保配置的这个filter一定要在其他之前声明。


        那另一种应用。那就是提供RPC服务的应用,事实上质也是web应用,仅仅只是是代理模式封装了网络请求。

       我们主要做的就是在封装的网络请求那里要传递这个ThreadLocal对象信息,RPC服务端再解析出来。

      像Dubbo这个框架,自身实现了类似web的filter,非常easy让你扩展,但类似Hessian框架,那就可能必须改动源代码,自己实现了。


     

      事实上,一些大公司已经有了这种分布式跟踪应用,比方:

    你能够看看它们的思想。毕竟大公司的应用调用关系非常复杂,应对情况也比較多。本文仅仅是依据MDC提出的非常easy的实现思想。


  • 相关阅读:
    【LeetCode】085. Maximal Rectangle
    哈希查找
    堆排序
    归并排序
    希尔排序
    快速排序
    堆区和栈区,malloc和new的区别
    C++基础
    二分查找
    冒泡排序
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7234302.html
Copyright © 2020-2023  润新知