草庐IT

项目开发软件架构选择指南

lydia77 2023-03-28 原文

从系统的组织和部署结构方面来看,软件架构的演化进程显然有着从简单到复杂的趋势。那是否最新最复杂的架构就是目前业界选择的最佳架构呢?非也。没有最好的架构,只有最合适的架构。在软件架构的选择上,“合适”比“新”更加重要。

对于整个软件架构发展进程,我们可以大致分为三大阶段:单体架构、SOA架构、微服务架构。今天就来简单分析一下架构的发展与优劣势,希望能对大家的项目开发有所助益。

(1)单体架构

单体架构就是把所有的业务逻辑和控制逻辑全部都放在了一起,一个程序里包括了所有的相关功能。(All in one)。比如一个 ERP 系统中包括了商品模块,订单模块,销售模块,库存模块,报表统计等等。

 

 

单体架构基本解决了所有简单的问题,由于开发时所有业务代码都在一起,测试的时候不需要联调各种服务,发布维护非常轻松。

但缺点也很明显,每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。一旦某一个模块出了问题,那基本就是全盘 GG。如果想针对某个具体模块提升性能,难度也比较大。

总的来说单体架构前期开发成本低、开发周期短,适合小型项目。对于大型项目来说不易开发、扩展和维护。技术栈受限,只能使用一种语言开发。系统性能扩展只能通过扩展集群节点,成本高。

单体架构优劣势:

优势

劣势

  • 自包含单元
  • 低延时
  • 容易进行测试和运维
  • 整个架构非常简单
  • 很长的开发周期
  • 很低的吞吐量
  • 紧耦合低内聚
  • 隔离性差
  • 故障容忍度差
  • 持续集成和部署困难
  • 扩展性很差

(2)面向服务架构(SOA)

随着业务系统越来越复杂,单体架构垂直拆分演变出了SOA( Service-Oriented Architecture),即面向服务的架构。它可以根据需求通过网络对松散耦合的粗粒度应用组件(服务)进行分布式部署、组合和使用。一个服务通常以独立的形式存在于操作系统进程中。比如上面举的这个 ERP 系统,可以按照功能,将用户,商品,交易等不同的部分拆分为了独立的服务(当然,数据库也需要进行拆分)。

 

 

从架构上来说,是将重复功能或模块抽取成组件的形式,对外提供服务,在项目与服务之间使用ESB(企业服务总线)的形式作为通信的桥梁。而ESB 就是一根管道,用来连接各个服务节点。为了集 成不同系统,不同协议的服务,ESB 做了消息的转化解释和路由工作,让不同的服务互联互通;

听起来这种方式比之前的单体架构厉害了不少,但还是会有一些对应的问题,比如每一个拆分之后的服务“依然还是单体服务”,有一些每个模块中都会使用的公共模块没有拆分(这也会导致 ESB 比较复杂)。
总结来说,面向服务架构有这些优劣势:

面向服务架构优劣势:

优势

劣势

  • 服务解耦
  • 服务隔离性好
  • 可以进行持续集成和部署
  • 容易测试和运维
  • 集中式的服务治理
  • 架构并不复杂
  • 厚重和复杂的ESB
  • 业务逻辑侵入ESB
  • ESB 故障影响面太大
  • 扩展性一般
  • 开发周期适中
  • 适中响应时间,低吞吐量

3)微服务架构

那如果我们不仅按照垂直方向拆分,同时也按照水平方向进行进一步拆分,那也就是微服务的架构模式了,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。其实和 SOA 架构类似,微服务是在 SOA 上做的升华。

 

 

还是以ERP系统举例,系统里的商品,用户,订单,库存等不同的部分都成为了独立的微服务,每一个服务之间都可以进行直接的通信沟通。

那么也就是说,微服务其实就是在移除了 ESB 之后,更为轻量和更为松耦合的服务,并把 ESB 的控制逻辑以 SDK 的方式注入到每个微服务中进行服务控制和治理,架构更为的分布式。

由于微服务的要素之一就是“微”,所以大多数微服务都是基于容器进行调度管理的(这也是我们为什么经常会在微服务的相关介绍中看到 Docerk,k8s 的相关字样)

微服务架构优劣势:

优势
劣势
  • 开发周期短
  • 松耦合,高内聚
  • 高吞吐量
  • 快速的持续部署
  • 低故障影响,高可用
  • 扩展性很好
  • 开放的技术栈
  • 测试和运维难度大
  • 服务治理变困难
  • 响应时间变长
  • 架构非常复杂
  • 技术门槛很高

从工作到现在经历过大大小小的几十个项目,每个项目都会基于当前的项目阶段、技术情况去选择合适技术架构。(很多大型企业的应用目前都还是单体架构)。随着技术的发展,随着业务的发展App版本不断迭代,新功能不断增加,业务上的处理逻辑越变越复杂。许多企业可能都面临着是否要将单体架构进行微服务升级改造的问题。但从一个大一统的系统,拆分成一个一个单独的小服务,企业需要投入的人力、物力、财力是非常巨大的。在没有足够的资源投入之前,不妨选择一些折中的方案。

传统架构的最大问题就是紧耦合,在应用迭代、升级的过程中,除了升级微服务架构之外,选择一些可插拔式的技术工具也可以很好的解决问题。比如:FinClip小程序容器技术 ,这是一种以小程序技术为载体,发展成组装式的企业应用架构技术。

从应用层来说,只要把FinClip SDK嵌入到企业的App中,就能立刻获得小程序运行能力。不管你的项目是什么软件架构,都可以通过这种嵌入式的小程序技术去获得APP并行开发、热更新、敏捷迭代的能力。

从开发角度来说,这是一种「Native + 小程序」的混合开发模式,借助这种模式可以让小程序运行在自有 App 中,将臃肿的 App 功能打散,功能模块互相解耦实现模块化开发,各业务模块间互不影响,通过管理后台即能实现实时动态更新与发布。对于一些积重难返的项目来说,采用这种入侵性小、可插拔式的技术是一种值得尝试的解决方案。

 

有关项目开发软件架构选择指南的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  10. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

随机推荐