描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111653615
这是一本介绍微服务设计的书,以及度量驱动开发方法,覆盖了微服务开发、运维的所有环节,是分布式应用开发者必备宝典。本书作者多年从事微服务度量的开发,把多年的实践经验总结出来著成此书,内容详实,易于理解,理论结合实际。
本书由资深架构师撰写,系统地介绍微服务设计与实现方法,以及度量驱动开发的理论与实践,融入了作者多年架构设计的经验。主要内容包括:
第1章介绍微服务理论与原则,包括微服务的概念、协议、特点等;
第2章介绍微服务度量的基本概念;
第3章介绍微服务度量的设计方法,包括设计要点、应对变化、测试驱动的开发等;
第4章通过案例讲解微服务实现的过程,包括一个完整实例;
第5章和第6章分别介绍度量数据的聚合与展示、分析与报警;
第7章介绍度量驱动的运维,包括部署升级、配置调整等;
第8章介绍全链路度量。
Contents 目 录
本书赞誉
前言
第1章 微服务入门 1
1.1 单体服务的特点 1
1.2 拆分服务 2
1.2.1 分而治之以降低复杂性 2
1.2.2 分而用之以提高可重用性 4
1.2.3 分而做之以提高开发效率 5
1.3 微服务的特点 5
1.3.1 微服务架构的特点 6
1.3.2 微服务架构的特征 7
1.3.3 微服务架构的风格 7
1.3.4 微服务的分类 7
1.3.5 多小的服务才是微服务 8
1.4 微服务之道 8
1.4.1 软件之道 8
1.4.2 关于微服务的思考 10
1.5 土豆微服务案例快速上手 11
1.5.1 土豆微服务构建计划 11
1.5.2 微服务构建一:土豆管理微服务 13
1.5.3 微服务构建二:土豆提醒微服务 24
1.5.4 微服务构建三:土豆网页微服务 30
1.5.5 部署土豆微服务 35
1.6 本章小结 38
第2章 微服务度量的基本概念 39
2.1 微服务的局限及其解决方案 39
2.1.1 微服务的局限 39
2.1.2 解决方案 40
2.2 微服务中度量的重要性 41
2.3 微服务度量的内容 42
2.3.1 按度量的目标划分 43
2.3.2 按度量的层次划分 44
2.4 微服务度量指标与术语 49
2.4.1 统计学指标 49
2.4.2 度量指标相关术语 53
2.4.3 度量处理相关术语 55
2.5 微服务度量策略选择 58
2.5.1 如何做度量 58
2.5.2 如何选择度量方案 60
2.6 本章小结 63
第3章 微服务度量的设计 64
3.1 微服务协议的选择与度量 64
3.1.1 协议概述 64
3.1.2 协议分类 65
3.1.3 协议分析 67
3.2 HTTP及其度量 71
3.2.1 HTTP简介 71
3.2.2 REST协议的度量要点 71
3.3 SIP及其度量 72
3.3.1 SIP简介 72
3.3.2 SIP的度量要点 73
3.4 RTP及其度量 73
3.4.1 RTP简介 73
3.4.2 RTP的度量要点 74
3.5 数据存储系统的选型 76
3.5.1 理论回顾 76
3.5.2 数据存储系统选型 78
3.5.3 数据存储系统特性 79
3.6 基于度量实现高可用性 80
3.6.1 分流——负载均衡 81
3.6.2 限流——速率控制 83
3.6.3 断流——熔断隔离 91
3.7 土豆微服务度量驱动的设计 95
3.7.1 为如何度量而设计 96
3.7.2 通过度量改进设计 101
3.8 本章小结 102
第4章 度量驱动的微服务实现 103
4.1 度量代码 103
4.1.1 代码度量标准 103
4.1.2 代码度量关键指标 105
4.1.3 小结 107
4.2 度量进度 108
4.3 度量性能 110
4.4 度量微服务的常用技术 123
4.4.1 利用切面记录度量日志 123
4.4.2 利用线程局部变量记录度量信息 124
4.4.3 利用过滤器找准度量点 126
4.4.4 提供JMX暴露内部度量指标 127
4.4.5 提供API或命令行接口暴露内部度量指标 131
4.4.6 阈值和采样率控制度量数据量 132
4.4.7 利用简单网络管理协议提供度量查询和报警支持 135
4.4.8 综合利用以上技术 135
4.5 度量常用类库 138
4.5.1 Dropwizard的Metrics-core 138
4.5.2 Pivotal的Micrometer 140
4.5.3 Spring Boot Actuator 142
4.6 土豆微服务度量实现 147
4.6.1 为土豆微服务提供代码度量 147
4.6.2 为土豆微服务添加健康检查API 152
4.6.3 为土豆微服务提供资源使用率度量 156
4.6.4 为土豆微服务提供使用量的度量 157
4.6.5 为土豆微服务提供性能度量 159
4.6.6 为土豆微服务提供错误度量 160
4.6.7 为土豆微服务提供业务KPI度量 160
4.7 本章小结 163
第5章 度量数据的聚合与展示 164
5.1 度量数据的聚合和存储 164
5.2 度量数据的清洗和处理 166
5.2.1 数据清洗的方法 166
5.2.2 数据清洗的案例 166
5.3 度量数据的可视化 170
5.3.1 图表的结构 170
5.3.2 图表的类型 170
5.3.3 如何选择图表 179
5.4 常用度量聚合与展示方案 181
5.4.1 TIG方案 181
5.4.2 ELKK方案 188
5.4.3 Collectd方案 193
5.4.4 Prometheus方案 198
5.5 土豆微服务的度量聚合与展示 200
5.5.1 土豆微服务支持多种度量聚合与展示系统的设计 200
5.5.2 基于TIG的土豆微服务度量聚合与展示 202
5.5.3 基于ELKK的土豆微服务度量聚合与展示 207
5.6 本章小结 214
第6章 度量数据的分析与报警 215
6.1 度量数据的分析 215
6.1.1 确定数据分析的目标 215
6.1.2 数据分析常见问题 218
6.2 实现报警常用的技术 222
6.2.1 Python数据分析技术栈 223
6.2.2 YAML配置文件 223
6.2.3 Elasticsearch API 224
6.2.4 Pandas DataFrame 226
6.2.5 Matplotlib 228
6.3 土豆微服务的报警实现 230
6.3.1 报警系统的设计 230
6.3.2 报警系统的实现 232
6.3.3 报警系统的优化 242
6.4 本章小结 244
第7章 度量驱动的运维 245
7.1 部署升级 245
7.1.1 何时能部署到产品线上 246
7.1.2 如何发布新功能 247
7.2 数据的运维 251
7.2.1 健康检查 251
7.2.2 度量报告 251
7.2.3 度量警告 252
7.2.4 故障处理 252
7.2.5 基于度量来发现和解决问题 255
7.3 配置调整 258
7.3.1 关于配置的思考 259
7.3.2 配置的版本管理 259
7.3.3 配置的载体 260
7.3.4 环境管理 262
7.3.5 配置微服务 262
7.3.6 配置管理实例 263
7.4 开源组件的度量 267
7.4.1 对Redis的度量 267
7.4.2 对Kafka的度量 270
7.4.3 对Cassandra的度量 273
7.5 土豆微服务的运维示例 276
7.6 本章小结 280
第8章 全链路度量 281
8.1 微服务的调用链路度量 281
8.1.1 3个关键信息 282
8.1.2 5个要点 283
8.1.3 3种标识 283
8.1.4 开源调用链分析方案 284
8.1.5 构建土豆微服务调用链的度量 285
8.2 客户端度量数据的采集 289
8.3 度量驱动开发的回顾与展望 291
8.4 本章小结 293
附录 常用的度量相关工具与软件库 294
Preface 前 言
在程序员的世界里,新概念、新技术层出不穷,诚如庄子所言:“吾生也有涯,而知也无涯,以有涯随无涯,殆已!”把学习新技术当作一种乐趣,掌握其精髓,并应用到日常的开发工作中,提高开发效率,构建出更酷、更符合用户需求的产品,是一件很快乐的事。
我们所在的团队是公司的后台服务器开发部门,一直以来我们所做的系统多是传统的、基于 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年合作完成了全书。尽管如此,我们仍感时间仓促,有许多未尽之言,限于篇幅,有些框架和工具的详细用法以及大数据和机器学习的实践没有提及,希望以后能有机会与读者分享和交流。作为一线的开发者,写作时间有限,写作水平不高,难免会有偏颇和不足之处,敬请各位读者不吝赐教,多多指正。
致谢
感谢我生命中最重要的三位女性——我的母亲、妻子和女儿,你们是我最爱的人,谢谢你们对我的支持和爱。感谢机械工业出版社的吴怡老师给我鼓励,以及对我的拖延症的忍耐;感谢傅健同学的帮助与合作;感谢我的老弟张鹏和老同学陈略涛的支持与意见;还要谢谢和我们一起工作的小伙伴,在同你们一起工作的过程中我学到了很多。
——范亚敏
首先感谢范兄的邀请,我才有机会参与这本书的编写,也感谢吴怡老师的悉心指导。“罗马不是一天建成的”,写书更是一个不断打磨、完善的过程,所以非常感谢两位不遗余力地一路陪伴。最后也感谢我的家人,可以容忍我将家庭生活的部分时间抽出来投入书籍编写中。
——傅健
评论
还没有评论。