
互联网架构不断演化,经历了从集中式架构到分布式架构,再到云原生架构的过程。云原生因能解决传统应用升级缓慢、架构臃肿、不能快速迭代等问题而成为未来云端应用的目标。本书首先介绍了架构演化过程及云原生的概念,让读者对基础概念能有一个准确的了解。接着阐述分布式、服务化、Observability、容器调度、Service Mesh、云数据库等体系及其原理,并介绍了与其相关的Dubbo、Spring Cloud、SkyWalking、Kubernetes、Istio开源解决方案。最后深度揭秘开源分布式数据库生态圈Sharding-Sphere的设计与实现。
序 一次诚挚的写书邀约,一个深思熟虑后的决定,一番夜以继日的付出,以及一些“曲折离奇”的经历——《未来架构:从服务化到云原生》诞生了! 2015年年底,当时我还在当当网担任架构师,从事业务系统架构设计与内部应用框架研发方面的工作,处于事业上升期。在一次技术分享的会场,我偶遇电子工业出版社博文视点的编辑孙奇俏老师,她向我发出写书邀约。虽然当时我自认资历尚浅,并未接受这份邀约,但这件事却像一颗种子一样深深扎根在我的心中。 在那之后,我在互联网架构这个圈子里不断拓宽视野,积累经验,产生了越来越多的热情和新鲜想法,也深深受到周围那些具有真才实学又意气风发的挚友和同僚们的感染。这些点点滴滴让我觉得,我也要做点事情来传递多年以来在这个行业中沉淀的经验,分享我眺望到的未来架构的前沿思潮。倘若这些想法和经验能够帮助或影响到更多的朋友,或能让我自己与更多朋友结识、交流、碰撞出新的想法,那该是一件多么令人骄傲的事啊!于是我与奇俏老师保持密切沟通,经过反复的推敲琢磨,这颗深埋在心里的种子终于开始萌芽,2016年年底,我的写作之旅正式开启。 书到用时方恨少,事非经过不知难。美好的愿景总会受到现实的无情打击,写书亦是如此。虽说可以以自身的所见所闻、所观所悟为素材提炼出写作的内容,可是如何确立选题和设计主线才能让一本书承载更多精粹的知识,容纳更多有价值、有意义的内容呢?我觉得我所追求的“完美”的书,应当是一本能够有质有量地给予读者巨大价值的书。 互联网的迭代十分迅速,当前经历的一切都在渐渐逝去。我希望这本书能承载现今互联网架构的精粹,而不只是一本简单的使用手册,因为快餐只能让人获得一时的能量,无法带给人们长久的满足。与此同时,我还希望读者们能通过这本书了解未来的趋势,捕捉到前沿的技术热点,在架构选择与从业选择方面获得一些有价值的建议。 在确立了本书的定位后,经过深思熟虑,静心沉淀,充分调研,融合提炼,我对现有的知识体系进行了重塑,希望能将更多的架构设计理念、技术实现原理、热点概念背后的本质汇集在这本书中。 在开启写作之旅后,只要有机会我就会陷入“心流”状态,在脑海中不断地构思内容、提炼知识点,并在无数个寂寞的夜晚以灯为伴,将平时的所思所感汇集于一页页纸张中。 写小说可以随心所欲,心随笔动;而写技术书则应当不差毫厘、信而有征,让内容兼备深度与广度。为了达到这个目的,数不清的查阅校对、询问商讨是必不可少的,这其中的艰辛,也只有真正写过书的人才能感同身受。 为了让这本书更具专业性,并能尽快与大家见面,我特意邀请了我的三位挚友共同组织内容,他们是,Apache基金会孵化器项目SkyWalking创始人吴晟、ServiceMesher中文社区联合创始人及Service Mesh布道师敖小剑、ServiceMesher中文社区联合创始人及云原生布道师宋净超,我相信集众人所长定能让这本书更具含金量。 身处这个飞速发展的时代,以及高速迭代的IT行业,我知道每个人都不甘平庸,否则又怎会在互联网行业的高速路上不停奔跑呢?作为一名架构师,我主导且参与了一些优秀的开源项目,这其中也包含进入Apache基金会的项目ShardingSphere。作为一名拥有十多年开发经验的程序员,我崇尚代码优雅和简捷,并一直以极客主义严格要求自己和团队。我深切感受到,在这个行业中若想成为优秀的人,甚至完美的人,不仅需要低下头深深扎进代码的世界,也需要抬起头观察行业动态,洞察未来趋势,最重要的是,要不忘初心,持之以恒,永远怀有热爱和感恩之心。 2018年对我而言是充满转折的一年,这一年里我对已经写好的内容又进行了修改和完善,还将ShardingSphere从开源到进入Apache的经历也融入书中。终于,在2018年即将结束之时,我为自己的写书之旅画上了一个圆满的句号。 这本书献给我远去的回忆和憧憬的未来,献给想要洞察架构真谛的你,献给想要迫切了解行业发展动态的你,献给想要认识未来架构的每一个你…… 张亮 2019年1月于北京 前言 为什么写此书 身处互联网行业的我们一直处在变革的最前端,受到行业发展浪潮的洗礼,不停歇地追赶着技术革新的脚步。特别是近几年来,互联网架构不断演化,经历了从集中式架构到分布式架构,再到云原生架构的过程。在这个演变过程中,我们可以深刻感受到一系列的格局变化——软件改变世界,开源改变软件,云吞噬开源。每一次架构模式的升级都会给这个世界的合作模式带来变化。 “云原生”因能解决传统应用升级缓慢、架构臃肿、不能快速迭代等问题而逐渐成为这个时代舞台的主角。身处变革的浪潮中,我看到云原生的出现改变了互联网架构的航行方向,并给越来越多的企业带来了全新的理念和无限的可能。因此,我希望能够学习它、读懂它,让它融入我的知识体系,更新我脑海中的架构地图。 十几年的互联网从业经验与层出不穷的新技术不断碰撞,终于让我有了将所知、所见、所闻、所感落在纸面的冲动。写这本书不求功名利禄,只希望它能积淀旧识,引领新潮,记录架构的发展历程,并为每一个正在阅读的你答疑解惑。 所以,有幸与各位相聚于此,相聚于《未来架构:从服务化到云原生》。 本书内容 本书将互联网架构近几年发展的起承转合进行了提炼,为大家展示了互联网架构的变迁,对最新热门技术进行了深度解读。本书共分10章,每章的简要内容如下。 第1章 云原生 本章将阐述从集中式架构到分布式架构,再到云原生架构这一系列的互联网架构变迁细节,并对云原生的产生、发展及核心理念进行深刻的解读。 第2章 远程通信 本章将深入解读远程通信的核心内容,对远程通信方式和协议、序列化问题,以及远程调用架构的发展进行介绍。 第3章 配置 本章将对生产应用、服务调用中的配置进行讲解,对应用配置中的集中化管理、注册中心与配置中心、读性能、可用性、数据一致性等常见内容进行详细阐述。 第4章 服务治理 本章将着重讲解服务发现、负载均衡、限流及熔断等内容,对服务治理中的关键概念进行详细解读,对比容易混淆的知识点,方便读者进行架构选型。 第5章 观察分布式服务 本章将对观察分布式服务的核心概念和层次划分进行深入剖析,并且进一步对市场主流的开源解决方案进行介绍,最后对为微服务架构和云原生架构系统而设计的支持分布式链路追踪的APM系统——Apache SkyWalking进行详细介绍。 第6章 侵入式服务治理方案 本章将详细剖析Dubbo、Spring Cloud这两种主流的侵入式服务治理方案,并通过一些实战案例更好地对第4章中阐述的理念进行补充。 第7章 云原生生态的基石Kubernetes 作为云原生的基石,Kubernetes可谓家喻户晓。本章走进Kubernetes的世界,介绍它的前世今生、架构模型、设计理念与模式,同时对云原生生态和未来趋势进行解读。 第8章 跨语言服务治理方案Service Mesh Service Mesh因被誉为下一代互联网架构而备受瞩目,本章将从Service Mesh的定义、发展历程等角度进行详细介绍,同时对Service Mesh当前的市场状况及国内发展趋势进行说明。 第9章 云原生数据架构 从传统关系型数据库到NoSQL,再到NewSQL,这个转化过程是如何实现的呢?云原生数据库中间件的定位和发展又是怎么样的呢?本章将围绕以上两个问题进行解答。 第10章 分布式数据库中间件生态圈ShardingSphere 作为知名的开源分布式数据库中间件解决方案,Apache ShardingSphere受到了越来越多的企业和个人关注。为何它可以在GitHub上收获超高人气,得到各大公司的青睐呢?本章将重点介绍ShardingSphere的发展历程和未来趋势,解答上述疑问。
第1章 云原生 1 1.1 互联网架构变迁 2 1.1.1 互联网架构的核心问题 2 1.1.2 从集中式架构到分布式架构 5 1.1.3 从分布式架构到云原生架构 10 1.2 什么是云原生 15 1.2.1 概述 15 1.2.2 云原生与十二要素 16 1.2.3 十二要素进阶 23 1.2.4 云原生与CNCF 24 第2章 远程通信 41 2.1 通信方式 41 2.1.1 通信协议 42 2.1.2 I/O模型 51 2.1.3 Java中的I/O 53 2.2 序列化 66 2.2.1 文本序列化 67 2.2.2 二进制Java序列化 68 2.2.3 二进制异构语言序列化 71 2.3 远程调用 78 2.3.1 核心概念 78 2.3.2 Java远程方法调用 79 2.3.3 异构语言RPC框架gRPC 82 第3章 配置 89 3.1 本地配置 89 3.2 配置集中化 90 3.3 配置中心和注册中心 91 3.4 读性能 92 3.5 变更实时性 93 3.6 可用性 94 3.7 数据一致性 96 第4章 服务治理 97 4.1 服务发现 97 4.1.1 服务发现概述 97 4.1.2 ZooKeeper 100 4.1.3 Eureka 109 4.2 负载均衡 112 4.2.1 服务端负载均衡 112 4.2.2 客户端负载均衡 115 4.3 限流 118 4.3.1 限流算法 119 4.3.2 限流实现方案 121 4.3.3 限流的维度与粒度 129 4.4 熔断 131 4.4.1 概述 131 4.4.2 熔断器模式 132 4.4.3 Hystrix 133 第5章 观察分布式服务 135 5.1 层次划分 136 5.2 核心概念 136 5.3 分布式追踪 138 5.3.1 概述 138 5.3.2 常见的开源解决方案 139 5.4 应用性能管理与可观察性平台 140 5.5 Apache SkyWalking 142 5.5.1 项目定位 142 5.5.2 SkyWalking 5核心架构 143 5.5.3 SkyWalking 5公开案例 146 5.5.4 SkyWalking 6可观察性分析平台 147 第6章 侵入式服务治理方案 157 6.1 Dubbo 157 6.1.1 Dubbo概述 158 6.1.2 核心流程 160 6.1.3 注册中心 160 6.1.4 负载均衡 162 6.1.5 远程通信 163 6.1.6 限流 164 6.1.7 治理中心 165 6.1.8 监控中心 165 6.1.9 DubboX的扩展 166 6.2 Spring Cloud 168 6.2.1 概述 168 6.2.2 开发脚手架Spring Boot 172 6.2.3 服务发现 174 6.2.4 负载均衡 176 6.2.5 熔断 178 6.2.6 远程通信 179 第7章 云原生生态的基石Kubernetes 181 7.1 Kubernetes架构 182 7.2 分层设计理念及架构模型 183 7.3 设计哲学 184 7.4 Kubernetes中的原语 185 7.4.1 Kubernetes中的对象 185 7.4.2 对象的期望状态与实际状态 186 7.4.3 描述Kubernetes对象 187 7.4.4 服务发现与负载均衡 188 7.4.5 安全性与权限管理 189 7.4.6 Sidecar设计模式 190 7.5 应用Kubernetes 190 7.6 Kubernetes与云原生生态 192 7.6.1 下一代云计算标准 192 7.6.2 当前存在的问题 192 7.6.3 未来趋势 193 第8章 跨语言服务治理方案Service Mesh 195 8.1 Service Mesh概述 195 8.1.1 Service Mesh的由来 195 8.1.2 Service Mesh的定义 196 8.1.3 Service Mesh详解 197 8.2 Service Mesh演进历程 200 8.2.1 远古时代的案例 200 8.2.2 微服务时代的现状 201 8.2.3 侵入式框架的痛点 202 8.2.4 解决问题的思路 206 8.2.5 Proxy模式的探索 207 8.2.6 Sidecar模式的出现 208 8.2.7 第一代Service Mesh 209 8.2.8 第二代Service Mesh 210 8.3 Service Mesh市场竞争 212 8.3.1 Service Mesh的萌芽期 212 8.3.2 急转直下的Linkerd 212 8.3.3 波澜不惊的Envoy 214 8.3.4 背负使命的Istio 214 8.3.5 背水一战的Buoyant 215 8.3.6 其他参与者 217 8.3.7 Service Mesh的国内发展情况 219 8.4 Istio 220 8.4.1 Istio概述 220 8.4.2 架构和核心组件 222 第9章 云原生数据架构 232 9.1 关系型数据库尚能饭否 232 9.1.1 优势 233 9.1.2 不足 234 9.2 未达预期的NoSQL 235 9.2.1 键值数据库 235 9.2.2 文档数据库 236 9.2.3 列族数据库 236 9.3 冉冉升起的NewSQL 237 9.3.1 新架构 238 9.3.2 透明化分片中间件 238 9.3.3 云数据库 239 9.4 云原生数据库中间件的核心功能 239 9.4.1 数据分片 239 9.4.2 分布式事务 258 9.4.3 数据库治理 265 第10章 分布式数据库中间件生态圈ShardingSphere 267 10.1 缘起 267 10.1.1 内部应用框架 268 10.1.2 开源历程 269 10.2 核心功能 271 10.2.1 数据分片 272 10.2.2 分布式事务 301 10.2.3 数据库治理 307 10.3 Sharding-JDBC 310 10.3.1 概述 310 10.3.2 使用说明 311 10.4 Sharding-Proxy 316 10.4.1 概述 316 10.4.2 使用说明 317 10.5 Database Mesh 317 10.5.1 概述 317 10.5.2 Service Mesh回顾 318 10.5.3 Database Mesh与Service Mesh的异同 319 10.5.4 Sharding-Sidecar 320 10.6 未来规划 321