架構是什麼?

来源:http://www.cnblogs.com/wzb153/archive/2017/01/16/6289692.html
-Advertisement-
Play Games

IT生涯將近10年,一直對於軟體架構還是將懂非懂,因為每一個團隊的經歷不一樣,所以達到的高度也不一樣,所以經歷決定一個架構師的水平能力(騰訊的架構也不一定適用中小型,做ERP的不一定適合互聯網),也由於行業的特性,所以架構也隨環境,行業特性,團隊水平性而產生裂變,所以說團隊的技術水平決定架構的層次, ...


    IT生涯將近10年,一直對於軟體架構還是將懂非懂,因為每一個團隊的經歷不一樣,所以達到的高度也不一樣,所以經歷決定一個架構師的水平能力(騰訊的架構也不一定適用中小型,做ERP的不一定適合互聯網),也由於行業的特性,所以架構也隨環境,行業特性,團隊水平性而產生裂變,所以說團隊的技術水平決定架構的層次,再加上架構也是具有一定的發展性(從最初的三層架構,MVC,SAAS,DDD,微服務),所以一直以來,架構在每一個團隊,或者整個軟體行業一直都是霧裡看花,也就造成每一個團隊都有自己的一套架構標準。     一,好架構的標準     一個好的架構,必然跟目前的技術推進相關,好的架構必須具備以下的規則: 1,適應於多人開發,保證開發質量的前提下,儘量以效率為主,所以為什麼要用ORM,介面規範,公共層,代理層,資料庫設計規範,這些都是為了效率,減少重覆代碼工作量,以節省開發時間。   2,良好的可伸縮性,擴展性,所以才有了架構的行業規範。從架構的迭代,大多數人都經歷三層架構,MVC,MVP(WEB FROM ),SAAS,DDD,微服務,組件,插件化,架構,這些的技術單一或者混合在使用,這些都是為了伸縮以及可擴展性,並且由於一般大型的開發,人員很多,所以把每一個大型的系統拆分成子系統,有利於松藕及管理,所以一個大型的系統拆分子系統又有很有必要,像淘寶,分支付系統,商品系統,搜索系統,存儲系統等。     3,為了應付大併發,海量數據,不同的小組工作成員分工,那麼就大量的中間件運用而生,而分散式的中間件大量產生,緩存(Cache),消息隊列(MQ),任務調度(JOB),搜索引擎,存儲引擎,資料庫讀寫分離,數據挖掘引擎,大量應用而生,所以導致很多人認為架構不與這些沾上邊,就是以為那就不是好的架構,因為這些的應用場景比較缺,所以也是考驗一個開發的技術水平,沒有平臺給你做實踐,天天談技術純粹扯蛋,只要真的踩坑,才是出真理。   4,不同的行業背景,架構也不一樣,舉個例子:   ERP類行業標準:金碟的K/3系統,之前每一個庫留幾十個欄位,那是因為客戶端以及服務端到實施他沒有雲化,所以預留欄位很有必要,所以大型應用組件及插件,客戶在實施的時候,需要什麼,按需調用,為了靈活性及通用性。   互聯網類的標準:從最初的三層架構,到SAAS(SOA,軟體即服務),DDD(領域驅動),微服務,每一個技術的發展,其實是跟整個互聯網的背景有關,為什麼會有微服務,其實是跟技術環境有關係,由於互聯網代表新興的技術推進,面臨各種技術的混合使用,雲平臺的誕生,所以才會有微服務的存在,微服務最大的優點就是為了跨平臺以及跨語言,其缺點也很明顯,可能導致重覆的工作。   那麼,歸納起來,衡量一個架構的好壞,可以從以下5個方面 去考慮大併發,海量數據,擴展性,獨立性,業務延伸五個方面去達到考慮一個架構的規範及嚴謹性。       按照以上的五個標準,那麼我根據自己的水平以及層次,建立一套好的框架標準,肯定是要考慮結合實踐場景,那麼客戶必須滿足三個端,網站(PC與移動),APP,物聯網硬體,而服務端必須滿足獨立性,擴展性,大併發及海量數據,如電商為例:     1,服務端,可劃分為載體,構件層,組件層,(載體是指,WEB項目,WEBAPI,SOCKET服務中心管理,任務調度管理中心,構件層很重要的一個功能就是將系統資源與應用構件隔離,這是保證構件可重用甚至"即插即用"的基礎,與中間件的意圖同樣是一致的,簡潔理解為,構件可以載入到任務載體,載體可以隨便選擇構件,通過IOC就可以實現他的功能引用,組件就是元件)即插即用,用到這載體,構件化,組件化,實現擴展性,獨立性,業務延伸的一個標準   而把運營支持組件,嵌入到組件裡面去,可以實現支撐大併發,海量數據,有利於系統的統一性,而運營組件最大目的就是支撐大併發以及海量數據,例如:緩存減少IO讀寫,消息隊列把同步變成非同步,多表聯合查詢用搜索引擎替換,NOSQL,HADOOP替換了資料庫運算…… 而這樣就有了一個好的架構,那麼說一說規範以及技術在架構的應用以及規範,架構的目的是在於規範,而規範遵守三個標準:約定、規則、共識     一,組件的標准定義,擁有數據實體層Model,服務層Services,數據層DAL. 約定標準以下: 1.1,MODEL層的規則就是可以建立數據表之間的一對多,或者一對一,超過之外的視圖模型統一放到構件層的DTO(WEB API),或者載體(WEB項目)的MODEL管理,以便減少維護成本。 1.2,Services儘量以介面暴露出來,加上IOC可以註入到任何的載體容器裡面去。如JAVA的SPRING框架,NET的WEBAPI,MVC框架。   1.3,services層調用DAL儘量引用單例模式,這樣在讀寫分離起到作用。   1.4,ORM的標準,支持不同的資料庫類型,例如:MYSQL,NOSQL,MSSQL,ORACLE,框架選型,根椐不同的開發語言,做不同的選型,最重要的一點,支持讀寫分離。   1.5在services層添加一個IOC的介面配置文件,這樣把IOC配置在WEB項目,或者WEBAPI這樣的載體上面上。   二構件的標准定義: 2.1 獨立的路由URL,Controller,DTO,所有的數據來源都是組件。為什麼會需要構件?在軟體交互的時候,很多時間我們面臨三個問題: 1:由UI,客戶端,第三方介面與目前的系統模型沒法對應,需要過濾及組裝。 2:需要對內外統一通過URL路徑及通訊協議。 3:跨平臺,降低程式的復用性,一個暴露的介面,每個子系統都可以引用。     運營組件的標準: 1,分散式CACHE,作二級緩存使用,減少IO讀寫,以應用大併發,以記憶體讀寫速度換IO讀寫速度。 2,消息隊列,在對一個同步的機制化解成非同步處理,主要目的是減少請求響應時間和解耦。 3,任務調度,以任務方式,實現任務的調度,這個有利於資源的分配,例如:閑時做數據清洗(ELT),資料庫備份,消息推送等。   4,搜索引擎中間件,替換資料庫的實時查詢,例如:多表關聯查詢,視圖查詢,一般可以採用搜索引擎機制進行查詢。   5,數據挖掘引擎,可以搭配HADOOP,SPARK進行實時運算,並把實時結果返回。  

運營組件的標準:

一,分散式CACHE作二級緩存使用,減少IO讀寫,以應用大併發,以記憶體讀寫速度換IO讀寫速度。

  1. 優點:簡單有效,減少對 DB 的查詢

  2.  

    缺點:增加邏輯判斷,不適合存儲大對象。

 

二,消息隊列在對一個同步的機制化解成非同步處理,主要目的是減少請求響應時間和解耦,以便提高吞吐量。

  1. 優點:非同步、解耦,提高吞吐量

  2. 缺點:消息消費延遲等問題

 


 

三,任務調度以任務方式,實現任務的調度,這個有利於資源的分配,例如:閑時做數據清洗(ELT),資料庫備份,消息推送等。

  1. 優點:利用閑時提高資源的使用量,

  2. 缺點:帶來開發成本以及維護成本

 

 

四,搜索引擎中間件替換資料庫的實時查詢,例如:多表關聯查詢,視圖查詢,一般可以採用搜索引擎機制進行查詢。

  1. 優點:利用索引可以替換多表聯合查詢,視圖查詢,減少資料庫查詢帶來的不便性

  2. 缺點:要做到實時數據有點困難

 

 

五,數據挖掘引擎可以搭配HADOOP,SPARK進行實時運算,並把實時結果返回。

  • 優點:可以代換傳統資料庫的實時運算,並根據演算法達到最優

  • 缺點:需要數據清洗,不同的演算法來做不同維度的模型,技術含量高。

 

六、數據分庫

 

先垂直後水平的原則,根據業務的進行解藕,一般按業務的來劃分,因為前面搭配了搜索引擎,以及HADOOP來替換資料庫的實時運算,一般沒大問題,所以前提儘量先拆庫,再拆表。

 

資料庫標準

前期儘量按業務或者子系統分庫,另外資料庫的設計標準,儘量減少欄位以及欄位存儲,達到以空間換時間的效果,即存儲量越小,查詢越快。

 

談完以上,就可以開始著手搭一個架構出來,再根據業務場景去進行編碼去,規範再定義好資料庫規範,代碼審核規範,即可以完成一個軟體架構了。

當然,實時這些,只能是從軟體架構的實現,現實還要進行

1.    資料庫服務集群(一寫多台讀)

2.    文件服務集群。

3.    緩存服務集群

4.    應用服務集群

5.    負載均衡調度器集群

6.    靜態內容服務集群

7.    CDN伺服器集群

優點:去單點,高可用

缺點:數據有狀態問題、數據一致性問題,資源成本、人力維護成本都上去了。

 

這樣一個大型的網站架構就完成了但這也面臨一個很現實的問題,一個網站的流量併發有高有低,包括發佈,在一百台機器發佈程式以10台發佈完成不一樣,還有多個子系統,發佈簡直就是浪費人力成本,而 DT/分散式 時代的到來,大流量和大數據的場景的出現,包括Docker ,Kubernetes技術的產生,一度催生了微服務架構。

 

微服務架構

微服務架構(microservices architecture)一度成為熱點,微服務並不是憑空出現,有人說,它是面向服務架構(SOA)的升級,在此之前,還有諸如集中式架構、分散式的架構等。這裡借用一副抽象的圖來描述下常見的幾種架構:


微服務架構由多個微小服務構成,每個服務就是一個獨立的可部署單元或組件,它們是分散式的,相互解耦的,通過輕量級遠程通信協議(比如REST)來交互。每個服務可以使用不同的資料庫,而且是語言無關性的。它的特征是彼此獨立、微小、輕量、松耦合,又能方便地組合和重構,個體簡單,但組合起來威力強大。

 

優點:擴展性好,服務之間耦合性低,服務間相互獨立,容易部署,易於開發,方便測試每一個服務

缺點:容易過度關註服務的大小,可能拆分地很細,導致系統依賴於大量的微服務,而服務之間的相互通信也會變得複雜,系統集成複雜度增加,很難實現原子性操作。

微服務之所以這麼火,另一個原因是因為 Docker與Kubernetes(k8s) 的出現,它讓微服務有一個非常完美的運行環境。Docker 的獨立性和細粒度非常匹配微服務的理念,Docker的優秀性能和豐富的管理工具,讓大家對微服務有了一定的信心,概括來說 Docker 有如下四點適合微服務:

 

獨立性:一個容器就是一個完整的執行環境,不依賴外部的任何東西。

細粒度:一臺物理機器可以同時運行成百上千個容器,其計算粒度足夠小。

快速創建和銷毀:容器可以在秒級進行創建和銷毀,非常適合服務的快速構建和重組。

搭配Kubernetes(k8s)開源的容器集群管理系統,能夠快速地實現服務的組合和調度,例如雲電腦租用,閑時,就銷毀電腦資源,忙時增加ESC,就是幾分鐘的事情,還可以實現多租戶的使用。

 

 

Kubernetes  +DOCKER

 

當然搭配Kubernetes+jenkines持續集成,可以發佈到開發環境,測試環境,生產環境,更是自動化的事情,架構在迭代,做架構其實一直在學習中前進,好的架構和技術要應用於實踐,保持一顆學習的心,才是立根之本。

 

 

 

 

作者:BON,微信公眾號:ithaidao

 

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

-Advertisement-
Play Games
更多相關文章
  • 單元測試的核心就是:只測試眼前的邏輯。這就要求所有的依賴項都要使用仿類來代替,也就是所謂的 Mock Object。在測試 和 的時候,我遇到了需要對 和 進行 Mock 的需求。因為這兩個組件相互依賴,還依賴別的組件,我折騰了好一陣才搞定這個問題。具體的方法分兩種:直接使用 Moq 進行 Mock ...
  • 在頁面想webApi post json數據的時候,發現webapi不能直接以json的方式接受數據(註:我是沒有發現一個很好的方式來post json數據的);但是可以以數據結構的方式傳遞; 如下: 1 public class Diff 2 { 3 public string Id { set; ...
  • 預設MVC的 View頁面 不參與編譯,當更改view對應model後,view編譯也能通過,或者頁面有錯誤的服務端代碼時也不會報錯。 那麼如何在編譯的時候能讓View中的錯誤也不能通過呢。經過查找找到了方法,本機MVC5.0 適用,其他版本未試。 方法: 一、修改 .csproj 工程文件,用tx ...
  • 1.添加編輯按鈕 打開文件Index.js 【..\MyCompanyName.AbpZeroTemplate.Web\Areas\Mpa\Views\Category\Index.js】 在actions中添加如下代碼: actions: { title: app.localize('Action ...
  • 今天我們來講一下原型模式。老樣子,我們先舉一個案例: 一、案例 我們找工作,需要投簡歷,一份簡歷是不夠的,我們需要多複製幾分簡歷。 好,我們用簡單的控制台程式來完成上述的需求。 二、演繹 1、第一步演繹 客戶端調用: OK,我們實現了上述的功能,搞了三份簡歷出來。我們可以通過複製粘貼,複製更多分簡歷 ...
  • 雖然已經可以添加商品分類,但還需進行優化,比如:用戶是否輸入、輸入字元串是否有格式限制等等。 打開添加分類按鈕,名稱不輸入任何字元,直接保存,會發現列表添加一條空記錄。在實際項目中,這是不允許出現的事情,我必須對分類名稱進行必填限制,但用戶沒填寫時,給予提示信息。 數據驗證就涉及客戶端和服務端,建議 ...
  • 1.打開Index視圖 頁面中添加一個按鈕,代碼如下: <div class="row margin-bottom-5"> <div class="col-xs-6"> <div class="page-head"> <div class="page-title"> <h1> <span>分類</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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...