目录
前言
从本节课开始,我将自己手写一个基于SpringCloud框架的web服务集群,中间会引入常用的微服务中间件。如:配置中心、网关、链路追踪、断路器等等。
本节课只是简单地从原有单体项目,然后升级成SpringCloud架构。
阅读对象
- 需要有实际Springboot-web开发经验
阅读导航
系列上一篇文章:《【分布式微服务专题】微服务架构演进》
系列下一篇文章:《[【分布式微服务专题】【微服务专题】从单体到分布式(一、SpringCloud整合Nacos)(整理中…)]》
前置知识
笔记正文
一、单体服务介绍
为了升级演示效果,我写了一个简单的SpringBoot单体应用,架构如下:
然后实现的功能也很简单,直接list
获取库里面所有的数据。主要如下:
1)会员管理模块:提供一个/user/list
接口,获取数据库里面所有用户数据
2)钱包管理模块:提供一个/wallet/list
接口,获取数据库里面所有钱包数据
3)商品管理模块:提供一个/product/list
接口,获取数据库里面所有商品数据
整体代码比较简单,就不贴了。我们前面有说过单体服务的缺点和限制,这边重申一下:
1)修改任意代码,甚至是application.yml
都要重新打包编译部署,重启服务
2)单体机器存在性能瓶颈
3)很多时候,不同的服务QPS可能不一样,所以水平拓展的时候粒度不够精细
二、服务拆分
服务拆分之后,其实就可以理解为这就是所谓的【微服务】概念了。微服务简单说:一个 springboot 就是一个 微服务,并且这个 springboot 做的事情遵循单一职责。 比如说,在这里,服务经过拆分之后架构图成为了这样:(我新拓展了一个【订单服务】,虽然上面没贴,但是不妨碍理解)
甚至,经过水平拓展,也就是我们说的集群化之后,还可能是这样:
不过,随着服务的拆分,有一些衍生问题,却又无法避免。如下:
- 如何确定那些服务彼此之间的调用链路
- 同一组服务之间,甚至所有微服务之间,如何共享配置信息,配置如何自动刷新
- 集群有新的服务上线,或者下线,如何处理
- 微服务如何不暴露细节,以一个整体去提供服务
- 分布式事务
- 等等…(有一些我自己也不清楚,学习中)
三、分布式微服务升级前的思考
3.1 关于SpringBoot/SpringCloud的思考【有点门槛】
不知道你们是否跟我一样有同样的疑问,即:
- 什么是SpringBoot,如何新建一个SpringBoot项目
- 什么是SpringCloud,如何新建一个SpringCloud项目
- SpringCloudAlibaba和SpringCloud有什么关系
说来属实惭愧,我在此之前,真的没有很清晰的认知。只记得他们分别是Spring
脚手架、微服务
脚手架。但是我在做项目升级的时候发现,如果我的认知还是停留在这样片面的层次,会给我带来些不小的阻碍。
问题1:什么是SpringBoot,如何新建一个SpringBoot项目
不知道你们是否也一样,每次新建SpringBoot项目我都得重新百度一下如何新建,或者说,使用Idea的Spring Initializer
来新建,不然对如何从空白项目新建一个SpringBoot没啥概念。经过这两天的学习之后,我终于是有点理解了。
简而言之,创建一个SpringBoot项目大概有如下三种方式:
- 新建一个继承自
spring-boot-starter-parent
的项目。如下:(这里分享一个相关知识点的传送门:《理解spring-boot-starter-parent》,大家伙学习下)
- 新建一个项目,在
<dependencyManagement>
中添加spring-boot-dependencies
的依赖
- 新建一个空白项目,在
<dependency>
中添加SpringBoot
的依赖
通常,我们通过Spring Initializer
或者Ali在线云原生构建也好,生成出来的SpringBoot都是采用方案1、2。
不知道大家有没有用心看我上面的介绍,我这边最后再结合自己的理解,简单的总结一下:
- 我们通常新建一个SpringBoot项目的时候,之所以在pom中继承自
spring-boot-starter-parent
,主要是为了简化配置。这些简化配置包括:默认的JDK版本、默认的项目编码格式UTF-8、自动化的资源配置、插件配置。最重要的是,spring-boot-starter-parent
继承自spring-boot-dependencies
- 而在
spring-boot-dependencies
中,定义了一系列Spring开发中,常用的jar包依赖,根据我的发现,在里面主要是包含了国外知名厂商的jar包,比如org.apache
的东西 - 因为在
spring-boot-dependencies
里面预包含了很多jar包依赖,所以我们在实际使用中,很多jar包的引用不需要再显式地指定version
。如下:
问题2:什么是SpringCloud,如何新建一个SpringCloud项目
我感觉在想通了问题1之后,对于这个问题我就没多少疑惑了。盲猜SpringCloud就是提供了很多关于微服务开发常用的中间件jar包依赖。根据我的理解也确实是这样
问题3:SpringCloudAlibaba和SpringCloud有什么关系
下面是我在【文心一言】看到的答案:
但其实我不是很赞同这个说法,我觉得多少有点不准确。通过查看spring-cloud-dependencies
和spring-cloud-alibaba-dependencies
会发现,他们只是继承了同一个spring-cloud-dependencies-parent
项目而已,所以文心一言说Spring Cloud Alibaba是Spring Cloud的子项目,符合Spring Cloud标准
也没错。不过我个人认为:SpringCloud
是SpringCloud公司给出的一个通用分布式微服务技术合集。而Spring Cloud Alibaba
则是阿里给的一套,自己的解决方案,里面的微服务中间件都是阿里系的。说不定哪一天你就看到了Spring Cloud Tencent
、Spring Cloud ByteDance
、Spring Cloud HuaWei
我在后面将使用Spring Cloud Alibaba
,大家可以通过传送门看看介绍:传送门。根据官方介绍,我们想要使用Spring Cloud Alibaba
,只需要在pom中引入下面的依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
附上一张,应该是Alibaba给出的分布式微服务生态图:
四、SpringCloud升级整合
4.1 新建父子项目
使用IDEA新建一个父子项目,具体过程我就不贴了,如果你理解了【三、分布式微服务升级前的思考】的内容,最后发现也没那么难。当然,有时候需要一点Maven相关知识,我这边建议直接花半个小时看看【菜鸟教程Maven系列】,个人认为比较需要了解的是:Maven构建生命周期、Maven POM
新建出来之后就是一个父子项目咯,然后每个项目有自己的@SpringBootApplication
启动类。
但显然,这不是我们想要的结果,我们在【二、服务拆分】中提到的问题依然还没有解决。如:
- 服务注册与发现(微服务最重要的一个点)
- 分布式配置管理
- 服务限流降级
- 链路追踪
- 分布式事务
- 等等
所以,接下来才是真正的重头戏啊。后面我会逐步整合,下一篇则是整合Nacos配置中心到项目中。
学习总结
- 理解了SpringBoot跟SpringCloud项目的具体含义
- 对如何新建一个SpringBoot项目有个较为清晰的认知
感谢
感谢简书大佬【作者:】的文章《理解spring-boot-starter-parent》