[解讀REST] 3.基于網絡應用的架構

鏈接上文[解讀REST] 2.REST用來干什么的?,上文中解釋到什么是架構風格和應該以怎樣的視角來理解REST(Web的架構風格)。本篇來介紹一組自洽的術語,用它來描述和解釋軟件架構;以及列舉下對于基于網絡的應用來說,哪些點是需要我們重點關注的。

1 軟件架構

軟件架構方面關注的是如何以最佳的方式劃分一個系統、如何標識組件、組件之間如何通信、信息如何表達、組成系統的元素如何獨立的進化,以及如何表達上述的內容。一個優秀的軟件架構并非憑空靠想象得來的,每一個架構級的決策,都應該根據被設計的系統功能、行為和社交三方面的需求而作出。這是一個基本的設計原則,即“形式追隨功能”,這條原則源自于建筑學領域在數百年中失敗的建筑項目中獲得的經驗,但是卻總被軟件行業所忽略。“dedign-by-buzzword”的行為隨處可見,出現這種行為的原因在于很多設計者在選擇某一個優秀的軟件架構時,不了解這個架構的適用場景是什么、背后是基于什么考量才得出的這樣的架構,以及是否吻合自己的需求。下面先介紹一組自洽的術語來描述解釋軟件架構。

1.1 運行時抽象

軟件架構是一個軟件系統在其運行過程中某個階段的運行時元素的抽象。一個系統可能會有多層抽象和多個運行階段組成,每一個抽象和運行階段都是自己的軟件架構

軟件架構的核心是抽象:通過封裝來隱藏系統的一些細節,從而更好的識別其架構屬性。一個復雜的系統會有著多層抽象,每一層都有自己的架構,架構代表了某個層次上系統行為的抽象。除了層次之外,系統還會有多個運行階段,比如啟動、初始化、正常運行、停止、重新初始化等,每個階段也都有自己的架構,比如配置文件在啟動的時候會作為架構的一個數據元素來處理,到了正常運行的時候,這些數據元素已經分散到了系統的各個方面,在后續的階段中就不會再把它作為一個數據元素了。

很多時候很容易把軟件的源代碼的靜態結構視為軟件架構,其實這是不妥的。軟件結構是靜態的源代碼的組織結構方式,而非其真正運行起來時所表現出來的功能、層次和行為等。舉個小例子,比如一個接口和它的一個實現者,它們在源代碼級別是歸屬在一個地方的,但是在運行時我們關注的通常是其接口的行為,而非它的實現者身在何處。

1.2 架構元素

軟件架構是由一些架構元素(組件、連接器和數據)的配置來定義的,這些元素之間的關系受到一組約束,以獲得期望的架構屬性。具體的元素類型如下:

  1. 組件:組件是軟件指令和內部狀態的抽象單元,通過其接口提供數據的轉換能力。比如執行從硬盤加載數據到內存、執行一些計算、轉換為另外一種格式等。每個組件的行為是架構的一部分,能夠被其他組件觀察到或者識別出來(即由某個組件為其他組件提供的接口和服務來定義該組件,而不是由該組件內部的實現來定義)。具體的例子有瀏覽器,網關,Web服務器(apache,ngnix.,iis)等。
  2. 連接器:對于組件之間的通信、配合或者協作進行中間周旋的一種抽象機制。區分連接器和組件的最佳方式是看其對數據的處理方式,連接器是把數據從一個接口移交到另外一個接口而不改變數據,以此來支持組件之間的通信。在連接器的內部,可能是由多個組件組成的子系統,為了移交的目的而對數據進行某種轉換、執行移交然后做想法的轉換并交付與原始數據相同的結果。然而在架構所能捕獲的外部行為抽象中,可以忽略這些細節。具體的例子有緩存,SSL/TLS等等這類。
  3. 數據:數據是組件通過連接器接收或發送的信息元素。在基于網絡應用的結構中,數據元素的特性往往會決定某一種架構風格是否適用,比如是直接的和組件進行交互,還是把組件轉換為數據元素,通過網絡移交該元素,然后再對該數據元素做相反的轉換,得到一個能夠在本地與之交互的組件。具體的數據例子有二進制數據,json,HTML文檔,圖片等。

1.3 配置

配置是系統在運行期間和組件、連接器和數據之間的架構關系的結構。此配置非彼配置,指的不是一個系統的各項配置參數,而是如何組織架構元素之間的關系。

1.4 架構屬性

架構屬性是軟件架構對組件、連接器和數據的選擇以及排列所產生的屬性。其包含了系統的功能性屬性以及非功能性屬性(比如組件的可重用性、效率、擴展能力等)。架構屬性是由一組架構約束產生的,而架構約束則是由在架構元素的某一個方面應用軟件工程原則來驅動的。比如統一管道和過濾器架構風格通過在組件的接口上應用通用性的原則(強迫組件實現統一的接口),從而獲得組件的可重用性和可配置性的架構屬性。因此它的架構約束就是由通用性原則所驅動的“統一組件接口”,目的是獲得上述的可重用性和和配置性這兩個架構屬性。舉個簡單的小實例,比如asp net mvc中的filter。

架構設計的目標是創建包含一組期望的架構屬性的架構。這組架構屬性是系統需求的一個超集,不同架構屬性的在這組集合中的所占的比重取決于系統本身的需要。后面會介紹對于一個基于網絡的應用來說,哪些架構屬性是值得關注的。

1.5 架構風格

架構風格的定義在上一篇中已經簡單的解釋過了,這里更嚴謹的定義一下:架構風格是一組相互協作的架構約束,這些架構約束限制了架構元素的角色和功能,以及在任何一個遵循該架構風格的架構中允許存在的元素之間的關系

一個架構中即會包含功能屬性又會包含非功能屬性,直接比較不同類型的架構時是比較困難的。架構風格是一種對架構進行分類并且定義它們的公共特征的機制。通過比較這部分公共部分的架構約束,來識別其能獲得的架構屬性的差異。好比上篇文章中說到的佛教建筑和古羅馬建筑,比較它們的不同之處的辦法在于用其各自的特征來對比。架構風格是比軟件架構更加抽象的一個層次。比如說面向對象語言如果是架構風格,則Java,C#這些具體的實現了面向對象的語言則是具體的軟件架構;當我們拿C#和C對比的時候,它們的本質差異歸根到底是面向對象與面向過程的差異,而并不是分別實現了面向對象的C#和面向過程的C的具體細節差異。

2 基于網絡應用的架構

軟件架構可以存在于軟件系統的多個層次之上。而REST則是聚焦于軟件架構的最高層次的抽象,即跨越網絡的運行環境,這里的組件是通過網絡通信來實現組件的交互的。

軟件方面的研究通常是關注軟件設計如何分類和設計,但是卻很少能客觀的評估不同的設計對于系統行為有什么影響。

網絡方面的研究則聚焦于系統之間的通信細節以及如何提高通信性能,卻通常忽略一個事實,有時候改變一個應用的交互風格對于性能產生的影響要比改變所使用的通信協議更大。

基于網絡 VS 分布式:基于網絡的架構和軟件架構的區別在于,組件之間的通信僅限于消息傳遞或者消息傳遞的等價物。基于網絡的系統和分布式系統之間有細微的差異,比如一個分布式系統在其消費者看來和普通的集中式系統沒什么區別(只是它背后是運行在多個獨立的系統之上),也就是說其背后的實現對其消費者而言是透明的。而基于網絡的系統則是無需對消費者透明的,比如消費者在執行一個網絡請求時,如果本地的緩存可以滿足其需要,則無需執行一個真正的網絡請求。可以簡單的認為分布式應用屬于基于網絡應用的一個子集。當然也并不是說分布式系統就沒有緩存,這只是一種很細微的差異。

應用軟件 VS 網絡軟件:應用軟件通常來說指的是包含系統中包含業務行為的那部分功能。而網絡軟件的目的通常來說是關注與如何把數據跨越網絡傳遞到另外一個地方,其關心的是如何傳輸,而不關心為何要傳遞這些數據。應用軟件是對整個系統的一個抽象,比如用戶執行一個動作,這個動作中會包含如何獲取數據,執行網絡請求和對請求結果進行呈現,而網絡傳輸則是其中的一個環節。

3 基于網絡應用的關鍵架構屬性

REST關注的是基于網絡的應用軟件的架構設計,這也正是Web的訴求,Web是一個互聯網規模的分布式超媒體系統,互聯網規模意味著無法控制的可伸縮性和組件的獨立部署。那么如何評估一個軟件架構是否滿足Web的需求,把它實現出來看一下?不現實吧。比較可取并且可行的辦法就是利用上面所介紹到的架構屬性來和Web的需求目的進行比較:首先是要滿足功能性的要求,如果一個架構連基本的功能性需求都滿足不了,評估對于它來說就沒什么意義;其次則是非功能性的屬性,這也是評估的主要關注點。下面列舉下基于網絡的應用的關鍵架構屬性。

3.1 性能

性能這個話題或許是計算機行業永遠也繞不開的話題。基于網絡的應用的性能首先取決于應用的需求,然后是所選擇的交互風格,接下來是實現的架構,最后則是每個組件的實現細節。換句話說,應用軟件無法回避為了實現該軟件的需求而付出的基本成本。比如說軟件需要的數據位于系統A,并由系統B來處理,那么該軟件就無法避免的要把數據從系統A移動到系統B(好比你要訪問數據庫,這部分網絡開銷是無論如何也繞不過去的)。無論架構怎樣優秀,網絡的速度再快,也不可能比直接在系統A處理要快。

  1. 用戶感知的性能:用戶的一個動作從發出,到其得到響應的時間,其主要有兩個衡量指標,延遲和完成時間。比如打開一張圖片,一邊下載一邊顯示和等下載完后再顯示,對于用戶感知的性能是有明顯的區別的。
  2. 網絡性能:通常來講,網絡性能指的的網絡傳輸的吞吐量以及其支撐這些吞吐量所產生的開銷。
  3. 網絡效率:一個有趣的現象是,最佳的應用性能通常時通過不使用網絡而獲得的。這也就是說,對于一個基于網絡的應用來說,把對網絡的使用降低到最少,才是最高效的架構風格。

3.2 可伸縮性

可伸縮性是可以通過配置來改變一個架構中的大量的組件之間的交互的能力。可以通過簡化組件、去中心化、以及通過監視獲得的信息來對交互進行配置和控制。

3.3 簡單性

乍看之下這個架構屬性有點籠統,其實也不然。比如http的無狀態性特點,就使得服務器端的實現簡單化,不用去保存或者恢復上一次的http請求,也使得中間的各個組件和連接器可以獨立的理解單次請求的語義。通過對組件實施分離關注點原則,可以獲得簡單性;通過實施通用性原則,也可以提高簡單性。

3.4 可修改性

可修改性指的是對于應用的架構做出改變的容易度。即使創造出了一個完全滿足用戶需要的系統,用戶需求也總是會變化的,唯一不變的事情就是變化本身。基于網絡的應用中的組件跨越了網絡。比如系統中的一些組件難免的會升級為新組件,系統需要能面對新舊共存的局面等等。可修改性可以做如下更細節的劃分:

  1. 可進化性:指一個組件改變了內部實現而不會對其他組件產生負面影響的程度。
  2. 可擴展性:指可以把一個新功能添加到系統中的能力。動態擴展性則是指將功能添加到一個已部署的系統中,而不會影響到系統中的其他部分。
  3. 可定制型:指臨時性的規定一個架構元素的行為的能力。如果一個組件的客戶端能夠擴展該組件的服務,而不會對其他客戶端產生影響,則該組件就是可定制的。
  4. 可重用性:指一個應用軟件中的組件、連接器和數據元素能夠不做修改的在其他應用重用。

3.5 可見性

可見性指的是一個組件對于其他組件之間的交互進行監視或者進行中間周旋的能力。擁有了可見性之后,就可以通過共享緩存來改善性能、通過分層來改善可伸縮性、通過允許中間件(比如防火墻)對交互做出檢查來改善安全性、通過監視來改善可靠性等。

3.6 可移植性

指的是軟件在不同的環境下運行的能力。比如那些將代碼和代碼處理的數據放在一起移動的架構風格可以獲得此架構屬性,比如虛擬機風格、移動代理風格,以及那些限制只能使用標準格式的數據元素的架構風格。

3.7 可靠性

從應用軟件的角度來看,可靠性是在組件、連接器和數據之間出現部分故障時,一個架構受影響的程度。通過避免單點故障、增加冗余、系統監視等方法來改善可靠性。

4 總結

本篇主要介紹一組如何描述軟件架構的自洽的術語,以及對于基于網絡的應用來說,哪些架構屬性是值得我們關注的。本篇均是筆者自己的一些理解,不免有錯誤之處,歡迎指正。

參考資料

理解本真的REST:http://www.infoq.com/cn/articles/understanding-restful-style/

架構風格與基于網絡的軟件架構設計-導讀:http://www.infoq.com/cn/articles/doctor-fielding-article-review

架構風格與基于網絡的軟件架構設計:http://www.infoq.com/cn/minibooks/web-based-apps-archit-design

Architectural Styles and the Design of Network-based Software Architectures:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394052.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js判斷對象還是數組

1.對于Javascript 1.8.5(ECMAScript 5),變量名字.isArray( )可以實現這個目的 var a[]; var b{}; Array.isArray(a);//true Array.isArray(b)//false 2.如果你只是用typeof來檢查該變量,不論是array還是object,都將返回…

mysql 除去列名打印_sql – 使用beeline時避免在列名中打印表名

在beeline中使用hive時使用簡單的select查詢我想在列名中返回沒有表名的表作為默認值.例數據CREATE TABLE IF NOT EXISTS employee ( eid int, name String,salary String, destination String)COMMENT Employee detailsROW FORMAT DELIMITEDFIELDS TERMINATED BY \tLINES TERM…

移動應用程序和網頁應用程序_如何開發感覺像本機移動應用程序的漸進式Web應用程序...

移動應用程序和網頁應用程序by Samuele Dassatti通過薩穆爾達薩蒂 如何開發感覺像本機移動應用程序的漸進式Web應用程序 (How you can develop Progressive Web Apps that feel like native mobile apps) I’m currently developing a Progressive Web App that will also ser…

leetcode1162. 地圖分析(bfs)

你現在手里有一份大小為 N x N 的「地圖」(網格) grid,上面的每個「區域」(單元格)都用 0 和 1 標記好了。其中 0 代表海洋,1 代表陸地,請你找出一個海洋區域,這個海洋區域到離它最近…

mysql修改root密碼的方法

在 Navicat for MySQL 下面直接執行 SET PASSWORD FOR rootlocalhost PASSWORD(newpass); 就可以 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR rootlocalhost PASSWORD(newpass); 方法2:用mysqladmin mysqladmin -u root …

android 上下偏差怎么寫_詳解 Android 熱更新升級如何突破底層結構差異?

知道了 native 替換方式兼容性問題的原因,我們是否有辦法尋求一種新的方式,不依賴于 ROM 底層方法結構的實現而達到替換效果呢?我們發現,這樣 native 層面替換思路,其實就是替換 ArtMethod 的所有成員。那么&#xff0…

Python3 Flask+nginx+Gunicorn部署(上)

前言:一般在本地運行flask項目通常是直接python3 文件名.py,然后打開:http://127.0.0.1:5000 查看代碼結果 這次主要是記錄flask在python3 環境結合nginx gunicorn在服務器上進行項目的部署 (一)運行環境:虛…

NOIP2011 鋪地毯

題目描述 為了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角坐標系的第一象限)鋪上一些矩形地毯,一共有n張地毯,編號從 1 到n。現在將這些地毯按照編號從小到大的順序平行于坐標軸先后鋪設&…

java lock可重入_Java源碼解析之可重入鎖ReentrantLock

本文基于jdk1.8進行分析。ReentrantLock是一個可重入鎖,在ConcurrentHashMap中使用了ReentrantLock。首先看一下源碼中對ReentrantLock的介紹。如下圖。ReentrantLock是一個可重入的排他鎖,它和synchronized的方法和代碼有著相同的行為和語義&#xff0c…

matlab的qammod函數_基于-MATLAB下的16QAM仿真.doc

1.課程設計目的隨著現代通信技術的發展,特別是移動通信技術高速發展,頻帶利用率問題越來越被人們關注。在頻譜資源非常有限的今天,傳統通信系統的容量已經不能滿足當前用戶的要求。正交幅度調制QAM(Quadrature Amplitude Modulation)以其高頻…

POJ3264 【RMQ基礎題—ST-線段樹】

ST算法Code&#xff1a; //#include<bits/stdc.h> #include<cstdio> #include<math.h> #include<iostream> #include<queue> #include<algorithm> #include<string.h> using namespace std; typedef long long LL;const int N5e410;…

leetcode199. 二叉樹的右視圖(bfs)

給定一棵二叉樹&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。示例:輸入: [1,2,3,null,5,null,4] 輸出: [1, 3, 4] 解釋:1 <---/ \ 2 3 <---\ \5 4 <---解題思…

開發人員工作周報_如何增加找到開發人員工作的機會

開發人員工作周報In a recent job as a senior developer, I helped interview and hire many of my employer’s development team members. This is a brain dump of my advice based on those interviews.在最近擔任高級開發人員的工作中&#xff0c;我幫助面試和雇用了許多…

安全專家教你如何利用Uber系統漏洞無限制的免費乘坐?

本文講的是安全專家教你如何利用Uber系統漏洞無限制的免費乘坐&#xff1f;&#xff0c;近日&#xff0c;根據外媒報道&#xff0c;美國一名安全研究人員發現Uber上存在一處安全漏洞&#xff0c;允許發現這一漏洞的任何用戶在全球范圍內免費享受Uber乘車服務。據悉&#xff0c;…

flume介紹

flume 1.flume是什么 Flume:** Flume是Cloudera提供的一個高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、傳輸、聚合的系統。** Flume僅僅運行在linux環境下** flume.apache.org(Documentation--Flume User Guide) Flume體系結構(Architecture)&#xff1a; …

threadx 信號量 應用_操作系統及ThreadX簡介.ppt

操作系統及ThreadX簡介操作系統及ThreadX簡介 軟件二部 2006.09 主要內容 多任務操作系統概述 ThreadX簡介 關于驅動的交流 操作系統概述 什么是操作系統 管理計算機的所有資源&#xff0c;并為應用程序提供服務的最重要的系統軟件 操作系統的目的 為用戶編程提供簡單的接口&am…

java中同步組件_Java并發編程(自定義同步組件)

并發包結構圖&#xff1a;編寫一個自定義同步組件來加深對同步器的理解業務要求&#xff1a;* 編寫一個自定義同步組件來加深對同步器的理解。* 設計一個同步工具&#xff1a;該工具在同一時刻&#xff0c;只允許至多兩個線程同時訪問&#xff0c;超過兩個線程的* 訪問將被阻塞…

maven學習資料

maven學習資料maven學習教程&#xff1a;What、How、Whyhttp://www.flyne.org/article/167Maven 那點事兒 https://my.oschina.net/huangyong/blog/194583項目管理工具&#xff1a;Maven教程http://www.flyne.org/article/884轉載于:https://www.cnblogs.com/zhao1949/p/634641…

leetcode127. 單詞接龍(bfs)

給定兩個單詞&#xff08;beginWord 和 endWord&#xff09;和一個字典&#xff0c;找到從 beginWord 到 endWord 的最短轉換序列的長度。轉換需遵循如下規則&#xff1a; 每次轉換只能改變一個字母。 轉換過程中的中間單詞必須是字典中的單詞。 說明: 如果不存在這樣的轉換序…

算法之旅 | 快速排序法

HTML5學堂-碼匠&#xff1a;前幾期“算法之旅”跟大家分享了冒泡排序法和選擇排序法&#xff0c;它們都屬于時間復雜度為O(n^2)的“慢”排序。今天跟大家分享多種排序算法里使用較廣泛&#xff0c;速度快的排序算法—— 快速排序法 [ 平均時間復雜度為O (n logn) ]。Tips 1&…