Home

Awesome

Fenix's BookStore后端:以Istio服务网格实现

<GitHubWrapper> <p align="center"> <a href="https://icyfenix.cn" target="_blank"> <img width="180" src="https://raw.githubusercontent.com/fenixsoft/awesome-fenix/master/.vuepress/public/images/logo-color.png" alt="logo"> </a> </p> <p align="center"> <a href="https://icyfenix.cn" style="display:inline-block"><img src="https://raw.githubusercontent.com/fenixsoft/awesome-fenix/master/.vuepress/public/images/Release-v1.svg"></a> <a href="https://travis-ci.com/fenixsoft/servicemesh_arch_istio" target="_blank" style="display:inline-block"><img src="https://travis-ci.com/fenixsoft/monolithic_arch_istio.svg?branch=master" alt="Travis-CI"></a> <a href="https://www.apache.org/licenses/LICENSE-2.0" target="_blank" style="display:inline-block"><img src="https://raw.githubusercontent.com/fenixsoft/awesome-fenix/master/.vuepress/public/images/License-Apache.svg" alt="License"></a> <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" style="display:inline-block"><img src="https://raw.githubusercontent.com/fenixsoft/awesome-fenix/master/.vuepress/public/images/DocLicense-CC-red.svg" alt="Document License"></a> <a href="https://icyfenix.cn/introduction/about-me.html" target="_blank" style="display:inline-block"><img src="https://raw.githubusercontent.com/fenixsoft/awesome-fenix/master/.vuepress/public/images/Author-IcyFenix-blue.svg" alt="About Author"></a> </p> </GitHubWrapper>

如果你此时并不曾了解过什么是“The Fenix Project”,建议先阅读<a href="https://icyfenix.cn/introduction/about-the-fenix-project.html">这部分内容</a>

当软件架构演进至<a href="https://icyfenix.cn/exploration/projects/microservice_arch_kubernetes.html">基于Kubernetes实现的微服务</a>时,已经能够相当充分地享受到虚拟化技术发展的红利,如应用能够灵活地扩容缩容、不再畏惧单个服务的崩溃消亡、立足应用系统更高层来管理和编排各服务之间的版本、交互。可是,单纯的Kubernetes仍然不能解决我们面临的所有分布式技术问题,在此前对基于Kubernetes的架构中“<a href="https://icyfenix.cn/exploration/projects/microservice_arch_kubernetes.html#技术组件">技术组件</a>”的介绍里,笔者已经说明光靠着Kubernetes本身的虚拟化基础设施,难以做到精细化的服务治理,譬如熔断、流控、观测,等等;而即使是那些它可以提供支持的分布式能力,譬如通过DNS与服务来实现的服务发现与负载均衡,也只能说是初步解决了的分布式中如何调用服务的问题而已,只靠DNS难以满足根据不同的配置规则、协议层次、均衡算法等去调节负载均衡的执行过程这类高级的配置需求。Kubernetes提供的虚拟化基础设施是我们尝试从应用中剥离分布式技术代码踏出的第一步,但只从微服务的灵活与可控这一点而言,基于Kubernetes实现的版本其实比上一个Spring Cloud版本里用代码实现的效果(功能强大、灵活程度)是有所倒退的,这也是当时我们未放弃Hystrix、Spring Security OAuth 2等组件的原因。

Kubernetes给予了我们强大的虚拟化基础设施,这是一把好用的锤子,但我们却不必把所有问题都看作钉子,不必只局限于纯粹基础设施的解决方案。现在,基于Kubernetes之上构筑的服务网格(Service Mesh)是目前最先进的架构风格,即通过中间人流量劫持的方式,以介乎于应用和基础设施之间的边车代理(Sidecar)来做到既让用户代码可以专注业务需求,不必关注分布式的技术,又能实现几乎不亚于此前Spring Cloud时代的那种通过代码来解决分布式问题的可配置、安全和可观测性。这一个目标,现在已成为了最热门的服务网格框架Istio的Slogan:Connect, Secure, Control, And Observe Services。

需求场景

得益于Kubernetes的强力支持,小书店Fenix's Bookstore已经能够依赖虚拟化基础设施进行扩容缩容,将用户请求分散到数量动态变化的Pod中处理,可以应对相当规模的用户量了。不过,随着Kubernetes集群中的Pod数量规模越来越庞大,到一定程度之后,运维的同学无奈地表示已经不可能够依靠人力来跟进微服务中出现的各种问题了:一个请求在哪个服务上调用失败啦?是A有调用B吗?还是C调用D时出错了?为什么这个请求、页面忽然卡住了?怎么调度到这个Node上的服务比其他Node慢那么多?这个Pod有Bug,消耗了大量的TCP链接数……

而另外一方面,随着Fenix's Bookstore程序规模与用户规模的壮大,开发团队人员数量也变得越来越多。尽管根据不同微服务进行拆分,可以将每个服务的团队成员都控制于“2 Pizza Teams”的范围以内,但一个很现实的问题是高端技术人员的数量总是有限的,人多了就不可能保证每个人都是精英,如何让普通的、初级的程序员依然能够做出靠谱的代码,成为这一阶段技术管理者的要重点思考的难题。这时候,团队内部出现了一种声音:微服务太复杂了,已经学不过来了,让我们回归单体吧……

在上述故事背景下,Fenix's Bookstore迎来了它的下一次技术架构的演进,这次的进化的目标主要有以下两点:

从升级目标可以明确地得到一种导向,我们必须控制住服务数量膨胀后传递到运维团队的压力,让“每运维人员能支持服务的数量”这个比例指标有指数级地提高才能确保微服务下运维团队的健康运作。对于开发团队,我们可以只要求一小部分核心的成员对微服务、Kubernetes、Istio等技术有深刻的理解即可,其余大部分开发人员,仍然可以基于最传统、普通的Spirng Boot技术栈来开发功能。升级改造之后的应用架构如下图所示:

<GitHubWrapper> <p align="center"> <img src="https://raw.githubusercontent.com/fenixsoft/awesome-fenix/master/.vuepress/public/images/istio-ms.png" > </p> </GitHubWrapper>

运行程序

在已经<a href="https://icyfenix.cn/appendix/deployment-env-setup/setup-kubernetes/">部署Kubernetes</a>与Istio的前提下,通过以下几种途径,可以运行程序,浏览最终的效果:

技术组件

Fenix's Bookstore采用基于Istio的服务网格架构,其中主要的技术组件包括:

协议