java高并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉(1)

public class TraceRunnable implements Runnable {

private String tranceId;

private Runnable target;

public TraceRunnable(Runnable target) {

this.tranceId = TraceUtil.get();

this.target = target;

}

@Override

public void run() {

try {

TraceUtil.set(this.tranceId);

MDC.put(TraceUtil.MDC_TRACE_ID, TraceUtil.get());

this.target.run();

} finally {

MDC.remove(TraceUtil.MDC_TRACE_ID);

TraceUtil.remove();

}

}

public static Runnable trace(Runnable target) {

return new TraceRunnable(target);

}

}

需要用线程池执行的任务使用TraceRunnable封装一下就可以了。

TraceUtil代码:

public class TraceUtil {

public static final String REQUEST_HEADER_TRACE_ID = “com.ms.header.trace.id”;

public static final String MDC_TRACE_ID = “trace_id”;

private static InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();

/**

* 获取traceid

* @return

*/

public static String get() {

String traceId = inheritableThreadLocal.get();

if (traceId == null) {

traceId = IDUtil.getId();

inheritableThreadLocal.set(traceId);

}

return traceId;

}

public static void set(String trace_id) {

inheritableThreadLocal.set(trace_id);

}

public static void remove() {

inheritableThreadLocal.remove();

}

}

日志输出中携带上trace_id,这样最终我们就可以通过trace_id找到一个请求的完整日志了。

方便快速检索日志

日志分散在不同的机器上,如果要快速检索,需要将所有服务产生的日志汇集到一个地方。

关于检索日志的,列一下需求:

  1. 我们将收集日志发送到消息中间件中(可以是kafka、rocketmq),消息中间件这块不介绍,选择玩的比较溜的就可以了

  2. 系统产生日志尽量不要影响接口的效率

  3. 带宽有限的情况下,发送日志也尽量不要去影响业务

  4. 日志尽量低延次,产生的日志,尽量在生成之后1分钟后可以检索到

  5. 检索日志功能要能够快速响应

关于上面几点,我们需要做的:日志发送的地方进行改造,引入消息中间件,将日志异步发送到消息中间件中,查询的地方采用elasticsearch,日志系统需要订阅消息中间件中的日志,然后丢给elasticsearch建索引,方便快速检索,咱们来一点点的介绍。

日志发送端的改造

日志是有业务系统产生的,一个请求过来的时候会产生很多日志,日志产生时,我们尽量减少日志输出对业务耗时的影响,我们的过程如下:

  1. 业务系统内部引用一个线程池来异步处理日志,线程池内部可以使用一个容量稍微大一点的阻塞队列

  2. 业务系统将日志丢给线程池进行处理

  3. 线程池中将需要处理的日志先压缩一下,然后发送至mq

线程池的使用可以参考:JAVA线程池,这一篇就够了

引入mq存储日志

业务系统将日志先发送到mq中,后面由其他消费者订阅进行消费。日志量比较大的,对mq的要求也比较高,可以选择kafka,业务量小的,也可以选取activemq。

使用elasticsearch来检索日志

elasticsearch(以下简称es)是一个全文检索工具,具体详情可以参考其官网相关文档。使用它来检索数据效率非常高。日志系统中需要我们开发一个消费端来拉取mq中的消息,将其存储到es中方便快速检索,关于这块有几点说一下:

  1. 建议按天在es中建立数据库,日质量非常大的,也可以按小时建立数据库。查询的时候,时间就是必选条件了,这样可以快速让es定位到日志库进行检索,提升检索效率

  2. 日志常见的需要收集的信息:trace_id、时间、日志级别、类、方法、url、调用的接口开始时间、调用接口的结束时间、接口耗时、接口状态码、异常信息、日志信息等等,可以按照这些在es中建立索引,方便检索。

日志监控报警

日志监控报警是非常重要的,这个必须要有,日志系统中需要开发监控报警功能,这块我们可以做成通过页面配置的方式,支持报警规则的配置,如日志中产生了某些异常、接口响应时间大于多少、接口返回状态码404等异常信息的时候能够报警,具体的报警可以是语音电话、短信通知、钉钉机器人报警等等,这些也做成可以配置的。

日志监控模块从mq中拉取日志,然后去匹配我们启用的一些规则进行报警。

结构图如下

640?wx_fmt=png

关于搭建日志中遇到的一些痛点,可以加我微信itsoku交流。

构建日志系统需要用到的知识点


  1. java中线程池的使用

  2. ThreadLocal、InheritableThreadLocal(通俗易懂)

  3. elasticsearch,可以参考其官方文档

  4. mq

java高并发系列目录


  1. 第1天:必须知道的几个概念

  2. 第2天:并发级别

  3. 第3天:有关并行的两个重要定律

  4. 第4天:JMM相关的一些概念

  5. 第5天:深入理解进程和线程

  6. 第6天:线程的基本操作

  7. 第7天:volatile与Java内存模型

  8. 第8天:线程组

  9. 第9天:用户线程和守护线程

  10. 第10天:线程安全和synchronized关键字

  11. 第11天:线程中断的几种方式

  12. 第12天JUC:ReentrantLock重入锁

  13. 第13天:JUC中的Condition对象

  14. 第14天:JUC中的LockSupport工具类,必备技能

  15. 第15天:JUC中的Semaphore(信号量)

  16. 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能

  17. 第17天:JUC中的循环栅栏CyclicBarrier的6种使用场景

  18. 第18天:JAVA线程池,这一篇就够了

  19. 第19天:JUC中的Executor框架详解1

  20. 第20天:JUC中的Executor框架详解2

  21. 第21天:java中的CAS,你需要知道的东西

  22. 第22天:JUC底层工具类Unsafe,高手必须要了解

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
-1714857165645)]

[外链图片转存中…(img-y9dySaVT-1714857165646)]

[外链图片转存中…(img-EGmVg5mj-1714857165646)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值