00 开篇词 _ 如何构建一个可靠的分布式系统? 你好,我是周志明,一名纯粹的软件开发者。之所以说“纯粹”,是因为我想强调,研究技术、编写程序不仅是我养家糊口的技能,也是我最大的兴趣爱好。

在十几年的职业生涯里,我有过很多种不同的标签。比如说,企业管理者、实验室研究员、技术布道师、计算机作家,等等。它们都有一个共同点,就是强调要把自己的想法、理念分享出来,影响他人。

所以,你很可能是从《深入理解Java虚拟机》这一类技术书籍知道我的名字的。确实,我之前出版过7本计算机技术类的书籍,还写过两部开源文档。特别开心的是,这些原创技术书的口碑和销量都得到了大家的认可,其中有四本书在豆瓣上的评分还超过了9分。现在,分享与布道这件事儿也成了我在技术与代码之外的另一个兴趣,当然它也给我带来了很多机会和荣誉。

不过除了分享和布道,其实最贴合我的标签,还是程序员。对我来说,这也是我最看重的身份。十几年间,我从一个面向业务逻辑与局部功能编码的程序员,逐步成长为了一名对系统全局负责的技术架构师。现在,我主要是在做一些大型企业级软件的研发工作,也参与和主导过多个国家级的软件项目。

那么,作为一名架构师,在软件研发的过程中,最难的事儿,其实并不是如何解决具体某个缺陷、如何提升某段代码的性能,而是如何才能让一系列来自不同开发者、不同厂商、不同版本、不同语言、质量也良莠不齐的软件模块,在不同的物理硬件和拓扑结构随时变动的网络环境中,依然能保证可靠的运行质量。

显然,这并不是一个研发过程的管理问题。一套“靠谱”的软件系统,尤其是大型的、分布式的软件系统,很难指望只依靠团队成员的个人能力水平,或者依靠质量管理流程来达成。

在我看来,这是一个系统性的、架构层面的问题,最终还是要在技术和架构中去解决。而这也正是我要在这门课中跟你一起探讨的主题:如何构建一个可靠的分布式系统

我是怎么规划课程的?

那么,为了能够讨论清楚这个话题,我把课程划分成了以下5个模块。

演进中的架构:我会借着讨论历史之名,从全局性的视角,帮你梳理微服务发展历程中出现的大量技术名词、概念,让你了解这些技术的时代背景和探索过程,帮你在后续的课程讲解中,更容易去深入理解软件架构设计的本质。

架构师的视角:我不会局限在某种架构的通用技巧,而是会带你系统性地了解在做架构设计的时候,架构师都应该思考哪些问题、可以选择哪些主流的解决方案和行业标准做法,以及这些主流方案都有什么优缺点、会给架构设计带来什么影响,等等。这样一来,我们才可以把“架构设计”这样比较抽象的工作具体化、具象化。

分布式的基石:我会聚焦在分布式架构,和你探讨分布式带来的问题与应对策略。我会带你剖析分布式架构中出现的一系列问题,比如服务的注册发现、跟踪治理、负载均衡、故障隔离、认证授权、伸缩扩展、传输通讯、事务处理等,有哪些解决思路、方法和常见工具。

不可变基础设施:我会按照云原生时代“基础设施即代码”的新思路,带你深入理解基础设施不变性的目的、原理与实现途径,和你一起去体会用代码和用基础设施,来解决分布式问题的差异,让你能够理解不可变基础设施的内涵,便于在实际工作中做运维、程序升级和部署等工作。

探索与实践:我会带你一起开发不同架构的Fenix’s Bookstore(“导读”这一讲会具体介绍这个项目),并看看在不同环境下都应该怎么部署。这个模块的定位是“实战”,为了保证学习效果,我特意没有安排音频,所以建议你一定要自己动手去实操。

因为我相信,如果你是一名驾驶初学者,最合理的学习路径应该是先把汽车发动,然后慢慢行驶起来,而不是马上从“引擎动力原理”“变速箱构造”入手,去设法深刻地了解一台汽车。学习计算机技术也是同样的道理。所以在“探索与实践”模块,我会先带你从运行程序开始,看看效果,然后再搭建好开发、调试环境。

说到这里,我一定要和你说说怎么学习这门课,才能保证最好的效果。

你要怎么学习这门课?

如果你已经是一名系统架构师或者高级开发工程师了,那这门课程就非常适合你。通过跟随学习,你会知道,在软件设计、架构工作中,都需要考虑哪些因素、需要解决哪些问题、有哪些行业标准的解决方案。而如果你是个刚入行不久的程序员,那你可以把这门课程作为一个概念名词的速查手册。

很多内容对你来说可能是全新的,甚至会颠覆你过去的一些认知。而这门课程的好处就是,在不同的技术水平阶段,你都会找到不同的使用方法。具体怎么做呢?

  • 第一步,先完整地跟着课程的节奏学习一遍。你可以先去串一下各种技术名词和架构理论概念,拓展一下视野,去看看大型的架构项目是怎么搭建的,涨涨见识,不一定要求自己深入地理解和记住每一讲的内容。
  • 第二步,根据自己当前的情况,按图索骥寻找对应的章节深入学习并实践。
  • 第三步,当你有了一定的实践经验之后,再来重新学习对应的章节,看看自己曾经的理解是否有遗漏或者有偏差,或者看看我的内容是否还有不完善的地方,真正将知识变成自己的认知。

写在最后

最后,我想说的是,我在极客时间上开设这门课程,既是为了分享与技术布道,也是为了借这个机会,系统性地整理自己的知识,查缺补漏,将它们都融入既有的知识框架之中。

我一直认为,技术人员的成长是有“捷径”的,做技术不仅要去看、去读、去想、去用,更要去写、去说

把自己“认为掌握了的”知识给叙述出来,能够写得条理清晰,讲得理直气壮;能够让别人听得明白,释去心中疑惑;能够把自己的观点交给别人审视,乃至质疑。在这个过程之中,就会挖掘出很多潜藏在“已知”背后的“未知”。

那么既然如此,我也非常希望,你能够在学习课程的过程当中,也记录下自己的所学所得、所思所想,然后分享给我和其他同学。在分享的过程中,相信我们一定都会有所收获。

所以在这里,我也想发起一个活动:在课程更新的过程中,分享出你的学习心得、实践感悟等等,或者也可以分享出你自己在架构设计中的实践经历、遇到的坑以及避坑的经验。在期中和期末时,课程编辑会甄选出优秀的留言分享内容,专门做一个展示模块,最后还会送出这门课程的纸质版图书。

另外,我还会从中挑选一些比较有代表性的留言做针对性点评,期待在留言区看到你的身影呀!欢迎你的踊跃参与,这也是给自己增添一份学习动力~

OK,最后的最后,我还想正式认识一下你。你可以在留言区里做个自我介绍,和我聊聊,你目前对于软件架构设计的最大难点在哪?或者,你也可以聊聊你对软件架构都有哪些独特的思考和体验,欢迎在留言区和我交流讨论。

好了,让我们正式开始学习之旅吧!

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e5%91%a8%e5%bf%97%e6%98%8e%e7%9a%84%e6%9e%b6%e6%9e%84%e8%af%be/00%20%e5%bc%80%e7%af%87%e8%af%8d%20_%20%e5%a6%82%e4%bd%95%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%af%e9%9d%a0%e7%9a%84%e5%88%86%e5%b8%83%e5%bc%8f%e7%b3%bb%e7%bb%9f%ef%bc%9f.md