在现在企业纷纷转型微服务的过程当中,微服务架构中日志记录的重要性时常会被忽略。本文做者十分关注微服务日志记录,提出了独到的观点,并与你们分享关于微服务日志记录的各类技巧的最佳实践。服务器
微服务架构是一种软件架构类型,着重于利用大量细分组件进行应用开发,其中每一个组件都负责总体业务中的一小部分。这些组件彼此独立,支持在本身的进程之上,且可以相互通讯以实现业务目标。session
不少企业都开始将总体型应用拆分为微服务形式。而在拆分大型应用时,咱们须要创建松散耦合的模块,从而保证其便于测试并下降变动风险。另外,这些模块亦可独立部署以实现横向规模扩展。然而,这也会带来一些初看并不严重,但长远影响极其重大的问题——其中的典型表明就是日志记录。架构
日志记录存在于一切应用当中,不管其属于总体仍是微服务架构。关键在于,当咱们将应用拆分为微服务形式时,咱们须要投入大量时间来思考业务边界并找寻最理想的应用逻辑拆分方式——但不多有人会对日志记录给予应有的重视。分布式
固然,你们可能会问:日志记录的方式一直没有变化过,为何如今倒成了须要关注的问题?微服务
理由在于,总体应用内的事务追踪每每比较困难,有时候咱们只能依靠日志记录来理解当前情况。另外,当业务逻辑运行在多项服务中时,监控与日志记录的难度也会相应增长。这意味着若是咱们没有明智地规划出微服务记录机制,那么最终可能根本没法理解应用的当前运行状态。工具
正由于如此,我想与你们分享个人我的经验以及做为软件开发者积累到的一点心得。近年来我一直在使用微服务方案,但愿你们可以在读完本文后意识到日志记录的重要性与实现难点。测试
在使用微服务时,整套体系每每会同一时间运行同一组件的多个实例。最重要的就是在日志条目中设立实例标识符,从而区分各条目的具体来源。其ID的具体生成方式其实并不重要,只要保证唯一便可,这样咱们才能借此回溯到特定服务器/容器以及生成该条目的应用处。在微服务架构中,你们能够利用服务注册表轻松为每项服务分配唯一的标识符。网站
这项心得不只适用于微服务架构,在其它场景下也一样值得坚持。任何使用过度布式应用程序——或者组件分散在各处——的朋友,都会意识到各组件使用不一样时区进行计时有多么使人头痛。而在微服务架构中,以本地时间记录的日志条目会带来更严重的问题。若是你们确实须要使用本地时间,请在日志条目中以字段形式添加时区,从而简化信息的检索方式。但更重要的是必定要为UTC时间设立时区,并利用它在聚合工具内进行信息排序。
下面来看示例日志信息:spa
第一部分是由一项运行在新西兰的服务所生成。第二部分则由运行在巴西的服务生成。因为咱们使用本地日期,所以由巴西服务生成的信息会早于新西兰信息——但其实际生成时间却偏偏相反。日志
如今,让咱们看看使用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