Home

Awesome

Fenix's BookStore后端:以Kubernetes微服务实现

<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/microservice_arch_springcloud" target="_blank" style="display:inline-block"><img src="https://travis-ci.com/fenixsoft/microservice_arch_kubernetes.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>

2017年,笔者曾在文章中描述其为“<a href="https://icyfenix.cn/architecture/architect-history/post-microservices.html">后微服务时代</a>”的开端,这年是容器生态发展历史中具有里程碑意义的一年。在这一年,长期作为Docker竞争对手的RKT容器一派的领导者CoreOS宣布放弃自己的容器管理系统Fleet,未来将会把所有容器管理的功能移至Kubernetes之上去实现。在这一年,容器管理领域的独角兽Rancher Labs宣布放弃其内置了数年的容器管理系统Cattle,提出了“All-in-Kubernetes”战略,从2.0版本开始把1.x版本能够支持多种容器管理工具的Rancher,“反向升级”为只支持Kubernetes一种容器管理系统。在这一年,Kubernetes的主要竞争者Apache Mesos在9月正式宣布了“Kubernetes on Mesos”集成计划,由竞争关系转为对Kubernetes提供支持,使其能够与Mesos的其他一级框架(如HDFSSparkChronos,等等)进行集群资源动态共享、分配与隔离。在这一年,Kubernetes的最大竞争者Docker Swarm的母公司Docker,终于在10月被迫宣布Docker要同时支持Swarm与Kubernetes两套容器管理系统,事实上承认了Kubernetes的统治地位。这场已经持续了三、四年时间,以Docker Swarm、Apache Mesos与Kubernetes为主要竞争者的“容器战争”终于有了明确的结果,Kubernetes登基加冕是容器发展中一个时代的终章,也将是软件架构发展下一个纪元的开端。

需求场景

当引入了<a href="https://icyfenix.cn/exploration/projects/microservice_arch_springcloud.html">基于Spring Cloud的微服务架构</a>后,小书店Fenix's Bookstore初步解决了扩容缩容、独立部署、运维和管理等问题,满足了产品经理不断提出的日益复杂的业务需求。可是,对于团队的开发人员、设计人员、架构人员来说,并没有感觉到工作变得轻松,微服务中的各种新技术名词,如配置中心、服务发现、网关、熔断、负载均衡等等,就够一名新手学习好长一段时间;从产品角度来看,各种Spring Cloud的技术套件,如Config、Eureka、Zuul、Hystrix、Ribbon、Feign等,也占据了产品的大部分编译后的代码容量。之所以微服务架构里,我们选择在应用层面而不是基础设施层面去解决这些分布式问题,完全是因为由硬件构成的基础设施,跟不上由软件构成的应用服务的灵活性的无奈之举。当Kubernetes统一了容器编排管理系统之后,这些纯技术性的底层问题,便开始有了被广泛认可和采纳的基础设施层面的解决方案。为此,Fenix's Bookstore也迎来了它在“后微服务时代”中的下一次架构演进,这次升级的目标主要有如下两点:

从升级结果来看,如果仅以Java代码的角度来衡量,本工程与此前<a href="https://icyfenix.cn/exploration/projects/microservice_arch_springcloud.html">基于Spring Cloud的实现</a>没有丝毫差异,两者的每一行Java代码都是一模一样的;真正的区别在Kubernetes的实现版本中直接删除了配置中心、服务注册中心的工程,在其他工程的pom.xml中也删除了如Eureka、Ribbon、Config等组件的依赖。取而代之的是新增了若干以YAML配置文件为载体的Skaffold和Kubernetes的资源描述,这些资源描述文件,将会动态构建出DNS服务器、服务负载均衡器等一系列虚拟化的基础设施,去代替原有的应用层面的技术组件。升级改造之后的应用架构如下图所示:

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

运行程序

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

技术组件

Fenix's Bookstore采用基于Kubernetes的微服务架构,并采用Spring Cloud Kubernetes做了适配,其中主要的技术组件包括:

协议