【分布式微服务专题】从单体到分布式(一、SpringCloud项目初步升级)

目录

  • 前言
  • 阅读对象
  • 阅读导航
  • 前置知识
  • 笔记正文
    • 一、单体服务介绍
    • 二、服务拆分
    • 三、分布式微服务升级前的思考
      • 3.1 关于SpringBoot/SpringCloud的思考【有点门槛】
    • 四、SpringCloud升级整合
      • 4.1 新建父子项目
  • 学习总结
  • 感谢

前言

从本节课开始,我将自己手写一个基于SpringCloud框架的web服务集群,中间会引入常用的微服务中间件。如:配置中心、网关、链路追踪、断路器等等。
本节课只是简单地从原有单体项目,然后升级成SpringCloud架构。

阅读对象

  1. 需要有实际Springboot-web开发经验

阅读导航

系列上一篇文章:《【分布式微服务专题】微服务架构演进》
系列下一篇文章:《[【分布式微服务专题】【微服务专题】从单体到分布式(一、SpringCloud整合Nacos)(整理中…)]》

前置知识

笔记正文

一、单体服务介绍

为了升级演示效果,我写了一个简单的SpringBoot单体应用,架构如下:
在这里插入图片描述

然后实现的功能也很简单,直接list获取库里面所有的数据。主要如下:
1)会员管理模块:提供一个/user/list接口,获取数据库里面所有用户数据
2)钱包管理模块:提供一个/wallet/list接口,获取数据库里面所有钱包数据
3)商品管理模块:提供一个/product/list接口,获取数据库里面所有商品数据
在这里插入图片描述
在这里插入图片描述

整体代码比较简单,就不贴了。我们前面有说过单体服务的缺点和限制,这边重申一下:
1)修改任意代码,甚至是application.yml都要重新打包编译部署,重启服务
2)单体机器存在性能瓶颈
3)很多时候,不同的服务QPS可能不一样,所以水平拓展的时候粒度不够精细

第三点对没有经验的小白可能理解上有点困难。简单说就是:在电商系统里面,正常来说访问商品模块的人,会比访问会员模块的人多。然后服务的性能瓶颈可能往往就是QPS最高的那个模块引起的,此时需要水平拓展服务,但由于是单体,所以每次拓展,都是对整个系统的拓展。但最理想的效果应该是,只对QPS最高的商品模块拓展

二、服务拆分

服务拆分之后,其实就可以理解为这就是所谓的【微服务】概念了。微服务简单说:一个 springboot 就是一个 微服务,并且这个 springboot 做的事情遵循单一职责。 比如说,在这里,服务经过拆分之后架构图成为了这样:(我新拓展了一个【订单服务】,虽然上面没贴,但是不妨碍理解)
在这里插入图片描述

甚至,经过水平拓展,也就是我们说的集群化之后,还可能是这样:
在这里插入图片描述
不过,随着服务的拆分,有一些衍生问题,却又无法避免。如下:

  1. 如何确定那些服务彼此之间的调用链路

比如上述架构图,可能存在会员服务调用订单服务的情况,那订单服务有两个服务,我怎么知道具体调用的是9081还是9082呢。甚至我的会员服务可能也有多台机器,那势必存在笛卡尔积的情况,他们之间的链路可能会更为复杂

  1. 同一组服务之间,甚至所有微服务之间,如何共享配置信息,配置如何自动刷新

比如说我多个微服务之间使用的是同一个数据库,redis,mq,这些配置信息理论上是可以共享的,而不必在每一个应用的application.yml文件上都声明

  1. 集群有新的服务上线,或者下线,如何处理

服务注册与发现

  1. 微服务如何不暴露细节,以一个整体去提供服务

网关

  1. 分布式事务
  2. 等等…(有一些我自己也不清楚,学习中)

三、分布式微服务升级前的思考

3.1 关于SpringBoot/SpringCloud的思考【有点门槛】

不知道你们是否跟我一样有同样的疑问,即:

  1. 什么是SpringBoot,如何新建一个SpringBoot项目
  2. 什么是SpringCloud,如何新建一个SpringCloud项目
  3. SpringCloudAlibaba和SpringCloud有什么关系

说来属实惭愧,我在此之前,真的没有很清晰的认知。只记得他们分别是Spring脚手架、微服务脚手架。但是我在做项目升级的时候发现,如果我的认知还是停留在这样片面的层次,会给我带来些不小的阻碍。

问题1:什么是SpringBoot,如何新建一个SpringBoot项目
不知道你们是否也一样,每次新建SpringBoot项目我都得重新百度一下如何新建,或者说,使用Idea的SpringBoot Initializer来新建,不然对如何从空白项目新建一个SpringBoot没啥概念。经过这两天的学习之后,我终于是有点理解了。
简而言之,创建一个SpringBoot项目大概有如下三种方式:

  1. 新建一个继承自spring-boot-starter-parent的项目。如下:(这里分享一个相关知识点的传送门:《理解spring-boot-starter-parent》,大家伙学习下)
    在这里插入图片描述

spring-boot-starter-parent主要是为我们使用、构建SpringBoot项目,提供了一些默认的配置。包括:

  1. 定义了Java编译版本为1.8。
  2. 使用UTF-8格式编码。
  3. 继承自spring-boot-dependencies,这个里边定义了Java+Spring开发常用依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号
  4. 预定义了一些Maven执行打包操作的配置
  5. 自动化的资源过滤。
  6. 自动化的插件配置。
  7. 针对application.properties和application.yml的资源过滤,包括通过profile定义的不同环境的配置文件,例如applicationdev.properties和application-dev.yml。

    使用spring-boot-starter-parent作为父项目,子项目可以继承父项目的依赖项、插件配置和默认设置,从而简化子项目的配置和管理。子项目可以通过在其pom.xml文件中引用父项目来继承这些配置,例如通过元素指定父项目的坐标。将相关的模块组织成多模块项目,可以提高代码的可维护性、复用性和团队协作效率。同时,使用父项目和子项目的结构,还可以方便地进行整体构建、测试和部署,保证模块之间的一致性和协调性
  1. 新建一个项目,在<dependencyManagement>中添加spring-boot-dependencies的依赖
    在这里插入图片描述

Spring Boot中的spring-boot-dependencies是一个特殊的依赖项,它提供了一组预定义的版本控制,用于管理Spring Boot及其相关库的版本。
在Spring Boot项目中,spring-boot-dependencies依赖是一个非常重要的依赖项,它主要作用是统一管理Spring Boot及其相关库的版本,避免版本冲突,简化依赖项管理。通过引入spring-boot-dependencies,你可以确保所使用的Spring Boot及其相关库的版本始终兼容,并能够轻松地升级到新的版本。
具体来说,spring-boot-dependencies包含了一个BOM(Bill of Materials)文件,这是一个包含了一系列库的清单,指定了这些库的版本号。当你在Maven或Gradle构建工具中添加spring-boot-dependencies依赖时,它会自动引入这个BOM文件。你可以直接声明其他Spring Boot相关的依赖项,并且这些依赖项会自动采用BOM中指定的版本。例如,你可以声明spring-boot-starter-web依赖,并且该依赖会自动使用BOM中定义的Spring Boot版本。
使用spring-boot-dependencies可以带来很多好处。首先,它可以统一管理所有的Spring Boot相关库的版本,避免不同库之间的版本冲突。其次,它可以简化依赖项的管理,不需要在每个项目中手动指定每个库的版本号。最后,它可以确保所使用的库的版本兼容性和一致性,避免因版本不同导致的问题。
总之,spring-boot-dependencies是Spring Boot框架提供的一个版本控制机制,它可以简化和统一项目中所使用的库的版本管理,确保版本的兼容性和一致性。

  1. 新建一个空白项目,在<dependency>中添加SpringBoot的依赖

其实就是没有使用上面1/2说的这两个做法咯

通常,我们通过Spring Initializer或者Ali在线云原生构建也好,生成出来的SpringBoot都是采用方案1、2。

不知道大家有没有用心看我上面的介绍,我这边最后再结合自己的理解,简单的总结一下:

  1. 我们通常新建一个SpringBoot项目的时候,之所以在pom中继承自spring-boot-starter-parent主要是为了简化配置。这些简化配置包括:默认的JDK版本、默认的项目编码格式UTF-8、自动化的资源配置、插件配置。最重要的是,spring-boot-starter-parent继承自spring-boot-dependencies
  2. 而在spring-boot-dependencies中,定义了一系列Spring开发中,常用的jar包依赖,根据我的发现,在里面主要是包含了国外知名厂商的jar包,比如org.apache的东西
  3. 因为在spring-boot-dependencies里面预包含了很多jar包依赖,所以我们在实际使用中,很多jar包的引用不需要再显式地指定version。如下:
    在这里插入图片描述

问题2:什么是SpringCloud,如何新建一个SpringCloud项目
我感觉在想通了问题1之后,对于这个问题我就没多少疑惑了。盲猜SpringCloud就是提供了很多关于微服务开发常用的中间件jar包依赖。根据我的理解也确实是这样

问题3:SpringCloudAlibaba和SpringCloud有什么关系
下面是我在【文心一言】看到的答案:

Spring Cloud Alibaba是Spring Cloud的子项目,符合Spring Cloud标准。它是一套完整的分布式解决方案,旨在推广阿里的产品。如果使用了Spring Cloud Alibaba,最好使用alibaba整个体系产品。

因此,Spring Cloud Alibaba和Spring Cloud的关系是,前者是后者的一部分,符合后者的标准。

但其实我不是很赞同这个说法,我觉得多少有点不准确。通过查看spring-cloud-dependenciesspring-cloud-alibaba-dependencies会发现,他们只是继承了同一个spring-cloud-dependencies-parent项目而已,所以文心一言说Spring Cloud Alibaba是Spring Cloud的子项目,符合Spring Cloud标准也没错。不过我个人认为:SpringCloud是SpringCloud公司给出的一个通用分布式微服务技术合集。而Spring Cloud Alibaba则是阿里给的一套,自己的解决方案,里面的微服务中间件都是阿里系的。说不定哪一天你就看到了Spring Cloud TencentSpring Cloud ByteDanceSpring 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>

四、SpringCloud升级整合

4.1 新建父子项目

使用IDEA新建一个父子项目,具体过程我就不贴了,如果你理解了【三、分布式微服务升级前的思考】的内容,最后发现也没那么难。当然,有时候需要一点Maven相关知识,我这边建议直接花半个小时看看【菜鸟教程Maven系列】,个人认为比较需要了解的是:Maven构建生命周期、Maven POM
在这里插入图片描述
在这里插入图片描述
新建出来之后就是一个父子项目咯,然后每个项目有自己的@SpringBootApplication启动类。
但显然,这不是我们想要的结果,我们在【二、服务拆分】中提到的问题依然还没有解决。如:

  1. 服务注册与发现(微服务最重要的一个点)
  2. 分布式配置管理
  3. 服务限流降级
  4. 链路追踪
  5. 分布式事务
  6. 等等

所以,接下来才是真正的重头戏啊。后面我会逐步整合,下一篇则是整合Nacos配置中心到项目中。

学习总结

  1. 理解了SpringBoot跟SpringCloud项目的具体含义
  2. 对如何新建一个SpringBoot项目有个较为清晰的认知

感谢

感谢简书大佬【作者:】的文章《理解spring-boot-starter-parent》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/224217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于非洲秃鹫算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于非洲秃鹫算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于非洲秃鹫算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.非洲秃鹫算法4.实验参数设定5.算法结果6.参考…

docker安装及配置mysql

docker 安装mysql 下载镜像文件 下载mysql5.7版本 sudo docker pull mysql:5.7检查是否下载成功 sudo docker images2.创建实例并启动 切换到root下避免每次使用sudo 密码&#xff1a;vagrant docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/my…

PACS源码,医学影像传输系统源码,全院级应用,支持放射、超声、内窥镜、病理等影像科室,且具备多种图像处理及三维重建功能

​三维智能PACS系统源码&#xff0c;医学影像采集传输系统源码 PACS系统以大型关系型数据库作为数据和图像的存储管理工具&#xff0c;以医疗影像的采集、传输、存储和诊断为核心&#xff0c;集影像采集传输与存储管理、影像诊断查询与报告管理、综合信息管理等综合应用于一体的…

AI助力智慧农业,基于YOLOv4开发构建不同参数量级农田场景下庄稼作物、杂草智能检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

【开源】基于JAVA的APK检测管理系统

项目编号&#xff1a; S 038 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S038&#xff0c;文末获取源码。} 项目编号&#xff1a;S038&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软…

翻译: 大语言模型LLMs能做什么和不能做什么 保存笔记What LLMs can and cannot do

生成式 AI 是一项惊人的技术&#xff0c;但它并非万能。在这个视频中&#xff0c;我们将仔细看看大型语言模型&#xff08;LLM&#xff09;能做什么&#xff0c;不能做什么。我们将从我发现的一个有用的心理模型开始&#xff0c;了解它能做什么&#xff0c;然后一起看看 LLM 的…

ThreadX开源助力Microsoft扩大应用范围:对比亚马逊AWS的策略差异

全球超过120亿台设备正在运行ThreadX&#xff0c;这是一款专为资源受限环境设计的实时操作系统。该操作系统在微控制器和小型处理器上表现出色&#xff0c;以极高的可靠性和精确的时间控制处理任务而闻名。 ThreadX曾是英特尔芯片管理引擎的引擎&#xff0c;并且是控制Raspber…

unity 2d 入门 飞翔小鸟 飞翔脚本(五)

新建c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟&#xff08;刚体&#xff09;private Rigidbody2D bird;//速度public float speed;// Start is called before the first frame up…

挑选数据可视化工具:图表类型、交互功能与数据安全

作为一名数据分析师&#xff0c;我经常需要使用各种数据可视化工具来将数据以直观、清晰的方式呈现出来&#xff0c;以便更好地理解和分析。在市面上的众多可视化工具中&#xff0c;我根据实际需求和项目特点进行选择。本文将从以下几个角度对市面上的数据可视化工具进行对比&a…

Ros智行mini,opencv,Gmapping建图,自主导航auto_slam,人脸识别,语音控制

功能 一、Gmapping建图 二、自主导航 起始点 、终点 三、人脸识别 四、语音控制 完成任务: 机器人先建图 建完图后给出目标点&#xff0c;机器人就可以完成调用自主导航走到目标点&#xff0c;期间会调用激光雷达扫描局部环境来进行自主避障&#xff0c;到达终点后进行语音…

指针(进阶)

指针进阶&#xff1a; 通过指针基础我们已经了解了指针&#xff0c;这篇文章我们会举大量的例子&#xff0c;使我们对指针透彻理解&#xff0c;我们下来看一段代码&#xff1a; int main() {char a[] "ab";char* pc a;printf("%c\n", *pc);printf("…

线上项目修改最后一招 修改jar中的文件并重新打包成jar

解压jar包 在要操作的jar文件上边cmd打开命令提示符窗口&#xff08;windows系统&#xff09;&#xff0c; 在cmd命令下执行 jar -xvf xxx.jar 解压jar包&#xff08;其中xxx.jar换成你的jar包名&#xff09; jar -xvf admin-1.0.0.jar 替换或者更改操作 如果要替换jar压缩…

qt 5.15.2 主窗体菜单工具栏树控件功能

qt 5.15.2 主窗体菜单工具栏树控件功能 显示主窗体效果&#xff1a; mainwindow.h文件内容&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QFileDialog> #include <QString> #include <QMessageBox>#inc…

浅谈web性能测试

什么是性能测试&#xff1f; web性能应该注意些什么&#xff1f; 性能测试&#xff0c;简而言之就是模仿用户对一个系统进行大批量的操作&#xff0c;得出系统各项性能指标和性能瓶颈&#xff0c;并从中发现存在的问题&#xff0c;通过多方协助调优的过程。而web端的性能测试…

ChatGPT能帮助--掌握各种AI绘图工具,随意生成各类型性图像

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

〖大前端 - 基础入门三大核心之JS篇㊼〗- BOM基础之window对象

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

Caché/M 数据库系统 InterSystems IRIS 的 Windows 安装

针对 InterSystems IRIS 数据库的一些基本概念。 InterSystems IRIS 是什么 InterSystems IRIS 是基于 Cach/M 语言开发的一个数据库&#xff0c;这个数据库被大量使用在医疗系统中&#xff0c;也是北美地区医疗系统病历和文件管理中默认使用的事实标准。 Cach/M 是什么 Ca…

亚马逊云科技Serverless视频内容摘要提取方案

概述 随着GenAI的普及&#xff0c;视频内容摘要生成成为一个备受关注的领域。通过将视频内容转化为文本&#xff0c;可以探索到更广泛的应用场景&#xff0c;其中包括&#xff1a; 视频搜索与索引&#xff1a;将视频内容转化为文本形式&#xff0c;可以方便地进行搜索和索引操作…

Zabbix自定义飞书webhook告警媒介2

说明:适用于7.0及以上版本,低版本可能会有问题。 参数如下: 名称 值EVENT.DURATION{EVENT.DURATION}EVENTDATE

AWS re:Invent 2023-亚马逊云科技全球年度技术盛会

一:会议地址 2023 re:Invent 全球大会主题演讲 - 亚马逊云科技从基础设施和人工智能/机器学习创新,到云计算领域的最新趋势与突破,倾听亚马逊云科技领导者谈论他们最关心的方面。https://webinar.amazoncloud.cn/reInvent2023/keynotes.html北京时间2023年12月1日00:30-02:…