Home

Awesome

Fenix's Bookstore后端:以Spring Cloud微服务实现

<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_springcloud.svg?branch=master" alt="Travis-CI"></a> <a href='https://coveralls.io/github/fenixsoft/microservice_arch_springcloud?branch=master'><img src='https://coveralls.io/repos/github/fenixsoft/microservice_arch_springcloud/badge.svg?branch=master' target="_blank" style="display:inline-block" alt='Coverage Status' /></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>

直至现在,由不同编程语言、不同技术框架所开发的微服务系统中,基于Spring Cloud的解决方案仍然是最为主流的选择。这个结果既是Java在服务端应用所积累的深厚根基的体现,也是Spring在Java生态系统中统治地位的体现。从Spring Boot到Spring Cloud的过渡,令现存数量极为庞大的、基于Spring和Spring Boot的单体系统得以平滑地迁移到微服务架构中,令这些系统的大部分代码都能够无需修改,或少量修改即可保留重用。微服务时代的早期,Spring Cloud就集成了Netflix OSS(以及Spring Cloud Netflix进入维护期后对应的替代组件)成体系的微服务套件,基本上也能算“半透明地”满足了在微服务环境中必然会面临的服务发现、远程调用、负载均衡、集中配置等非功能性的需求。

笔者个人是一直不太倾向于Spring Cloud Netflix这种以应用代码去解决基础设施功能问题的“解题思路”,以自顶向下的视角来看,这既是虚拟化的微服务基础设施完全成熟之前必然会出现的应用形态,也是微服务进化过程中必然会被替代的过渡形态。不过,笔者的看法如何无关重要,基于Spring Cloud Netflix的微服务在当前是主流,直至未来不算短的一段时间内仍会是主流,而且以应用的视角来看,能自底向上观察基础设施在微服务中面临的需求和挑战,能用我们最熟悉的Java代码来解释分析问题,也有利于对微服务的整体思想的深入理解,所以将它作为我们了解的第一种微服务架构的实现是十分适合的。

需求场景

小书店Fenix's Bookstore生意日益兴隆,客人、货物、营收都在持续增长,业务越发复杂,对信息系统并发与可用方面的要求也越来越高。由于业务属性和质量属性要求的提升,信息系统需要更多的硬件资源去支撑,这是合情合理的,但是,如果我们把需求场景列的更具体些,便会发现“合理”下面的许多无可奈何之处:

微服务的需求场景还可以列举出很多,这里就不多列举了,总之,系统发展到一定程度,我们总能找到充分的理由去拆分与重构它。在笔者设定的演示案例中,准备把<a href="https://icyfenix.cn/exploration/projects/monolithic_arch_springboot.html">单体的Fenix's Bookstore</a>拆分成为“用户”、“商品”、“交易”三个能够独立运行的子系统,它们将在一系列非功能性技术模块(认证、授权等)和基础设施(配置中心、服务发现等)的支撑下互相协作,以统一的API网关对外提供与原来单体系统功能一致的服务,应用视图如下图所示:

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

运行程序

以下几种途径,可以运行程序,浏览最终的效果:

技术组件

Fenix's Bookstore采用基于Spring Cloud微服务架构,微服务部分主要采用了Netflix OSS组件进行支持,它们包括:

尽管Netflix套件的使用人数很多,但考虑到Spring Cloud Netflix已进入维护模式,笔者均列出了上述组件的代替品。这些组件几乎都是声明式的,这确保了它们的替代成本相当低廉,只需要更换注解,修改配置,无需改动代码。你在阅读源码时也会发现,三个“platform”开头的服务,基本上没有任何实际代码的存在。

其他与微服务无关的技术组件(REST服务、安全、数据访问,等等),笔者已在<a href="https://icyfenix.cn/exploration/projects/monolithic_arch_springboot.html#技术组件">Fenix's Bookstore单体架构</a>中介绍过,在此不再重复。

协议