天天吹微服务,单体应用有啥不好?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012702547/article/details/97622560

单体应用确实有问题!

最近在研究微服务架构,有一点点心得,打算在公众号上写几篇文章和大家慢慢分享下。

这个话题有点大,我会分几篇文章和大家慢慢说,今天就先来说说传统的单体应用有哪些弊端,正是因为单体应用存在的弊端,使得我们不得不考虑发展微服务。

人类发展的历史就是一个社会分工不断细化的历史,从这个角度来讲,微服务这种将一个复杂的大项目拆分为众多小项目,然后程序员分工合作,共同完成项目,这种协作方式是符合历史潮流的。

这是我们站在今天的角度来说的,曾经的单体应用也是先进生产力的代表。

但是,随着互联网的发展,我们对一个系统的要求越来越高,单体应用已经很难适应当前的开发,因此在回答我们为什么要使用微服务这个问题之前,我们有必要来聊一聊单体应用目前都面临哪些问题。

面临的问题

1.项目过度复杂

你要创建一个简单的用户管理系统,二话不说,直接创建 Maven 项目然后开干就完事了,这没问题,因为这很简单。

但是你要说想搞一个淘宝网站,或者你想搞一个用友 U8 系统,那你恐怕就得先慢慢设计系统架构了。单体应用,由于就是一个项目,所有的功能都是写在一个项目中,不可避免的出现项目过度复杂的情况。而且这种复杂情况会不断恶化。

有的小伙伴可能有这样的经验,刚入职了一家公司,新接手了一个项目,上面催的很急,让你赶快修复几个 bug ,项目复杂,光是实体类的包就有好几个 bean、model、pojo 等,一个项目被很多人经手之后,到你手里,早已经一团乱麻,你小心翼翼尽量不碰触到已有的功能,终于修完了几个 bug,搞了俩礼拜,你觉得这个项目太坑爹了,不想干了,于是接盘侠从你手里接到了一个复杂度又上升了一步的项目。

就这样,一个原本简简单单的单体项目,在变复杂的路上一去不复返。

2.开发速度缓慢

单体应用开发速度缓慢,因为单体应用复杂了之后,项目变得异常臃肿而且庞大,每一次编译构建、运行以及测试,都需要花费大量时间,而且如果测试有问题,又得从头来一遍,注意,这里的每一次从头编译构建等都是整个项目的从头编译构建。

即使你可能只要修改某一个参数,你也得把上面整个流程走一遍,相当于每一次的修改都是牵一发而动全身的操作。

速度没法快。

3.不易扩展

项目中不同模块对计算机的性能要求不一样,例如使用 Redis 来保存了大量的热点数据,那么我们希望服务器的内存非常大,另外有一个模块涉及到了图片处理,我们又希望服务器的 CPU 非常强,如果是单体应用部署的话,那么这些条件服务器都要满足。

4.技术栈不易扩展

单体应用还有一个劣势就是技术栈不易扩展,一旦你选定了某一个技术栈来开发项目,以后很难在技术栈上做切换。有的公司还会自己搞一套系统,这种在当时看起来好像都没有啥问题,可是经过几年之后,回头再看,已经很过时了,很 low 了,当初设计系统的人可能已经离职了,刚入职的新手也不敢动这个老古董,只能在这个老古董上面忍痛开发。

有的时候,有一个服务需要处理高并发,你很想用 Go 语言来做,可是做不到,没法引入其他语言。

这些都是单体应用的劣势,如果有微服务,上面这些问题都将得到解决。

曾经的优势

当然,事物都是有两面性的,单体应用也有它自己的优势,例如:

  • 开发简单,一个 IDE 就可以快速构建出一个单体应用
  • 测试简单
  • 部署简单,Tomcat 安装好之后,应用扔上去就行了
  • 集群化部署也很容易,多个 Tomcat + 一个 Nginx 分分钟就搭建好集群环境了

这么多优势,还是难掩劣势。

不过大家在做项目的时候,还是要结合实际情况来选择,不能因为微服务厉害,所有项目都是微服务,如果你仅仅只想做一个用户的增删改查,那么很明显,创建一个简单的单体应用是最合适的。

好了,本文主要和大家分享了传统单体应用存在的一些问题,正是因为这些问题,我们需要引入微服务,下篇文章,我们就来看看微服务有哪些优势。

参考资料:

[1] Chris Richardson.微服务架构设计模式[M].北京:机械工业出版社,2019.

关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

展开阅读全文

-- 再来:游标(进者有分) --

06-21

-- 火车不是推的,游标不是吹的!( 哪位SQL大师再来用6行代码敲定试试?)rn[url=http://topic.csdn.net/u/20100621/12/066bd0e9-aebe-47c5-841b-0ba248da137d.html?4199][/url]rnrn[code=SQL]------------------------------- 搭建测试环境:-------------------------------------------------------rnCREATE TABLE date_tb(rnvcNo varchar(10),rndDate datetime);rnrnINSERT INTO date_tb(vcNo, dDate) values('A', '2010-01-01');rnINSERT INTO date_tb(vcNo, dDate) values('A', '2010-01-02');rnINSERT INTO date_tb(vcNo, dDate) values('A', '2010-03-04');rnrn-- 循环插入B的数据rnDECLARErn @v_fromDate datetime,rn @v_toDate datetime;rnbeginrn set @v_fromDate = '2010-03-05';rn set @v_toDate = '2010-04-07';rn while @v_fromDate <= @v_toDatern beginrn INSERT INTO date_tb(vcNo, dDate) values('B', @v_fromDate);rn set @v_fromDate = @v_fromDate + 1;rn endrnendrnrn-- CREATE PROCEDrnselect * from date_tb;rnrn---------------------------------- 创建存储过程:--------------------------------------------------------rnALTER PROCEDURE [dbo].[date_tb_proc]rnASrn DECLARE @vcNo varchar(10);rn DECLARE @dDate datetime;rnrn DECLARE @old_vcNo varchar(10); -- 上一条记录的 vcNo 值rn DECLARE @old_dDate datetime; -- 上一条记录的 dDate 值rnrn DECLARE @new_vcNo varchar(10); -- 上一条记录的 vcNo 值rn DECLARE @new_dDate datetime;rnrn DECLARE @v_count INT; -- 记数器(用于判断连续时间是否超过30天)rn DECLARE @cnt INT; -- 保存切换 vcNO时,不插入重复记录rn rnBEGINrn CREATE TABLE #date_tmp(rn vcNo varchar(10),rn from_dDate datetime,rn to_dDate datetime);rnrn SET @v_count = 0;rnrn -- 初始化 @old_vcNo,@old_dDate,@new_dDate 变量值rn SELECT top 1 @old_vcNo = vcNo,rn @old_dDate = dDate, @new_dDate = dDate FROM [date_tb] rn Order by vcNo,dDate;rnrn Declare @MyData Cursor rn Set @MyData = Cursor FOR rn Select vcNO,dDate from [date_tb] Order by vcNo,dDate;rn Open @MyDatarn Fetch next from @MyData Into @vcNO, @dDate;rn While @@FETCH_STATUS = 0rn BEGINrn IF @old_vcNo = @vcNo -- 如果上条记录的 vcNo 等于 本条记录的 vcNorn BEGINrn IF (datediff(day,@new_dDate,@dDate) > 1 OR @v_count > 30)rn BEGIN rn -- 如果:上条记录的日期 与本条记录的日期 相隔超过一天,或者连续时间超过 30 天rn INSERT INTO #date_tmp(vcNo, from_dDate, to_dDate) VALUES(@old_vcNO, @old_dDate, @new_dDate+1);rn SET @old_dDate = @dDate; -- 重置 @old_dDatern SET @new_dDate = @dDate; -- 重置 @new_dDatern SET @v_count = 1; -- 重置 @v_count rn ENDrn ELSErn -- 否则:rn BEGINrn SET @new_dDate = @dDate; -- 重置 @new_dDatern SET @v_count = @v_count + 1; -- 递增 @v_countrn ENDrn ENDrnrn IF @old_vcNo <> @vcNo -- 否则( 如果上条记录的 vcNo 不等于 本条记录的 vcNo )rn BEGINrn SELECT @cnt= ISNULL(COUNT(1),0) FROM #date_tmp rn WHERE vcNo = @old_vcNO rn AND from_dDate = @old_dDatern AND to_dDate = @new_dDate + 1; -- 先判断是否已经插入本条记录,若没有,将其插入rn IF @cnt = 0rn BEGINrn INSERT INTO #date_tmp(vcNo, from_dDate, to_dDate) VALUES(@old_vcNO, @old_dDate, @new_dDate+1);rn ENDrn SET @old_vcNo = @vcNo; -- 重置 @old_vcNorn SET @old_dDate = @dDate; -- 重置 @old_dDatern SET @new_dDate = @dDate; -- 重置 @old_dDatern SET @v_count = 1; -- 重置 @v_count rn ENDrn Fetch next from @MyData Into @vcNO, @dDate;rn End rn Close @MyData rn Deallocate @MyDatarnrn -- 先判断是否已经插入本条记录,若没有,将其插入rn SELECT @cnt= ISNULL(COUNT(1),0) FROM #date_tmp rn WHERE vcNo = @old_vcNO rn AND from_dDate = @old_dDatern AND to_dDate = @new_dDate + 1; rn IF @cnt = 0rn BEGINrn INSERT INTO #date_tmp(vcNo, from_dDate, to_dDate) VALUES(@old_vcNO, @old_dDate, @new_dDate+1);rn ENDrnrn SELECT vcNo, from_dDate, to_dDate FROM #date_tmp;rn DROP TABLE #date_tmp;rnENDrnrnrn--------------------------------------- 执行测试:------------------------------------rnrnEXEC date_tb_proc;[/code] 论坛

没有更多推荐了,返回首页