热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微服务转型绕不开的坑——日志记录这样做就对了

在如今企业纷纷转型微服务的过程中,微服务架构中日志记录的重要性时常会被忽略。本文作者十分关注微服务日志记录,提出了独到的观点,并与大家分享关于微服务日志记录的各种技巧的最佳实践。

微服务架构是一种软件架构类型,着重于利用大量细分组件进行应用开发,其中每个组件都负责整体业务中的一小部分。这些组件彼此独立,支持在自己的进程之上,且能够相互通信以实现业务目标。

为什么要关注日志记录?

很多企业都开始将整体型应用拆分为微服务形式。而在拆分大型应用时,我们需要建立松散耦合的模块,从而保证其便于测试并降低变更风险。另外,这些模块亦可独立部署以实现横向规模扩展。然而,这也会带来一些初看并不严重,但长远影响极其重大的问题——其中的典型代表就是日志记录。

日志记录存在于一切应用当中,无论其属于整体还是微服务架构。关键在于,当我们将应用拆分为微服务形式时,我们需要投入大量时间来思考业务边界并找寻最理想的应用逻辑拆分方式——但很少有人会对日志记录给予应有的重视。

当然,大家可能会问:日志记录的方式一直没有变化过,为什么现在倒成了需要关注的问题?

理由在于,整体应用内的事务追踪往往比较困难,有时候我们只能依靠日志记录来理解当前状况。另外,当业务逻辑运行在多项服务中时,监控与日志记录的难度也会相应增加。这意味着如果我们没有明智地规划出微服务记录机制,那么最终可能根本无法理解应用的当前运行状态。

正因为如此,我想与大家分享我的个人经验以及作为软件开发者积累到的一点心得。近年来我一直在使用微服务方案,希望大家能够在读完本文后意识到日志记录的重要性与实现难点。

心得一——设立应用实例标识符

在使用微服务时,整套体系往往会同一时间运行同一组件的多个实例。最重要的就是在日志条目中设立实例标识符,从而区分各条目的具体来源。其ID的具体生成方式其实并不重要,只要保证惟一即可,这样我们才能借此回溯到特定服务器/容器以及生成该条目的应用处。在微服务架构中,大家可以利用服务注册表轻松为每项服务分配惟一的标识符。

心得二——坚持使用UTC时间

这项心得不仅适用于微服务架构,在其它场景下也同样值得坚持。任何使用过分布式应用程序——或者组件分散在各处——的朋友,都会意识到各组件使用不同时区进行计时有多么令人头痛。而在微服务架构中,以本地时间记录的日志条目会带来更严重的问题。如果大家确实需要使用本地时间,请在日志条目中以字段形式添加时区,从而简化信息的检索方式。但更重要的是一定要为UTC时间设立时区,并利用它在聚合工具内进行信息排序。
下面来看示例日志信息:

微服务转型绕不开的坑——日志记录这样做就对了
第一部分是由一项运行在新西兰的服务所生成。第二部分则由运行在巴西的服务生成。由于我们使用本地日期,因此由巴西服务生成的信息会早于新西兰信息——但其实际生成时间却恰恰相反。

现在,让我们看看使用UTC时间与时区后的示例信息:

微服务转型绕不开的坑——日志记录这样做就对了

现在两条信息已经得到正确的时间排序,如果大家希望了解信息的本地生成时间,则可将其由UTC转换为特定时区。

心得三——生成请求标识符

在将业务逻辑拆分为多个不同组件时,我们的逻辑最终需要由一个或者多个组件构成。而在追踪这些事务时,我们往往很难对其加以识别。因此,大家应当为每个事务生成一个惟一标识符,并利用其关联事件以及追踪各项事务。

想象一下,如果我们需要利用以下请求序列在某电子商务网站上购买产品:

微服务转型绕不开的坑——日志记录这样做就对了
那么我们对于操作的分组方法,显然取决于事务的实际定义(毕竟其也能够进行嵌套)。最重要的是确保在事务开端,我们为其创建一个能够传递下去的标识符,并借此在事务结束之前全程记录日志条目。

一般来讲,我倾向于使用人工生成的ID来区分自己的事务。大家也可以使用user_id或者session_id处理与用户相关的事务。而在进行结算与支付时,大家可以使用order_id来追踪结算与付款操作。不过其前提是大家已经进行了用户登录,或者创建了拥有order_id的订单——但实际情况往往并非如此。在使用手动ID时,大家可以将事务ID从业务逻辑流中解耦出来。

另外需要注意的是,这些ID需要拥有足够的信息以对系统中的各项事务进行区分。有时候事务识别符可能在日志条目中体现为一整套字段组合。

心得四——利用聚合工具进行日志分组

如果大家没有对来自全部微服务的日志条目进行聚合,那么以上提到的心得将毫无意义。要实现这一目标,我们需要使用一款能够轻松实现条目分组与查询的工具。我个人使用ELK堆栈,其效果相当出色。如果大家之前没听过ELK,这里可以稍微解释几句。ELK是三款应用的集合体,由此构成的完整解决方案能够调度日志条目、实现条目存储与索引,而后对信息进行聚合与可视化处理。

我们可以利用ELK对应用程序日志进行多种规模伸缩与分发处理,但这里就不讲太多了。感兴趣的朋友可以查看Logz.io博客上的Logstash教程,其中提到了多项相关使用技巧。另外,我们也可以使用Logz.io等企业服务处理日志基础设施的设置与维护工作,从而确保自己的微服务体系采用最理想的日志记录实践方案。

总结

这篇文章的目的是向大家强调在微服务架构中重视日志记录的必要性,同时分享一些在实际应用当中积累到的最佳实践。但这仅仅是个开始,相信大家能够采用多种其它方式解决日志记录难题。

文章来源:Logz.io 作者 Lucas Saldanha


推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
author-avatar
cecillalurw_689
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有