如何设计网络应用:让软件架构101在项目早期做出正确的决定

891 阅读17分钟

全文共6320字,预计学习时长19分钟


如果你想建立自己的网络应用程序。你有创建的理念,但现在的关键是建立正确的架构。


在这篇文章中,我们将讨论这些关键内容:


·什么是软件架构?

·为什么软件架构很重要?

·软件架构和软件设计之间的区别。

·软件架构模式。

·如何决定你的应用程序应该有多少层。

·水平或垂直缩放—哪一种适合您的应用?

·整体式还是微型服务?

·何时应该使用NoSQL或SQL?

·选择合适的技术。

·如何成为软件架构师。

·如何起步。


文本的目标是让您对网络架构、相关概念以及在设计应用程序时如何选择合适的架构和技术有一个坚实的理解。在这篇文章的结束后,当你从零开始设计一个应用程序的时候,你不会在黑暗中孤立无助。


我们开始吧!


什么是软件架构?


系统的软件架构描述了它的主要组件、它们的关系以及它们如何相互作用。


本质上,它是一个蓝图。它提供了管理系统复杂性的抽象图景;它在组件之间建立联系和协调。



一些关键点:


·软件架构有助于确定出满足所有技术和运营要求的解决方案,它们的共同目标是优化性能和提高安全性。

·设计架构涉及组织需求和开发团队需求的交集。每个决策都会对质量、可维护性、性能等产生相当大的影响。


我最喜欢的软件架构定义之一是拉尔夫·约翰逊在《设计模式:可重用面向对象软件的元素》一书中所说的:


“这是你希望在项目早期就能做出的决定。”


为什么软件架构很重要?


建造一座建筑或者做一个比萨饼——要成功地创造任何东西,你需要把基础做好。如果你没有把基础做好,出了问题,你只能从头开始——没有办法绕过它。


构建一个网络应用程序也是一样的。建筑是基础。应该仔细考虑,以避免后续重大设计变更和代码重构。


许多工程师会告诉你:你不想重新设计东西。它像黑洞一样吞噬你的时间。它有可能把你的提交日期延长几个月,这还不是最长的。并且不包括工程期和金融资金的浪费。


在初始设计阶段做出的草率决定可能会造成开发过程中任一阶段的僵局。因此,在我们开始编码之前,必须使底层架构正确。


软件开发是一个迭代和进化的过程——我们不一定能在第一次的时候就把事情做完美。但这不是不完成任务的借口。


软件架构和软件设计的区别


软件设计和架构之间经常存在混淆。下面来进行区分。


软件架构用于定义系统的框架和高级组件,以及它们如何一起工作。例如,您是否需要一个可以将应用程序分成两个组件无服务器架构:BaaS(后端即服务)和FaaS(功能即服务)?或者,您是否需要像微服务架构这样的东西,可以将不同的特性/任务分成单独的模块/代码库呢?


选择架构将决定您如何处理性能、容错、可伸缩性和可靠性。


软件设计负责代码级设计——每个模块在做什么,类的范围,以及功能、目的等。战略性地使用时,它们可以使程序员工作更有效率,使用已经被其他人改进过的方法,所以他们不需要重复编程。


此外,当与他人讨论或在更大的团队中管理代码时,他们提供了一种有效的通用语言来概念化重复的问题和解决方案。


来源:Pexels


软件架构模式


客户端-服务器


该架构基于请求-响应模型。客户端向服务器发送信息请求,服务器对其做出响应。


你浏览的每一个网站,无论是Wordpress博客、Facebook或Twitter之类的网络应用,还是你的银行应用,都是建立在客户机-服务器架构之上的。


P2P


P2P网络是这样一种网络,在P2P网络中计算机(也称为节点)可以在不需要中央服务器的情况下相互通信。缺少中央服务器排除了单点故障的可能性。网络中的所有计算机都有平等的权利。节点同时充当做种和非做种。因此,即使一些计算机/节点出现故障,网络和通信仍然正常。


P2P是区块链技术的基础。



模型-视图-控制器


MVC架构是一种软件架构模式,其中应用程序逻辑根据功能分为三个组件。这些组件称为:


·模型—展现数据在数据库中的存储方式。

·视图—用户可见的组件,如输出或图形用户界面。

·控制器——作为模型和视图之间的接口的组件。


MVC架构不仅用于桌面应用程序,还用于移动和网络应用程序。



微服务


在微服务架构中,不同的特性/任务被分成独立的模块/代码库,这些模块/代码库与每个模块/代码库协同工作,形成一个完整的大型服务。


与单一架构相比,这种架构有助于更轻松、更干净的进行应用程序维护、功能开发、测试和部署。



事件驱动(Event-driven)


非阻塞架构也称为反应式或事件驱动架构。事件驱动架构在现代网页应用程序开发中非常流行。


它们能以最小的资源消耗处理大量的并发连接。现代应用程序需要一个完全异步的模型来扩展。这些现代网页框架在分布式环境中提供了更可靠的行为。



分层(Layered)


这种模式可用于构建可分解为子任务组的程序,每个子任务组都处于特定的抽象级别。每一层都为下一高级别层提供服务。


最常见的层是:


·展示层

·应用层

·业务逻辑层

·数据访问层


六角形结构


该体系结构由三个组件组成:


·港口

·适配器

·域名


该架构的重点是使应用程序的不同组件独立、松散耦合且易于测试。


架构模式以域名为核心——这就是业务逻辑。外层有端口和适配器。端口就像一个应用编程接口,一个界面。所有应用程序的输入都需通过界面。



您的应用程序应该有多少层?


单层应用


优点:


·没有网络延迟。

·数据快速轻松获得

·为确保数据安全,不通过网络传输。


缺点:


·对应用程序的控制很少—一旦发布,很难实现新功能或代码更改。

·测试必须非常彻底,尽量减少出错的空间。

·单层应用容易受到调整或逆向工程的影响。


双层应用程序


优点:


·代码和用户界面在同一台机器上,所以网络调用较少。

·数据库服务器和业务逻辑在本质上非常接近,可以提供更好的性能。


缺点:


·由于客户端拥有大部分应用程序逻辑,因此在控制软件版本和重新分配新版本时会出现问题。

·因为它只支持有限数量的用户,所以缺乏可扩展性。当多个客户端请求增加时,应用程序性能可能会降低,因为客户端需要独立连接器和CPU内存来处理。

·由于应用程序逻辑与客户端耦合,因此很难再利用程序逻辑。


三层应用程序


优点:


·通过客户端应用程序的数据损坏可以被消除,因为中间层传递用于数据库更新的数据确保其有效性。

·将业务逻辑放置在集中式服务器上使数据更加安全。

·由于应用服务器的分布式部署,因此不需要每个客户端的单独连接,有几个应用服务器的连接就足够了,所以系统的可扩展性得到增强。


缺点:

·通常,创建三层应用程序时,随着通信点的增加(客户端到中间层到服务器,而不是直接从客户端到服务器),就需要更多投入,通过诸如VisualBasic、PowerBuilder、Delphi等工具提高的性能将会降低。


多层应用


优点:


·三层架构的所有优点。

·由于从数据库层和客户端层卸载,性能得到提高,使其能够适应中高容量行业。


缺点:


·由于层的组件化,复杂的结构难以实施或维护。


结论


·不想要任何网络延迟,应该选择单层架构。

·需要将网络延迟降至最低,并需要对应用程序中的数据进行更多控制,请选择双层应用程序。

·需要控制应用程序的代码/业务逻辑、希望它是安全的并且需要控制应用程序中的数据时,应该选择三层架构。

·需要应用程序扩展和处理大量数据时,应该选择N层体系结构。


水平或垂直缩放——哪一种适合您的应用?


如果你的应用程序旨在接受最小流量组成的实用程序或工具,比如说,一个组织中的内部工具,那么可能不需要在分布式环境中管理应用程序。一台服务器足以管理流量,并且流量负载不会显著增加。在这种情况下,使用垂直缩放。



但如果应用是面向公众的社交网络、健身应用或类似的社交应用,那么在不久的将来,流量预计会呈指数级增长。在这种情况下,高可用性和水平可扩展性都很重要。



构建云上部署,并从一开始就考虑横向可扩展性。这是一个可以了解更多关于可伸缩性的有用网站。


整体还是微服务?


让我们来探索一下这两者如何取舍。



何时使用单片架构


当需求很简单并且应用程序以处理有限流量为主时,单片应用程序最适合。例如,组织的内部税务计算应用程序或类似的开放公共工具。


在这些用例中,企业确信随着时间的推移,用户群和流量不会呈指数级增长。


也有开发团队决定从整体架构开始,然后扩展到分布式微服务架构的情况。


这有助于他们在需要时逐步处理应用程序的复杂性。这正是LinkedIn的应用。


何时使用微服务架构


微服务架构最适合复杂的用例,也最适合那些未来流量会呈指数级增长的应用,比如一个广受欢迎的社交网络应用。


典型的社交网络应用程序有各种组件,如消息传递、实时聊天、实时视频、图像上传、喜好和共享功能等。在这种情况下,分别开发每个组件,牢记单一责任和关注点分离原则。


每一个被写入单一代码库的特性都不会迅速混乱。


现在,我们已经经历了三种整体和微服务方法:


·选择整体式建筑。

·选择微服务架构。

·从整体架构开始,然后扩展到微服务架构。


选择整体架构还是微服务架构在很大程度上取决于我们的用例。建议在彻底理解需求的情况下,尽量保持架构简明。了解整体情况,必要时进行增加,并不断迭代地演化代码。这是正确的方法。


什么时候应该使用NoSQL还是SQL?


何时选择一个数据库?


如果你在写一个股票交易、银行或基于金融的应用程序,或者你需要存储很多关系,例如,当你写一个像FaceBook这样的社交网络应用程序时,你应该选择一个关系数据库。原因如下:


事务和数据一致性


如果你编写的软件与金钱或数字有关,应用于交易,或者必须遵守ACID——数据一致性对你来说非常重要。关系数据库在事务和数据一致性方面表现突出——它们符合ACID规则,已经存在了很长时间,并且经过实际考验。


存储关系


如果你的数据有很多关系,比如你的哪些朋友住在哪些个的城市?你的哪个朋友已经在你今天打算去的餐厅吃过饭了,等等。没有什么比关系数据库更适合存储这种数据了。


关系数据库是用来存储关系的。它们已经过测试并被像Facebook这样的行业巨头用作面向用户的主要数据库。


流行的关系数据库


·MySQL

·MicrosoftSQL Server

·PostgreSQL

·MariaDB


何时选择NoSQL数据库


选择NoSQL数据库的几个原因。


处理大量读写操作


需要快速扩展时,请使用NoSQL数据库。例如,当网站上有大量的读写操作,并且处理大量数据时,NoSQL数据库最适合这些情况。由于它们能够动态添加节点,因此可以以最小的延迟处理更多并发流量和大量数据。


来源:Pexels


运行数据分析


NoSQL数据库也最适合数据分析用例,在这种情况下,需要处理大量涌入的数据


受欢迎的NoSQL数据库


·MongoDB

·Redis

·Cassandra

·HBASE


如果想尝试MongoDB这样的NoSQL数据库,强烈建议参考一下尼古拉·日夫科维奇的课程《MongoDB最终指南》。


为工作选择合适的技术


实时数据交互


构建一个应用程序需要:


· 实时与后端服务器交互,如消息应用程序,或音频视频流应用程序,如Spotify、Netflix等。

·客户端和服务器之间的长期连接,及后端的非阻塞技术。


然后,一些能够编写应用程序,广受欢迎的技术是NodeJS和被称为Tornado的受欢迎的Python框架。如果你在Java生态系统中工作,你可以看看Spring Reactor,Play和Akka.io


对等网络应用


如果打算建立一个点对点的网络应用,例如,一个P2P分布式搜索引擎或者一个P2P直播电视广播服务,它是一个类似于微软的直播站,那么会想要研究像DAT和IPFS这样的JavaScript协议。看看FreedomJS,它是一个在现代网络浏览器中构建P2P网络应用的框架。


基于CRUD的常规应用程序


如果有简单的用例,比如一个常规的基于CRUD的应用程序,那么有一些可以使用的技术:Spring MVC、Python Django、Ruby on Rails、PHP Laravel和ASP。NET MVC。


简单、小规模的应用


如果你打算写一个不太复杂的应用程序,比如博客、简单的在线表单或者与社交媒体集成的简单应用程序,并且在门户的IFrame中使用PHP。今天可以免费学习PHP。


也可以考虑其他的网络框架,比如Springboot、Ruby on Rails,它们通过减少细节、配置和开发时间来促进快速开发。但是与托管其他技术相比,PHP托管的成本要低得多。它非常适合非常简单的用例。


CPU和内存密集型应用程序


是否需要在后端运行CPU密集型、内存密集型、繁重的计算任务呢?您是否需要对大量数据进行大数据处理、并行处理或运行监控和分析?


常规的网络框架和脚本语言不适合数字运算。业内常用的编写高性能、可扩展的分布式系统的技术是C++。它具有便于低级内存操作的特性,在编写分布式系统时为开发人员提供了对内存的更多控制。大多数密码货币都是用这种语言写的。这是一门免费学习C++的课程。


Rust是一种类似于C++的编程语言。它是为高性能和安全并发性而构建的。近期,它在开发者中越来越受欢迎。Java、Scala和Erlang也是不错的选择。大多数大型企业系统都是用Java编写的。


Go是谷歌的一种编程语言,用于为多核机器编写应用程序和处理大量数据。以下是如何开始学习Go。


Julia是一种动态编程语言,专为高性能计算和数值分析而构建。


今天免费学习C++、Rust、Scala和Java。


如何成为软件架构师


如果前面那些都很有趣,那么你可能渴望成为一名软件架构师。但是从哪里开始呢?嗯,对任何人来说,很少有从软件架构师开始的,所以大多数软件工程师在开始设计架构之前都会有几年工作经验。


熟悉软件架构的最好方法之一是设计自己的网络应用程序。这将迫使您考虑应用程序的所有不同方面——从负载平衡、消息排队、流处理、缓存等等。一旦你开始理解这些概念是如何融入到你的应用程序中的,就很有可能成为一名软件架构师。


作为一名有抱负的软件架构师,需要不断扩展你的知识,并紧跟最新的行业趋势。可以以软件开发人员的身份工作,学习一种或多种编程语言,并逐步走向成功。


即使在大学里不能获得软件架构师学位,但是也会发现其他课程也很有用。网络应用和软件架构101是开始学习设计和实现网络应用的最佳实践的好地方。


如何起步


来源:Pexels


在这篇文章中我们已经讲了很多,但是只触及了这个话题的表面。还没有探索REST APIs、高可用性和CAP定理。


如果想深入了解软件架构,强烈推荐网络应用和软件架构101。它介绍了设计网络应用程序架构时涉及的不同组件和概念。


将了解各种体系结构风格,如客户机-服务器、对等分散体系结构、微服务、网络应用程序中的数据流基础、涉及的不同层、可伸缩性、高可用性等概念。


此外,经历选择正确的架构和技术堆栈来实现用例的技术是人人都需要的。我们将介绍不同的用例,这将有助于编写网络应用程序时深入了解哪些技术和体系结构最适合某些用例,并会逐渐理解其中的技术权衡。


如果你是一个刚刚开始软件开发职业的初学者,本文会有很大帮助。这也将有助于进行软件工程面试,尤其是对全堆栈开发人员的职位有帮助。


快乐学习!

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”


(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)