中小研發團隊架構實踐之總體架構

来源:https://www.cnblogs.com/dotnet-arch-system/archive/2018/01/08/8232879.html
-Advertisement-
Play Games

企業總體架構是什麼,有什麼用,具體怎麼做呢?以我曾任職的公司為案例,一起來探討這個問題。這家公司當時有200位研發人員和200多台伺服器,我剛進這家公司時,他們的系統就已經玩不下去了,總是出現各種問題,例如日常發佈系統時或訪問量稍微過大時,系統就會出現很多故障,而且找不到故障發生的根本原因。我進公司 ...


       企業總體架構是什麼,有什麼用,具體怎麼做呢?以我曾任職的公司為案例,一起來探討這個問題。這家公司當時有200位研發人員和200多台伺服器,我剛進這家公司時,他們的系統就已經玩不下去了,總是出現各種問題,例如日常發佈系統時或訪問量稍微過大時,系統就會出現很多故障,而且找不到故障發生的根本原因。我進公司後主要任務就是對這個系統進行升級改造,花了一個半月的時間寫了那份企業總體架構文檔,文檔共有124頁,直接指導了之後的技術改造,下圖是那份文檔的目錄。

一、企業商務模型

       企業商務模型的內容主要包括主營業務、商務模式、商務主體、競品分析、組織架構、商務運作模型和業務流程等。        主營業務即公司做什麽業務,商業模式即公司怎麼賺錢,商務主體即哪幾個人在一起做這門生意,競品分析即瞭解競爭對手的情況,組織架構即公司部門是怎麼劃分的。組織架構圖中標出人數,根據系統與業務之間對應關係,可以瞭解系統中哪些模塊使用頻率高,以及業務其對應模塊的複雜度商務運作模型即公司是如何運作的,售前做計劃,找供應商把東西買進來後,經過服務和結算,再賣給我們的經銷商採購商,使我們獲得利潤售後進行大數據分析最後又指導著我們的售前整個過程形成良性迴圈。可以把一家公司想象成一臺機器,輸進去的是錢,轉一轉後,又能夠生出更多的錢出來。 最後是業務流程和附檔資料,業務流程包括預訂流程訂單處理流程產品供應流程、財務結算流程、賬戶管理流程企業商務模型的建立,指導著整個應用系統模型的建立,它是整個應用系統建設的基礎和前提,畢竟應用系統是為業務服務的。

二、架構現狀

架構現狀的內容主要包括:功能架構、應用架構、數據設計和物理架構。

2.1、功能架構

     功能架構主要包括功能、角色和許可權三部分。功能是企業服務,用戶使用的每一個功能,就是企業的每一個服務。角色是用戶操作的歸類,功能與角色的對應關係即許可權。瞭解系統架構的現狀,從功能架構開始。

2.2、應用架構

      應用就是處理器,應用架構的內容包括現有架構圖、Web應用現狀、作業小應用(Job)現狀和介面架構。其中,介面是應用層面的關鍵,它是一個程式與另外一個程式交互的部分。         應用架構圖表列出了哪些業務邏輯沒有被重用,換句話說業務邏輯被多少個應用調用,就需要被重覆開發多少次,一旦改了一個地方,就要同時改多個地方,導致系統開發效率非常低下。各業務邏輯如預訂邏輯,雖然被多個應用調用,但它們與應用是沒有關係的,業務邏輯可以獨立的存在,也可以寄宿於多個應用。業務邏輯是一個業務操作的抽象,而業務應用與業務部門共同完成了業務操作。

2.3、數據設計

       100多個資料庫,一萬多張表,能否使用一張E-R圖來表示呢?它是可以的。數據設計依賴於企業的數據,而不是資料庫的設計,對企業數據適當做歸類,會直接導致數據設計,最終畫出E-R圖,數據設計完成後,資料庫設計就自然而然出來了。越庫、超越表去看這張E-R圖,可以看出它包括產品、訂單、結算、用戶、基礎設施這五類數據。低層的E-R圖可以變,但是高層的E-R圖一般不會變,因為它是根據你的業務模型而定,業務模型穩定,高層E-R圖也是穩定的。資料庫只要早期設計得好,是可以做到易伸縮、易拆分的。下圖從內往外看,一個框可以是一個庫,也可以是一個模塊,還可以是一個表。在業務發展的早期它可以是一個庫,裡面有5個模塊,中期可以分為5個庫,後期以更低級別可以分為更多的庫,這與業務階段及系統複雜度相關。在數據設計完成後,資料庫設計也就很容易規劃和調整。        以上是資料庫、數據表之間靜態關係,接下來我們介紹數據的流轉狀態圖。通過數據狀態圖去瞭解現有數據流轉變遷,如國內訂單狀態變遷圖,這種圖的價值不僅在於資料庫層,還在於服務化。圖中的從等待支付到支付成功,中間有個支付行為,通過這個支付行為把數據狀態變更為支付成功,否則繼續等待,直到超時關閉訂單。這個支付行為可以做成一個微服務,然後由不同的應用去調用。

2.4、物理架構

       物理架構的內容主要包括IDC機房、機房之間訪問關係、機房內伺服器物理部署圖、機房與業務分佈、網站架構、資料庫架構、集群清單和功能變數名稱清單。將這些內容以列表和圖形方整理出來,會很容易瞭解和發現問題,只有發現問題才能解決問題,特別是在全局體系架構方面是表和圖的價值所在。當時這家公司共有5個地區、8個機房,雖然只有200多台伺服器,但分佈很散,導致物理結構複雜,通訊也很複雜。技改前故障不斷,其主要的一個原因就是物理架構不合理,運維要占60%、70%的責任,當時卻把責任歸咎為應用架構,這是個錯誤的方向。物理架構的不合理,應用架構是很難合理的,因為物理架構是我們的基礎設施,位於最底層,下層為上層服務,運維要為應用服務,應用要為業務服務,業務要為客人服務。

三、領域模型

       領域模型關註概念,關註職責、關註邊界、關註交互,只有先確定職責和邊界,交互才會很清晰。領域模型是針對現有問題域提出一個系統解決方案,然後在圖表上建立完整的模型,如同用AutoCAD畫的施工圖紙一樣。領域模型屬於概要設計階段,對於單個應用架構設計,首先需要瞭解業務和功能需求、用例圖、用例活動圖,然後才是領域模型。業務流程圖是對業務操作的抽象,領域圖是對業務邏輯代碼的抽象。        建立領域辭彙是建立領域模型的第一步,它能統一辭彙明確概念,以減少一詞多義、一義多詞的情況。概念一旦確定,再擴展屬性和行為,然後把它當作一個單元與其它事物構建在一起,就會很容易形成模型,領域模型與企業商務模型中的業務流程圖有參考對應關係。領域模型在實現時可大可小,在業務的早期,在系統比較小的情況下,它有可能是一個類。當系統做大了以後,它可能是個DLL庫。再做更大一點的時候,它可能是一個服務,給不同的應用去調用。每一個方法都有成為服務的潛質,特別是在系統中後期。領域模型是業務邏輯代碼的施工圖紙,它不僅有利於對現在系統業務邏輯的瞭解,同時也指導未來的架構改造。

四、架構規劃

       當我們瞭解了業務、瞭解了架構的現狀,發現現有架構的問題,接下來就可以做中遠期架構規劃,以及架構的調整和具體實施。架構規劃內容包括:頂層架構規劃、網站功能規劃、應用規劃、SOA規劃、分層架構規劃、資料庫規劃和物理規劃等。

4.1、頂層架構規劃

       上圖是頂層架構的俯視圖和側視圖。第一張圖是俯視圖坐在飛機上看,整個頂層架構最外層的是功能,中間的是業務操作,內層的是數據。功能對應業務系統的用戶界面,操作對應業務系統里的服務,數據對應業務系統的數據存儲如資料庫。第二張圖是剖面圖切一刀來看,上層是應用,中層是服務和框架,下層是基礎設施數據中心。從圖中的服務層可以看出,服務的歸類跟業務流程的歸類有很大關係。

4.2、網站功能規劃

       網站功能規劃就是功能重新劃分,對照著架構現狀,未來的功能應該如何調整?如案例中的國內網站功能規劃,分別畫出了全局功能圖、採購商功能圖、平臺商功能圖和供應商功能圖。其實在做網站功能規劃的時候,更多需要考慮現狀,而不是未來調整的部分如果沒有很大問題,不做調整,尊重歷史因為有些東西(如名稱用戶已經使用很久了調整往往比較難,合理大於準確

4.3、應用規劃

       系統是什麼,系統=元素+關係應用架構是什麼?應用架構=應用+架構。應用就是系統的最小單元,應用分類和應用編號則構成了應用關係即應用的架構如上圖中的案例,應用分類建了框架FX和公共業務系統CBS,在原有的200多個應用中並沒有這兩個產品線,而是分佈在了不同的業務線中,從而導致重覆建設。應用編號是給每個應用分配一個六位的數字ID,就如同我們的身份證一樣,頭兩位表示產品線,中間兩位表示子系統,最後兩位表示應用,如100206。應用編號是應用管理、依賴和追蹤的基礎,集中式日誌和監控框架都有使用到應用編號。

4.4、SOA規劃

        SOA規劃就是介面規劃,它的歸類與商務模型中的業務流程有參考對應關係。上圖案例有五個服務中心:預訂服務、訂單處理服務、產品供應服務、財務結算服務和公共服務。每個服務只需要實現一套自己的邏輯,我們的前臺、後臺、介面、作業小應用等都可以調用,服務的邏輯跟我們的業務邏輯是一致的,修改代碼的時候只需要改一個地方就可以影響到所有調用到這服務的前端應用

4.5、分層架構

       分層架構看似很簡單,但保證整個研發中心都使用統一的分層架構就不容易了。那麼如何保證整個研發中心都使用統一的分層架構呢,以達到提高編寫代碼效率、保證工程統一性的目的?先簡單介紹下當前兩種比較流行的分層架構體系,一種是領域架構:倉儲層Repository Layer、領域層Domain Layer、應用服務層Application Layer、表現層Presentation Layer和基礎公共層Infrastructure Layer,請見第一張圖;另一種是相對傳統地分為三層:數據層Data Layer、應用邏輯層Business Layer和表現層Presentation Layer,請見第二張圖。   領域架構和三層架構之間有什麼區別?我們是這樣認為的,在早期我們做三層架構的時候,大都以表來做驅動的,在做領域架構的時候,大都以業務邏輯來驅動的,兩者的區別確實比較明顯,但到了現在,如果都以業務邏輯為中心的話,實際上兩者並沒有本質區別。當時,我所在公司採用了第二種分層法我們希望把分層做得極簡,也就是說哪怕剛畢業進來員工,在分層時基本上也不會亂。而相對第一種分層法,第二種分層法簡單很多。每一個應用的代碼量都不應該很大一旦工程變得過大,我們就會把它適當拆分,而不是全部放在一個單塊應用里。總之,我認為分層越簡單,整個軟體結構就越清晰,代碼就越容易統一。把工程做得極簡,才有利於複製,有利於業務的快速構建,有利於規模化穩定可靠

4.6、資料庫規劃

       資料庫是整個信息系統中生命周期最長、最難修改的部分,所以要加強規劃資料庫的設計至少要提前兩步,具體根據高層E-R圖和數據設計來新建資料庫,早建要比晚建好。資料庫調整的代價大、周期長,長時間產生的問題,需要長時間來解決,先在新庫里解決新表,再根據當前業務和應用的需求,逐步調整舊表。

4.7、物理規劃

物理架構的規劃內容包括集群規劃和功能變數名稱規劃。首先是集群規劃。20 倍規劃、5 倍設計和 1.5 倍實施:規劃和設計要大一些,但實施時小一些,這樣不僅便於將來的擴展,也節省了當前的費用;兩個邏輯網路:一個內網和一個外網,兩個負載均衡,兩個防火牆,安全隔離內外網;四條產品線:國際、國內、新業務以及公共業務,單點登錄和企業支付網關等公共業務也屬於一條產品線;六個集群:Web 集群、SOA 集群、中間件集群、資料庫集群、Job 集群和 ITD 集群。以上橫向集群與縱向產品線形成了一個矩陣結構,也基本確定了網路基礎架構。對於功能變數名稱規劃。對內的功能變數名稱該改的改,該停用的停用,該合併的合併。對外的功能變數名稱要儘量少改,要改的話也要有歷史繼承性(如跳轉),要儘量減小對用戶的影響。

4.8、其它

      除以上架構規劃外,還有一些其它重要項,如源代碼管理規劃、文檔管理規劃、技術選型和團隊分工。為什麼還要做這些呢?因為統一了源代碼怎麼放、每個部門的文檔怎麼放、將來要用什麼工具版本,利於團隊的協作,基於統一的環境才能有更高層次地提升。對於團隊分工,需要逐步對齊組織架構與系統的架構規劃。對於技術選型,需要註意中間件的引進,要有節奏性,力量要相對集中,要小規模試點找非核心項目,試用成功後再進行大規模推廣

五、架構實施

      做完架構規劃後,就是架構實施落地了。我們的架構實施整體思路是:樹目標、給地圖、立榜樣、抓重點、造文化、建制度、整環境、組建架構部。架構部內招幾名老程式員,外招幾個架構師。內部走出去,提高眼界。外部牛人請進來,落地瞭解歷史和業務。技術建議是:SOA服務化、基礎設施平臺化、公共業務服務化、加強項目概要設計。當研發團隊達到200多人、有了幾百個應用,且在故障不斷的情況下,不能與以前一樣沒有設計就開始編碼,而是做加強項目概要設計及評審。後面的補與前面的防,兩手都要抓,兩手都要硬。具體計劃是:Roadmap分步實施,改造一期、改造二期、改造三期,近細遠粗、實事求是、逐步細化、逐步完善。不斷立技術改造項目,不斷將技改與業務研發項目相結合,技改即是工單、工單即是技改。避免對業務過多地影響,並不斷有業務價值輸出,這是架構改造得以持續實施的關鍵!                以上簡單地介紹了總體架構的編寫方法,我們的編寫思路是先瞭解業務,建立企業商務模型,主要包括靜態的商務主體、組織架構和動態的商務運作模型和業務流程。再瞭解架構現狀,建立現有信息系統模型,主要包括功能架構、應用架構、數據設計和物理架構。一個是商務,一個是電子,兩者即是整個公司的電子商務系統然後在企業商務模型和現有系統模型之上建立領域模型領域模型它相對穩定直接指導著接下來的架構規劃最後一定要落地即架構實施。附檔是去掉敏感信息後的真實案例,它的價值如下:
  • Big Picture,全局藍圖,起到方向性和指導性。
  • 將隱性知識顯性化,方便傳達、廣而告之。
  • 對於新員工的價值,快速入門。
  • 對於老員工的價值,瞭解全局,過程梳理,然後專註於自己的部分。
        關於企業總體架構,你可以參考標準TOGAF(開放組體繫結構框架)。其實,我們是在完成那份文檔後才知道TOGAF,它們之間有很多相似之處和不同之處。TOGAF的內容主要包括業務架構、應用架構、數據架構和技術架構,而我們當時只是解決公司系統架構問題為導向以時間為主線,內容有企業商務模型、架構現狀、領域模型、架構規劃和架構實施。方法論很重要,但看到事物本身的特點,深入問題以及找到解決辦法更為重要歡迎點贊  

案例參考

https://github.com/das2017/TopArchDemo
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說起css佈局,那麼一定得聊聊盒模型,清除浮動,position,display什麼的,但本篇本不是講這些基礎知識的,而是給出各種佈局的解決方案。 水平居中佈局 首先我們來看看水平居中 1.margin + 定寬 相必是個前端都見過,這定寬的水平居中,我們還可以用下麵這種來實現不定寬的 2. tab ...
  • 1. Object類型 創建對象的方式 1) 構造函數方式 var obj = new Object(); // Object為構造函數 2)字面量方式 var obj = {} 2. Array類型 ECMAscript數組的每一項可以保存任何類型的數據 創建數組的方式 1)var color = ...
  • React Learn Note 3 React學習筆記(三) 標簽(空格分隔): React JavaScript 二、元素渲染 元素是構成react應用的最小單位。 元素是普通的對象。 元素是構成組件的一個部分。 1. 將元素渲染到DOM中 ``中的所有內容都將由React DOM來管理。稱為“ ...
  • 恢復內容開始 js介紹 最近學習了js,那麼我今天給大家介紹下js。希望對初學者有些幫助。 js就是常說的JavaScript。JavaScript是目前世界上最流行的編程語言之一。這門語言可用於HTML和WEB,更可以廣泛的用於伺服器、PC、筆記本電腦、平板電腦和智能手機等設備。JavaScrip ...
  • tween.js 英文使用指南 首先來看個例子: hello,tween.js 補間(動畫)(來自 in between)是一個概念,允許你以平滑的方式更改對象的屬性。你只需告訴它哪些屬性要更改,當補間結束運行時它們應該具有哪些最終值,以及這需要多長時間,補間引擎將負責計算從起始點到結束點的值。 例 ...
  • 居中是我們使用css來佈局時常遇到的情況。使用css來進行居中時,有時一個屬性就能搞定,有時則需要一定的技巧才能相容到所有瀏覽器,本文就居中的一些常用方法做個簡單的介紹。 註:本文所講方法除了特別說明外,都是相容IE6+、谷歌、火狐等主流瀏覽器的。 先來說幾種簡單的、人畜無害的居中方法 1. 把ma ...
  • 在網頁上,特別是個人博客中經常會用到時鐘插件,一款個性化的時鐘插件不僅可以讓頁面顯得美觀,而且可以讓訪客看到當前的日期和時間。今天我們給大家收集了15個超強悍的圓盤時鐘動畫,很多都是基於CSS3,也有一部分利用jQuery和SVG,讓我們一起來看看吧。 1、純CSS3/SVG實現的帶秒針表盤圓盤復古 ...
  • js基礎查漏補缺: 1. NaN != NaN; 複製數組可以用slice; 數組的sort、reverse等方法都會改變自身; Map是一組鍵值對的結構,Set是key的集合; Array、Map、Set都屬於iterable類型,可用for...of遍歷; 2. rest參數只能寫在最後,前面用 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...