前言

在程序员的世界里,新概念、新技术层出不穷,诚如庄子所言:“吾生也有涯,而知也无涯,以有涯随无涯,殆已!”把学习新技术当作一种乐趣,掌握其精髓,并应用到日常的开发工作中,提高开发效率,构建出更酷、更符合用户需求的产品,是一件很快乐的事。

我们所在的团队是公司的后台服务器开发部门,一直以来我们所做的系统多是传统的、基于C++的单体后台服务系统。大约在2015年,我们又承接了几个微服务系统的开发,并引入了Java和Python技术栈来提高开发效率。随着对微服务了解的深入,我们发现微服务有其适用的场景和优缺点,实践越多,越感觉到度量(metric)对于微服务的重要性。传统的单体服务当然也少不了监控与度量,然而对于微服务,度量不但是部署上线之后的必要手段,而且是整个微服务开发生命周期中不可或缺的充分必要条件。随着度量在日常工作中所占的比重越来越大,我们逐渐从实践中形成了度量驱动开发的方法。

想必大家都知道著名诗人顾城的名句:“黑夜给了我黑色的眼睛,我却用它寻找光明。”对于微服务开发者来说,度量给我们的眼睛加上了智能的“探照灯”,它在汪洋大海中照亮我们前行的路线,没有度量,就像黑夜行驶在大海中的船没有罗盘和星辰,就会迷失方向,无法到达彼岸。

我在公司内部做了几次关于度量驱动开发的分享,也在博客上记录了一些度量驱动开发的心得体会。与机械工业出版社吴怡编辑的几次讨论,使我萌生了写一本书的想法,讲一讲关于微服务与度量驱动开发的那些事儿,并邀请和我在一个团队的傅健同学加入,一起将我们积累的微服务度量驱动开发的经验和教训分享给大家。

本书共8章,基本按照我们自己的经历(从一开始接触微服务到熟练应用度量驱动开发方法),由浅入深,按照微服务开发的全过程逐步展开。

在本书主线上,我们从微服务的特点入手,引出了度量驱动开发的基本概念、内容、方法与策略,然后从度量的设计和实现开始详细讲述如何设计与实现微服务的度量,并介绍如何用度量驱动的方法和技术来改进微服务。接下来,详细阐述了度量数据的聚合与展示、分析与报警的各种方案,最后结合实例介绍了度量驱动运维和微服务的全程度量。下面简要介绍一下本书各章节的主要内容。

第1章为微服务入门,对比了单体服务与微服务的特点,讲解了我们心中的微服务之道,并介绍了一个贯穿始终的微服务实例——土豆微服务,将我们熟悉的待办事项Todo List应用拆分为土豆管理微服务、土豆提醒微服务和土豆网页微服务,并分别简述了它们的功能与设计。在技术实现上,使用Java语言基于Spring Boot进行开发,这个案例为后续的度量做了最基本的铺垫。

第2章为微服务度量的基本概念,从微服务的局限引出了度量驱动开发的基本概念,详细阐述了度量的内容、层次、方法与策略,以及度量常用的术语和指标。

第3章为微服务度量的设计,首先从微服务的协议入手,介绍了如何选用和分析微服务的协议,并对HTTP、SIP和RTP这三个微服务中常用协议的度量进行详细讲解。之后介绍了如何基于度量选用合适的存储系统,如何基于度量来提高微服务的可靠性,最后结合实例讲述了微服务度量驱动的设计。

第4章是度量驱动的微服务实现,介绍在实际的微服务过程中如何度量代码质量、开发进度、微服务的性能,并详细讲解了Java技术栈中常用的度量技术和类库,最后结合实例讲述了如何给我们的土豆微服务实现度量驱动。

第5章是度量数据的聚合与展示,首先讲述了如何聚合和存储度量数据,如何进行必要的清洗和处理。然后重点讲解了度量的可视化技术,如何选择和绘制各种图表。在具体的技术栈中,介绍了常用的TIG(Telegraf/InfluxDB/Grafana)、ELKK(Elasticsearch/LogStash/Kibana/Kafka)和Prometheus技术栈,并结合实例演示了如何有效地聚合与展示度量数据。

第6章是度量数据的分析与报警,讲解了如何分析度量数据,如何揭示隐藏在图表背后的意义,哪些需要改变配置,哪些需要调整设计,哪些需要触发报警并立刻采取行动。最后利用ELKK技术栈,从零开始用Python打造了一款实用的度量报警系统。

第7章是度量驱动的运维,讲解了如何通过度量来驱动我们进行高质量的运维,将度量驱动的方法贯穿于微服务的部署升级、配置调整与日常的运维工作,并介绍了常用的Redis、Kafka等开源组件的运维度量要点,最后结合实例讲述了土豆微服务的运维。

第8章是全链路度量,首先讨论了微服务的调用链路跟踪与度量,然后讲述了客户端应用或App端的度量数据采集与度量要点,最后对于微服务的度量驱动开发做了一个回顾与展望。

从实践中来,到实践中去。本书源自我们在工作中的心得与总结,以一个土豆微服务的实例贯穿全书,讲述从微服务开发的设计、实现到运维的全过程。书中大多数素材来自我们的工作笔记和工作实践,将其总结成一套度量驱动开发的方法。也许我们并不是度量驱动开发的首倡者,却是自觉自发、身体力行的践行者。本书偏重实战和方法,在理论方面则点到为止,有经验的开发者可以不拘于顺序,根据自己的知识背景选取感兴趣的章节阅读。对于初学者,还是建议按章节顺序循序渐进地阅读,先理解概念和方法,再实际运行和阅读示例代码。

我们公司所用的主要语言有C++、Java、 Python和Go。本书仅以Python和Java语言举例,所有源代码、脚本和一些说明文档均放在网址https://github.com/walterfan/mdd中,大家可以下载参考。

如果你正在学习或实现微服务,抑或正在从传统的单体服务向微服务转型,这本书应该非常适合你。通过应用书中所介绍的度量驱动开发的概念和方法,相信你一定能构建出令自己和客户都满意的微服务,为你的团队和公司创造更多的价值。

本书面向微服务开发人员、运维和测试工程师,对于项目和技术经理亦有帮助。我们坚信,度量驱动开发(Metrics Driven Development, MDD)是微服务成功的必由之路,也相信你读过本书后,再将其应用于实践,会和我们一样深有同感。

写作这本书开始于两年前,没想到会写这么久。日常繁忙的工作、出差使得写作进度缓慢。在写作期间我还生了一场大病。病愈之后,我决心珍惜大好的时光,抓紧时间完成写作,并请傅健同学帮我一起充实和打磨书稿。通过互相的督促和鼓励,我们一起在2020年合作完成了全书。尽管如此,我们仍感时间仓促,有许多未尽之言,限于篇幅,有些框架和工具的详细用法以及大数据和机器学习的实践没有提及,希望以后能有机会与读者分享和交流。作为一线的开发者,写作时间有限,写作水平不高,难免会有偏颇和不足之处,敬请各位读者不吝赐教,多多指正。

致谢

感谢我生命中最重要的三位女性——我的母亲、妻子和女儿,你们是我最爱的人,谢谢你们对我的支持和爱。感谢机械工业出版社的吴怡老师给我鼓励,以及对我的拖延症的忍耐;感谢傅健同学的帮助与合作;感谢我的老弟张鹏和老同学陈略涛的支持与意见;还要谢谢和我们一起工作的小伙伴,在同你们一起工作的过程中我学到了很多。

——范亚敏

首先感谢范兄的邀请,我才有机会参与这本书的编写,也感谢吴怡老师的悉心指导。“罗马不是一天建成的”,写书更是一个不断打磨、完善的过程,所以非常感谢两位不遗余力地一路陪伴。最后也感谢我的家人,可以容忍我将家庭生活的部分时间抽出来投入书籍编写中。

——傅健