单体的 TienChin 和微服务的 TienChin 有何异同?

news2024/11/20 0:43:54

有不少小伙伴希望松哥能整一个微服务的实战项目,微服务这块技术点其实松哥是讲过很多了,图文版的教程视频版的教程都有,不过确实缺乏一个项目,所以我在想等 TienChin 项目搞完之后,和小伙伴们也来一起搞一个微服务的项目。

今天我想从架构的角度来和小伙伴们聊一聊微服务。不聊具体的技术点,就单纯来看看一个微服务项目该怎么设计。

1. 单体版 TienChin

松哥目前在录的 TienChin 项目就是一个前后端分离的单体项目,采用了 Spring Boot + Vue3。那么单体版的 TienChin 具有什么样的特征呢?我从优点和缺点两个方面来和大家分析。

先来看一张简单的架构图:

可以看到,虽然是单体项目,但是为了开发方便,项目也细分为许多不同的模块,项目中的适配器可以分为两大类:

  1. 入站适配器:就是外部系统来调用我们的系统,REST API 和 Vue 网页都算是入站适配器,外部系统通过这两个接口来调用我们的系统。
  2. 出站适配器:这个主要是我们系统内部调用外部系统的方式,例如我们的项目中需要用到 MySQL、Redis等,那么就通过出站适配器来实现。

1.1 优点

  1. 开发简单:随便一个 IDE,撸起袖子就可以开写了。
  2. 测试简单:项目启动之后,直接利用 POSTMAN 等工具就可以测试项目接口了。
  3. 部署简单:项目开发完成之后,打包成一个 jar 或者一个 war,直接部署就行了。
  4. 横向扩展简单:当项目并发能力不足的时候,可以方便的结合 Nginx 等负载均衡工具进行横向扩展。

可以看到,单体项目的优势整体上来说还是非常明显的。

1.2 缺点

然而缺点也是非常明显的。

  1. 项目越来越复杂

首先就是项目不可能一直这么简单,我们这个项目中还是细分了很多不同的模块。随着时间的推移,这些模块会变得越来愈复杂。修改每一个 BUG 都要小心翼翼,牵一发而动全身。并且随着项目组中人员的离职/入职,新接手的人会让这个项目更加复杂,每一次 BUG 的修复或者新功能的添加,都会让这个项目变得更加“不可捉摸”。

  1. 开发进度越来越不可控

由于系统越来越复杂,我们不得不增派人手参与到这个项目的开发中,以期推进项目进度。这么多人的协调又是一个问题。并且,随着项目越来越大,每一次编译运行都得数分钟、十几分钟甚至更久,这也会严重拖慢我们的项目进度。

  1. 发版周期过长

单体项目发版很多小伙伴可能都刻骨铭心,发版当天如临大敌,所有人都加班,等项目上线运行都没问题,各项数据都 OK,此时可能已经凌晨三四点了,所有人拖着疲惫的身体下班。正是由于每一次发版都是一个大事,所以一般单体项目不太会频繁发版(我说的频繁是指如一天一版这种),发版周期普遍比较长。

  1. 难以扩展

当系统不同模块对资源的需求不同的时候,我们想做针对性的硬件扩展也并不方便。

举个简单例子,有一个模块需要进行大量的运算,我们希望能为之提供更好的 CPU;有一个模块需要更大的内存,我们需要扩展更大的内存。

然而由于所有的模块都打包在一起,我们只能针对当前服务器做各种硬件升级,无法针对某一个模块做专门的硬件升级。

  1. 过期的技术栈不易更新

我相信很多小伙伴见到的单体项目还有一个特点就是技术栈普遍比较老旧。这也是因为单体项目时间久了之后,积重难返,想要对基础框架做版本升级往往牵一发而动全身,更别提从传统的 SSM 切换到 Spring Boot 上这种超级繁琐的工作了。因此大部分的单体项目,在立项的那一刻选用了什么技术栈、选用了技术的哪个版本,基本上这个项目未来都是这个版本了。

从上面的介绍中小伙伴们可以看到,单体项目优点很明显,然而缺点也是非常明显的。而这些缺点,都可以通过微服务来解决。

2. 微服务版 TienChin

如果 TienChin 项目是微服务版呢?我们来看一张简单的架构图。

简单画了张图,我来解释下:

  1. 首先我们基本上是按照业务来划分服务的。每一个服务都有自己独立的数据库,自己操作自己的库。
  2. 假设在线索管理中,需要调用商机管理,那不能直接操作商机的数据库,必须去调用商机管理服务中提供的 REST API,通过这个 REST API 来操作库。
  3. 所有的服务有一个统一的入口 Gateway,如果前端是手机 App 或者小程序之类的,通过 Gateway 来访问到系统。
  4. 有一个后台管理的 Web UI 项目,提供相应的网页操作。

大致上就是这个样子。

那么这个微服务版的 TienChin 跟前面的单体版 TienChin 相比优势体现在哪里呢?

  1. 容易维护

首先第一点就是,项目拆分为微服务之后,每个服务相对来说都比较小,项目的维护相对来说也会比较容易。一个比较小的项目,在 IDE 中启动也会比较快。可以有一个很小的团队来负责项目的维护。

  1. 服务可以自由扩展

以上图为例,如果某日搞促销活动,线索管理这个服务的并发量比较大,我们可以非常方便的为线索管理模块做横向扩展,如下图这样:

任何一个服务,如果有需求,都可以非常方便的进行扩展,并且可以根据服务的特点来选择合适的硬件,例如这个服务耗内存,那就加大内存;另一个服务耗 CPU,那就选择一个性能到位的 CPU 等等。

  1. 解耦后更强的容错性

通过服务降级、熔断等微服务组件的使用,我们可以实现各个微服务具备更强的容错性。一个服务出故障,并不会影响其他的服务。例如合同管理里边发生了内存泄漏,这个并不会影响到商机管理服务。

  1. 更容易采用新技术

之前我们在谈到单体项目的弊端的时候,提到了单体项目的技术栈更新非常不易。现在我们切换成微服务了,新技术栈的切换其实就变得非常容易了。每一个微服务都可以根据当前项目的情况,选择是否采用最新的技术栈,而且一个微服务在切换最新技术栈的过程中,如果不幸发生了问题了,也不会影响到其他的微服务,只会影响到当前的服务。由于各个微服务之间基本上都是通过 REST API 进行交互的,所以,退一万步,你甚至可以使用不同的开发语言来开发不同的微服务。

  1. 更友好的 CI/CD

CI/CD 是 DevOps 的一部分,但是在前面的单体项目中,当项目比较大的时候,想做到持续交付/持续部署已经越来越难了,而微服务让一个超大规模的项目可以非常方便的实现 CI/CD。

现在,我们的每一个服务都有自己独立的团队、独立的代码仓库、独立的自动化部署流水线,且互不相扰,如下图这样:

现在,每一个服务都可以独立的实现服务的上线和部署,结合 DevOps 可以做到非常轻松的发版,不需要再像以前单体应用发版的时候,如临大敌一样。

这样划分之后,工程师也可以将自己的精力放在业务开发商,提供更多有价值的功能,而不是像一个救火队员一样,每天忙着四处灭火。

好啦,通过这样一篇简单的文章和图片,希望大家对微服务有一个基本的认知,当然,微服务也不是“银弹”,微服务架构也存在问题,这个咱们后面有空了松哥再继续和小伙伴们分享。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories,找到启动类 Nac…

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩,配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据,就免不了搜索,而搜索离不…

【微信小程序】全局数据共享

小程序中的全局数据共享方案在小程序中可以使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。● mobx-miniprogram用来创建Store实例对象● mobx-miniprogram-bindings用来把Store中的共享数据或方法,绑定到组件或页面中使用npm install --save…

Python虚拟环境

学习视频:安装不算完事,只有理解了虚拟环境才算真正掌握 Python 环境 同类笔记:Python虚拟环境 目录 一、什么是虚拟环境 二、虚拟环境相关工具的使用和原理 创建虚拟环境 虚拟环境目录分析 虚拟环境的激活 虚拟环境做了什么 退出虚…

【论文精读】360MVSNet

今天读的是发表在WACV2023上的MVS文章,该文章提出了基于全景相机的MVS pipeline。 文章链接:点击前往 代码链接:暂未开源。 文章目录Abstract1. Introduction2. Related works3. Method3.1 Feature Extraction3.2 360 Spherical Sweeping3.2.…

【经典笔试题2】

test1 test2 test3 test4 test5 test1 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 程序的结果是什么?首先分析代码,a是数组名,是数组首元素…

详解Web服务器与http https协议工作过程

Web服务器 URL URI URL是URI的一个子集 www www所用的协议 http请求报文分析 状态码(空行:最后一 个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。) 网址解析 网址注释实例 HTT…

从工厂方法到注解的小例子

目录一、背景介绍二、思路&方案三、过程过程图一过程图二过程图三过程图四(运行时的图)代码四、总结五、升华一、背景介绍 上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用;本篇继续基于小例子来实现工厂方法,以及注解实…

linux Regmap API

1.针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问I2C/SPI 设备的时候,为此引入了 Regmap 子系…

如何用智能地教狗狗上厕所

背景 22年养了一只很可爱的小狗狗,我其实就一个问题:为啥这么可爱的狗狗会拉屎撒尿呀? 自从崽崽来了我们家之后,最让我们头疼的就是它乱拉、乱尿的问题了,以前会在家里到处乱来,最近一段时间好了很多&…

机器学习(整体结构)

国科大《机器学习》内容,周晓飞老师讲的挺不错的,浅显易懂。 本来是想整理下课程内容的,然而动手后才发现内容过多(很想吐槽,为啥这么多模型?不能相互替代么?)简略画个思维导图算啦…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-返回值处理

前言 上回我们回答了ReqeustMappingHandlerAdapter调用目标方法的参数解析问题,今天我们再来回答第二个问题:怎么处理方法调用的返回值。 深入分析返回值处理需求 RequestMapping处理器的返回值类型 相信很多同学对于这个返回值的第一个反应就是返回一…

图解JDK1.7中HashMap头插法扩容造成的死循环问题

JDK1.7中HashMap头插法扩容造成的死循环问题 文章目录JDK1.7中HashMap头插法扩容造成的死循环问题一、背景二、源码解读三、图解单线程环境中扩容多线程环境中扩容四.总结一、背景 HashMap是线程不安全的,在并发使用HashMap时很容易出现一些问题,其中最…

ArcGIS基础实验操作100例--实验66符号图层的保存与加载

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验66 符号图层的保存与加载 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

【OpenGL】基础光照

介绍 现实世界中的光照是极其复杂,难以计算的,因此OpenGL的光照使用的是简化的模型,其中一个模型被称为冯氏光照模型(Phong Lighting Model)。 冯氏光照模型的主要结构由三个分量组成: 环境(Ambient)光照漫反射(Diffuse)光照镜…

blender学习笔记2023.01.05

文章目录why基操why 想画条大黄鱼 想画一下渔网 网箱 写笔记预防忘记 基操 1.语言改为中文 不过后续可能改回英文去 2.顶部导航栏—编辑—偏好设置—界面—翻译—(关掉)新建数据 目的是预防插件导致奇奇怪怪的报错 这里左下角位置处点击 保存修改 3…

初识LCD1602及编程实现字符显示

一、LCD1602基础知识及接线方法LCD1602是一种工业字符型液晶,能够同时显示16x02即32字符(16列两行)引脚说明第 1 脚: VSS 为电源地 第 2 脚: VDD 接 5V 正电源 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时…

【Neo4j构建知识图谱】:官方服务图谱大型数据集下载与可视化方法【数据集包括:食谱数据、足球、权力的游戏、美国宇航局、英国公司注册、财产所有权、政治捐款】

目录 1、服务端口免费查看知识图谱2、关于 Neo4j 示例数据集的实现3、下载离线数据集4、项目概览与实现案例还可以看到解析python源码还可以看到解析cypher源码各种数据集实现案例参考1、服务端口免费查看知识图谱 此服务器托管许多具有只读访问权限的数据集,供公众使用。 该…

2022尚硅谷SSM框架跟学(三)MyBatis基础三

2022尚硅谷SSM框架跟学 三 MyBatis基础三9.动态SQL9.1if9.2where方法一:加入恒成立的条件方法二:使用where标签9.3trim9.4choose、when、otherwise9.5foreach9.51批量添加9.52批量删除批量删除方式1批量删除方式2批量删除方式39.6SQL片段10.MyBatis的缓存10.1MyBatis的一级缓存…

JS基础(一)——认识JS及其基础语法

网页的三个组成部分 HTML:用于控制网页的内容CSS:用于控制网页的样式JavaScript:用于控制网页的行为 网页的行为指用户与浏览器的行为交互、浏览器与浏览器与服务器的数据交互。 ECMAScriptS(ES) ECMAScriptS是Java…