web服務程式設計探索(2)——外掛模型
一、模型圖
該模型是自己摸索出來的一種web服務設計模型,整個圍繞核心業務邏輯處理模組進行。在這個模型中,core業務邏輯處理中心處理負責執行所有邏輯處理流程,該模組所需要的所有副作用操作都以“外掛”的形式從引數中傳入。而所謂的“外掛”,其實就是一些處理副作用讀寫的函式。
二、模組說明
service模組
提供網路服務,根據具體使用的技術,對客戶端來的請求進行路由分發,提取出請求引數,對引數進行解密、格式轉換、驗證,對客戶端進行登入認證等;對要返回給客戶端的資料進行包裝,比如轉換成客戶端所要求的格式、加密、加status-code等。這些操作獨立於業務邏輯之外,是各個請求所通用的,通常可以以中介軟體的形式來實現。
core業務邏輯處理模組
業務邏輯處理模組實現了整個業務流程,在這個模組中,資料來源有兩塊:一是客戶端請求所帶的引數,二是從外掛中獲取的資料;也就是,這個模組會以引數的形式告訴呼叫者,我需要哪些外掛(fn集合),需要哪些其他引數;呼叫者負責提供正確的外掛和引數。示例:
(defn handle
[{:keys [fn-save-db fn-user-info]} username]
(let [user-info (fn-user-info username)]
(fn-save-db use-info)))
這個核心邏輯處理函式告訴呼叫者,我需要兩個外掛:一個儲存資料到資料庫,一個獲取使用者資訊的外掛;需要一個引數——使用者名稱;這些外掛集合,通過一個map結構傳過來。
該模組的輸出就是要返回給客戶端的訊息資料,這些資料還需要service層根據不同使用的網路技術做一些處理。
db-center模組
該模組封裝了後臺所需資料所有資料來源:資料庫、記憶體資料、第三方遠端呼叫、隨機資料、時間資料等,也就是將所有副作用的操作函式封裝了起來。
外掛組裝模組
該模組非常小,就是為每個請求對應的業務邏輯處理函式提供所需的外掛集合。
resp-msg模組
根據客戶端與伺服器訊息協議,組裝對應的訊息體。
三、優點
所有資料都來源於引數
該模型的主要優點是:核心業務邏輯處理模組通過介面引數的方式,明確告知呼叫者:要用這個模組,就需要提供該模組所需要的外掛和資料。呼叫者可以在保證外掛介面不變的基礎之上,根據不同的需要實現外掛。在使用這個模組時,控制權在呼叫者手中。
易於測試
保證核心業務邏輯的正確性和可靠性,是保證系統正確性的核心。測試時,可以用假的資料來實現外掛,使輸入到業務邏輯模組的外掛返回我們指定的值(或執行我們指定的操作),這就相當於測試一個“純函式”:輸入什麼引數,就輸出對應的返回值。如此一來,可以很輕鬆地進行單元測試,保證核心邏輯的正確性。
而在系統實際執行時,就可以傳入用真實資料庫技術實現的外掛了。
副作用的封裝
db-center中封裝了所有副作用操作,包括真實資料庫讀寫,rmi/rpc/http等遠端呼叫,記憶體資料讀寫,隨機數生成,當前時間獲取等;這些資料操作通過統一介面暴露給外部呼叫者。根據不同的使用場景,可以對這些介面進行不同的實現,比如用假資料實現一個local版(記憶體版)的服務(不遠處呼叫資料庫服務以及其他第三方服務等)。
四、缺點
核心業務邏輯處理模組,並不是一個真正的“純函式”,雖然在測試的時候,可以像測試純函式一樣進行單元測試,然而因為模組中在存在寫操作,如fn-sava-db,這些操作會改變一些外部資源。因此這個模組還是不安全的,然而核心業務邏輯理論上講,只需處理邏輯,應該是非常純的一個過程,資料的寫操作並不應該是邏輯過程該乾的活,因此這個模型仍有待改進。
相關推薦
web服務程式設計探索(2)——外掛模型
一、模型圖 該模型是自己摸索出來的一種web服務設計模型,整個圍繞核心業務邏輯處理模組進行。在這個模型中,core業務邏輯處理中心處理負責執行所有邏輯處理流程,該模組所需要的所有副作用操作都以“外掛”的形式從引數中傳入。而所謂的“外掛”,其實就是一些處理副
一套程式碼小程式&Web&Native執行的探索(2)
接上文:一套程式碼小程式&Web&Native執行的探索01,本文都是一些探索性為目的的研究學習,在最終版輸出前,內中的內容可能會有點亂 參考: https://github.com/fastCreator/MVVM https://www.tangshuang.net/3756.html
Web常用對象(2)
pat msd png cookie 過多 max 是否 writer aps 一、Session 1、介紹 HttpSession是一個純粹的接口,session本身就屬於HTTP協議的範疇。 session的作用就是為了標識一次會話,或者說確認一個用
web前端面試總結(2)
10.27 面試總結與分享(清宇網路) 面試問題 自我介紹 nodejs靜態伺服器路由前端使用Nodejs來寫的麼 整個專案實現的思路,都實現了哪些模組 使用nigix代理解決埠問題 對於地圖的使用,有沒有用過地圖自定義的東西 使用vue的時間,
Python菜鳥快樂遊戲程式設計_pygame(2)
Python菜鳥快樂遊戲程式設計_pygame(博主錄製,2K解析度,超高清) https://study.163.com/course/courseMain.htm?courseId=1006188025&share=2&shareId=400000000398149
Spring Cloud Hystrix(服務容錯保護)(2)
1.建立請求命令 Hystrix命令(HystrixCommand)它用來封裝具體的依賴服務呼叫邏輯。 我們可以用繼承的方式實現: public class HelloCommand extends HystrixCommand<String> { privat
Java程式設計思想(2)
第6章 訪問許可權控制 1 訪問許可權控制的等級,從最大許可權到最小許可權依次為:public,protected,包訪問許可權(沒有關鍵字)和private 2 如果想要使用類,可以在import語句中匯入該類或使用該類的全名來指定 // 使用ArrayList的一種方法是使用其全名j
資料探索(2)資料特徵分析
資料特徵分析 分佈分析 1.定量資料的分佈分析 對於定量變數而言,選擇組數和組寬是做頻率分佈分析時最主要的問題,一般按照以下步驟進行。 1)求極差 2)決定組距和組數 3)決定分店 4)列出頻率分佈表 5)繪製頻率分佈直方圖 遵循以下原則: 1)各組之間必須相互排斥 2)各組
大資料ETL實踐探索(2)---- python 與aws 互動
文章大綱 本文主要使用python基於oracle和aws 相關元件進行一些基本的資料匯入匯出實戰,oracle使用資料泵impdp進行匯入操作,aws使用awscli進行上傳下載操作。本地檔案上傳至aws es,spark dataframe錄
DSL 系列(2) - 外掛的論述與實現
前言 本文主要探討基於 DSL(domain specific language) 之上的外掛設計,他們是領域的附屬,為領域提供額外的服務,但領域不依賴於他們。 1. 論述 領域應當儘可能地去專注他的核心業務規則,應當儘可能地與其他輔助性的程式碼解耦,一些通用的功能可以耦合進框架或者設計為中介軟體;但
python高階(一)——網路程式設計Socket(2)檔案下載案例
1、伺服器 import socket def send_file_2_client(new_client_socket, client_addr): # 1 接收客戶端,需要下載的檔名 # 接收客戶端傳送來的請求 file_name = new_client_soc
C++ 非同步程式設計探索(二) thread safe
前言 在非同步程式設計實踐中,曾經遇到的最大的問題就是thread safe 問題。 我所在的團隊是Database團隊,主要是為APP提供和redis互動的API。場景就是application thread呼叫我們的API。我們有個worker thread
經典邏輯程式設計題(2)
判斷101-200之間有多少個素數,並輸出所有素數。 public class sushu { //宣告靜態全域性變數 private static int s =0; public static void main(String[] a
linux自有服務指令圖文(2)
Linux自有服務(2) 一 設定主機名 回顧: #hostname #hostname –f FQDN(全限定域名) 臨時設定主機
C++ 非同步程式設計探索(一) task鏈式排程 -- future CONTINUATION
同步Vs非同步程式設計, 一直是大家討論的熱點。 同步程式設計以其邏輯簡單,受到了一些對時間不敏感的程式青睞,而非同步程式設計以其高效深受處女座程式設計師喜愛。 作為一隻處女座程式猿,當然要非同步非同步非同步。。。 說到非同步, C++11之前, 用的最多的就是
淺談服務埋點(2)——Metrics
還是那個話題:為什麼要做服務埋點? 就像我們作業系統裡面的資源管理器一樣,如果能夠實時或者準實時的看到整個系統耗費的CPU,記憶體等資源,對我們快速對系統做出響應,以及優化很重要。同樣,對於對外提供介面或者服務的WebService的監控,比如在哪個地方,
【CUDA並行程式設計系列(2)】CUDA簡介及CUDA初步程式設計
前言 CUDA並行程式設計系列是本人在學習CUDA時整理的資料,內容大都來源於對《CUDA並行程式設計:GPU程式設計指南》、《GPU高效能程式設計CUDA實戰》和CUDA Toolkit Documentation的整理。通過本系列整體介紹CUDA並行程式設
CUDA程式設計-(2)其實寫個矩陣相乘並不是那麼難
程式程式碼及圖解析:123456789101112131415161718#include <iostream>#include "book.h"__global__ void add( int a, int b, int *c ) { *c = a + b
ROS:關於tf的探索(2)Writing a tf listener(Python)
在前面的教程中,我們創造了一個broadcaster去釋出烏龜的座標給tf,在本節中,將建立一個listener來使用tf。 1.如何建立一個listener 首先建立資原始檔,切換到包目錄下 roscd learning_tf 1.1程式碼
Docker 1.12新功能探索(2):新增重大特性
Docker版本的1.12,仔細看來確實有了不少的變化,作為一個小版本號的升級能有如此之多的功能更新可能確實會讓不少追隨者喜出望外。1.12就能如此了,讓人不由得好奇docker到2.0的時候