隨筆聊架構

来源:https://www.cnblogs.com/lfs2640666960/archive/2018/03/06/8515649.html
-Advertisement-
Play Games

一、架構的定義 所謂一千個架構師中有一千種“最好的架構”模式。 “架構”是我們這行業種一個很常見的詞,表明其必然也是經歷了很長的歲月打磨所形成的一個詞。架構的這個詞出現的意義是什麼?為瞭解決什麼問題?只有把這2個問題想明白了,才能設計出一個良好的項目架構。 我認為 架構類似於畫房屋設計圖,在剛開始我 ...


一、架構的定義

所謂一千個架構師中有一千種“最好的架構”模式。

“架構”是我們這行業種一個很常見的詞,表明其必然也是經歷了很長的歲月打磨所形成的一個詞。架構的這個詞出現的意義是什麼?為瞭解決什麼問題?只有把這2個問題想明白了,才能設計出一個良好的項目架構。

我認為 架構類似於畫房屋設計圖,在剛開始我們蓋一層樓的小房子的時候,拍拍腦門想一下,腦子裡有個大概的樣子就開始動工了,想怎麼蓋就怎麼蓋,大部分情況下也都不會出現。但是當你要蓋一個大樓,這時候拍拍腦門的方式雖然有可能還能管用,但是由於沒有經過深思熟慮的多方考量,建造出來的必然是問題重重。另外建造大樓和蓋個一層樓的小屋所需的團隊規模肯定是不同的,每個人心中的標準不同,如果沒有一個統一的規範,最後的結果可想而知。所以架構就是定規則做限制,是在權衡各方得與失之後的一個“最合理決策”,由它來指導團隊中的每個人思想層面上的一致,使得最終的產品達到像由一個人做出來的一樣。另外還有控制複雜度、提高團隊協作力、降低成本等等作用。

在軟體開發中,架構的意義不單單是為了讓團隊達成一致,因為我們工作的本質是為了做出更好的支撐業務發展需要的軟體產品,所以架構也是基於業務的架構。我認為一個好的架構能夠提前預見業務發展1~2年為宜。這樣可以付出較為合理的代價換來真正達到技術引領業務成長的效果。我相信大部分在中小型公司呆過的人應該都經歷過被業務推著走的時代,每天焦頭爛額的這裡卡了,這裡掛了,這裡報錯等等問題。當我們遇到這些問題的時候是時候花成本來考量當前的架構是否存在問題?

二、如何開始設計一個架構

做架構的最重要的一點就是上面說的貼合業務,任何不基於業務做異想天開的架構都是耍流氓~

架構不是像平常寫代碼一樣,對就是對,錯就是錯,它並無對錯之分,是一個取捨的過程。當我們從0開始做架構的時候,的確是比較困難。雖然萬事開頭難,但是一個好的開始相當於成功了一半,會給我們接下去的工作打下結實的基礎。

下麵來闡述一下筆者個人是如何從頭開始做一個架構的,供大家參考學習:

1.架構是一個整體--> 部分的過程,先得明確整個公司/組織對外提供的服務是什麼?這是最上層的戰略架構,這個基本是一旦確定就很難甚至無法更改了。

2.給每個部分(比如SOA的某個服務)劃分解決方案。比如根據公司的組織架構或者產品等。

3.找到每個解決方案的核心功能和支撐功能。並形成一個業務總覽圖

4.分久必合,合久必分,結合當前的實際資源情況做出最終的決策,這是整個過程中最耗時的點,它決定著架構的複雜度和開發成本。方式上包括但不限於抽出可重用的功能、功能的組合、拆分粒度更細的功能提高可重用性等等。這一切的決策都要以“恰到好處”為宜。千萬不要盲目的跟從微服務之風!千萬不要盲目的跟從微服務之風!千萬不要盲目的跟從微服務之風!重要的事情說3遍。服務粒度越細,調用鏈路越複雜,帶來的開發成本是否適合團隊,是作為一個架構師需要著重考量的點。

5.確立每個功能塊之間的協作方式,包括但不限於通訊方式,通訊協議,依賴關係等。

6.最後要把這些形成最終的架構總覽圖,這樣能夠幫助站在一個更高的角度去考慮架構的演變問題。如果是針對現存項目重新做架構,那麼需要把現有項目架構梳理出來,作為我們上面思考過程中的一部分參考信息。

三、一個好架構的特點

首先從心態上必須要有工匠精神,因為軟體架構和造房子還是有不同的,它不是一開始就一步到位的,好的設計肯定需要經過反覆的修改,從簡單到複雜的迴圈驗證,不斷的打磨。

方向上我認為分以下幾個點:

1.文檔化:不管是整體還是部分的整個生命周期內都必須做好文檔化,變動的來源包括但不限於BUG,需求。

2.高可用:要儘可能的提高軟體的可用性,我想每個操作人都不願意看到自己的工作無法正常進行。黑盒白盒測試、單元測試、自動化測試、故障註入測試、提高測試覆蓋率等方式來一步一步推進。

3.安全:組織的運作過程中產生的數據都是具有商業價值的,保證數據的安全也是刻不容緩的一部分。以免出現XX門之類醜聞。加密、https等為普遍手段

4.可擴展:軟體的設計秉承著低耦合的理念去做,註意在合理的地方抽象。方便功能更改、新增和運用技術的迭代,並且支持在適時對架構做出重構。

5.快速迭代:擁抱變化,占領戰略先機。

6.高度自治:為了更好支撐第4點和第5點的,每個功能能夠高度自治帶來的好處是可以快速迭代,並且不管是功能迭代還是技術迭代所對整個系統的影響降到最小。

7.高復用:為了避免重覆勞動,為了降低成本,我們希望能夠重用之前的代碼、之前的設計。這點對於架構環境的依賴是最大的。

8.可驗證:一個好的框架需要考慮到各種特殊情況,並且是可以進行專項驗證的。

四、做架構中的誤區

做任何事的時候需要不斷的跳出原來的思維角度重新審視,這樣才能避免陷入泥潭。列出幾個我能想到的誤區:

誤區1——架構專門由架構師來做,業務開發人員無需關註:架構的再好,最終還是需要代碼來落地,並且組織越大這個落地的難度越大。不單單是系統架構,每個解決方案每個項目也由自己的架構,如分層、設計模式等。如果每一塊磚瓦不夠堅固,那麼整個系統還是會由崩塌的風險。所謂“千里之堤,潰於蟻穴”。

誤區2——架構師確定了架構藍圖之後任務就結束了:架構不是“空中樓閣”,最終還是要落地的,但是架構師完全不去深入到第一線怎麼知道“地”在哪?怎麼才能落的穩穩噹噹。

誤區3——不做出完美的架構設計不開工:世上沒有最好架構,只有最合適的架構。我們需要的不是一下子造出一輛汽車,而是從單輪車 --> 自行車 --> 摩托車,最後再到汽車。想象一下2年後才能造出的產品,當初市場還存在嗎?

五、針對架構的建議

架構就是培養自己的全局觀意識,你的知識面必須要寬,包括存儲,操作系統,虛擬化,IO,資料庫,中間件,應用,部署,備份,測試,呼叫中心等,你可以不深入多個模塊,但是你一定要瞭解比別人更多的信息量,這樣以後整個系統的架構就很有幫助。我特意整理了一下,裡面的關鍵不是靠幾句話就能講清楚,所以乾脆找朋友錄製了一些視頻,很多問題其實答案很簡單,但是背後的思考和邏輯不簡單,要做到知其然還要知其所以然。如果想深入瞭解Java工程化、高性能及分散式、深入淺出。性能調優、Spring,MyBatis,Netty源碼分析的朋友可以先點一波關註私聊我,我給你學習資源。

六、結語

架構之路任重而道遠。程式設計和架構設計是互通的,每個人都可以從設計好一個程式往設計好一個系統架構前進。如果現在還無從下手的,我推薦大家可以從領域驅動設計這個概念入手,這是由業務為導向的設計方式,可以對培養設計出落地的架構有很大的幫助。最後引用“俞軍”一句名言,我們作為架構師要有“懷疑精神:自我迭代”的心。

註:喜歡的小伙伴可以點贊關註走一波,一起學習進步


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

-Advertisement-
Play Games
更多相關文章
  • 1、原型鏈繼承 核心: 將父類的實例作為子類的原型 缺點: 父類新增原型方法/原型屬性,子類都能訪問到,父類一變其它的都變了 2、構造繼承 核心:使用父類的構造函數來增強子類實例,等於是複製父類的實例屬性給子類(沒用到原型) 缺點: 方法都在構造函數中定義, 只能繼承父類的實例屬性和方法,不能繼承原 ...
  • 參考書《ECMAScript 6入門》http://es6.ruanyifeng.com/字元串的擴展ES6之前只能識別\u0000 - \uFFFF 之間的字元,超過此範圍,識別會出錯;ES6彌補了這個錯誤 ES6擴展的新方法codePointAt "𠮷".CodePointAt(0)//返回超 ...
  • Vue2學習 醒目中在使用bootstrapTable的時候,在table裡面會有操作結合vue使用過程中點擊相應的操作不會起作用 + 解決辦法 + 1、把事件綁定到父元素上即可,但要判斷什麼樣的需要點擊,用了v if實現的想要的渲染效果。或者(vue的事件綁定支持原生的event參數:event. ...
  • html的標簽的屬性,比如id、class、href需要動態傳遞參數,拼接字元串,查了一些資料,並沒有找到合適的解決方法,琢磨了一上午,終於試出了方法: v-bind:屬性=“ ‘字元串’+自定義變數名”,自己試了沒問題,有需要的朋友可以借鑒下! 最後需要註意一下屬性一定是":屬性="這種形式才會起 ...
  • <!doctype html><html><head><meta charset="utf-8"><title>無標題文檔</title></head><style> *{margin:0;padding:0;list-style:none;}#menu{position:relative; wid ...
  • 1、開胃菜,setTimeout為何物 首先看一下 上面對於 的解釋 很簡單, 只執行 一次,到底什麼時候執行取決於第二個參數 設定的毫秒數,所以很多人習慣上稱之為 ,無非就是延遲一段時間後再執行裡面的代碼。 正常情況下, 這句話並不會馬上輸出而是等1000毫秒以後會在瀏覽器的控制台輸出。 2、主菜 ...
  • onlyNum.js main.js 在component中只需要在input上加上v-limitNum就能生效。 ...
  • NFS簡介 NFS(Network File System)即網路文件系統。 主要功能:通過網路(區域網)讓不同的主機系統之間可以共用文件或目錄。 主要用途:NFS網路文件系統一般被用來存儲共用視頻,圖片,附件等靜態資源文件。 NFS存儲服務 無NFS文件共用存儲 當用戶A通過互聯網上傳文件時,經過 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...