初見微服務之RESTful API

来源:http://www.cnblogs.com/willsuna/archive/2016/04/24/5426648.html
-Advertisement-
Play Games

1. REST名稱由來 REST全稱為Representational State Transfer,即表述性狀態轉移,最早由Roy Feilding博士在世紀之交(2000年)提出,喜歡追根溯源的朋友可以讀一下他的博士論文《Architectural Styles and the Design o ...


1. REST名稱由來

    REST全稱為Representational State Transfer,即表述性狀態轉移,最早由Roy Feilding博士在世紀之交(2000年)提出,喜歡追根溯源的朋友可以讀一下他的博士論文《Architectural Styles and the Design of Network-based Software Architectures》,這時距HTTP1.1協議標準正式發佈(1999年6月)僅一年的時間。

    歲月的痕跡跨越了十多年,技術的進步日新月異,所有的人都在談論著應用容器化、服務解耦、DevOps開發運維文化等等。我們變得喜新厭舊,技術成了快餐,框架是越來越多的舶來品。此時,我們是否應該靜一靜,看看技術的起源,想想我們如何成為軟體的設計師,而不是代碼的奴隸、資本的工具?REST作為歷史的寶藏,被越來越多的人挖掘、歸納、推陳出新,近幾年占領了幾乎所有的大型互聯網公司的開放API,國外如google(https://developers.google.com/apis-explorer)、facebook,國內的有豆瓣、騰訊的公眾平臺等。

    在這裡,我要替SOAP說幾句話,技術的進步始終是從無到有,由繁入簡的。在一定的時間里SOAP滿足了web服務的設計要求,達到了對外提供服務的目的,儘管十分的(協議)晦澀、(解析)生硬。企業級的軟體依然有很多保留著SOAP式的服務,我工作過程中對接的一些政府如衛生計劃委員會、醫療HIS系統其實依然是保有SOAP的,它活在電腦構建的這一社會的血液里、空氣里。

2. 什麼是REST?

    需要註意的是REST並不是一個標準或者協議,而是一種設計風格,或者說是一個設計web服務的最佳實踐,其要點如下:

    1) 面向資源的URI設計,如user/register;

    2) 對資源的操作包括增、刪、改、查(和資料庫層的操作極為相似);

    3) 連接具有無狀態性,即每一次的響應只依賴於這一次的請求;

    4) 利用HTTP協議實現以上的設計思想。

    非RESTful的設計示意圖如下:

    image

    RESTful的設計示意圖如下:

    image

3. REST設計

    REST的設計利用了HTTP協議的請求option,如GET、POST、PUT、DELETE。設計的簡單示意圖如下:

    REST設計

    我工作過程中的一些最佳實踐是:

    1) 對option的選擇不應過多,不應死板教條,常用的有GET、POST即可;

    2) URI的設計應已名詞為主、動詞為輔,層次清晰;

    3) 參數的設計應已單詞為主,少用多個詞的駝峰連接形式;

    4) 功能與URI或者參數設計衝突時,應以功能實現為主。

4. REST的劣勢

    a. 一千個讀者,一千個哈姆雷特,在設計評審粗糙的情況下,面向資源的URI設計五花八門;

    b. URI泛濫,版本管理困難;

    c. HTTP option使用不當;

    d. REST API 參數、返回值設計不當;

    ……

5. 微服務為什麼選擇REST?

      隨著組件拆分、服務解耦,各組件之間的調用均是通過介面實現,REST可以讓這些拆分後的服務風格統一、便於維護和管理,目前我所參與設計和開發的系統存在100+的服務介面,如果不統一風格、調用方式,想必將是一場災難。服務層次化的前提是組件的拆分,如用戶組件URI首碼需要以 /user 開頭,配置系統的首碼需要以 /configuration開頭,用程式自動對首碼校驗。

    RESTful API的入參、出參,均已Java Bean的形式提現,稱之為介面協議。業務介面協議可以繼承用戶組件協議,各業務介面協議之間不可以繼承和聚合,這些規則的設定,用冗餘的思想達到解耦的目的。

    當然微服務從來不是銀彈,REST也不是救世主,這是一個發現問題、解決問題的過程,從來沒有最完美的,只有最合適的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單 ...
  • 一.意圖 將一個複雜對象的構建與它的表示分離,使得同樣的構造過程可以創建不同的表示。 二.動機 一個複雜的對象的構造過程中,原料相同,可能會要求生產不同的產品,並且生產的產品種類還能夠方便的增加。Bulider模式期望將解析原材料的過程與利用原材料生產產品的過程分離開,以達到用戶不需要知道根據原材料 ...
  • 兩年前接觸到了微服務的概念,面對日益膨脹的系統感覺豁然開朗。之後的兩年逐步把系統按微服務的架構理念進行了重構,並將業務遷移到了新架構之上。感覺現在差不多是時候寫一篇關於微服務的總結文章了。 定義 在 Martin Fowler & James Lewis 的文章(參考[1])里給出了微服務架構的一個 ...
  • 本文由@呆代待殆原創,轉載請註明出處。 單例模式簡述 單例模式保證了我們的類只有一個實例,並且我們在任何時候都可以取得這個實例,其中保證我們的類有且僅有一個實例在某些時候是相當重要的事情,比如我們只需要一個線程池而不是兩個等等,但是我們也要註意,單例模式適用的情況比我們想象中的要少,所以請不要濫用這 ...
  • 基本簡介 frontpage網頁設計軟體是微軟公司出品的一款網站製作入門級軟體。frontpage製作網站軟體使用方便簡單,會用Word就能做網頁,微軟在2006年年底前將停止提供FrontPage軟體。Microsoft SharePoint frontpage 2003套件可與 Microsof ...
  • 1.想要在自己的設備上運行Android,必須為自己的設備開發特定軟體,這個為特定設備定製Android的過程被稱為“移植”。 2.Android的系統構架分為:最底層Linux內核,和其他Linux系統的差異很小;再上一層是C/C++代碼庫;再上一層是Android SDK API,這一層是用ja ...
  • 客戶端與伺服器新建套接字連接的一種方法 背景   最近在做一個C/S文件管理系統,想要把客戶端命令跟文件的傳輸分開進行,這就要求我們重新在客戶端與伺服器之間建立一個新的套接字連接。 問題   首先我們知道C/S伺服器每接到一個客戶的鏈接請求後,都將建立一個新的 ...
  • 之前我(夢在旅途)發表過一篇名為《深入分析面向對象中的對象概念》的文章,裡面主要講解了類與對象的關係以及對象的概念、狀態、行為、角色幾個知識點,讓大家對對象有了一些深入的瞭解,而本文則再來談談面向對象的三大特性之一:封裝,封裝是實現面向對象的基礎,深入的理解封裝的特性,有利於我們能更好的領悟面向對象 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...