国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
給公司部門設(shè)計的SOA架構(gòu)

新來老大年前開會說:各位同學,公司業(yè)務(wù)越來越重,未來幾年要成倍增長......,我們要梳理出一套新架構(gòu),才能更好的支持N萬用戶.....,以后升職加薪當上....打敗.....
樓主感動淚奔,于是過年時樓主趁等待相親妹紙無聊的時候,反思了目前系統(tǒng)現(xiàn)狀,構(gòu)思設(shè)計新架構(gòu)如下。

閱讀目錄:

  1. 現(xiàn)有系統(tǒng)
  2. 新架構(gòu)   
    2.1 邏輯架構(gòu)圖 
    2.2 解釋說明
  3. 系統(tǒng)實施
    3.1 SOA管理中心
    3.2 發(fā)布服務(wù)
    3.3 訂閱服務(wù)
    3.4 采蘑菇示例
  4. 設(shè)計目標
    4.1 盡可能少的侵入
    4.2 服務(wù)自治&&水平擴展
    4.3 系統(tǒng)升級降級
  5. 常見問題
    5.1 ClientApi VS ServiceApi
    5.2 聚合服務(wù)
    5.3 服務(wù)分級
  6. 總結(jié)心得

現(xiàn)有系統(tǒng)

鄙司業(yè)務(wù)比較重,系統(tǒng)也有些年頭,各研發(fā)團隊、系統(tǒng)都比較穩(wěn)定了。所以不差也不太好,總之也能滿足現(xiàn)有需求。但近2年O2O,移動互聯(lián)網(wǎng)等大行其道,老大們也都心動了,開始磨刀霍霍了。而現(xiàn)有系統(tǒng)應(yīng)對復(fù)雜的變化,在一些地方頗顯不足:

  • 接口沒有統(tǒng)一管理
  • 很多組件無法復(fù)用/重復(fù)造輪子
  • 模塊間職責不清,耦合過深
  • 聯(lián)調(diào)排查問題比較慢
  • 開發(fā)前規(guī)劃不足,形成堆積
  • 缺乏API規(guī)范/文檔較少

新架構(gòu)

邏輯架構(gòu)圖:

解釋說明:

  • A開頭:是系統(tǒng)級別,可以獨立部署。即可寄宿在IIS/WindowsService等上面。
  • B開頭:是模塊級別,不可獨立部署。相對獨立的功能模塊,而又不大,所以依附其他系統(tǒng)或者和多個模塊組成一個子系統(tǒng)。模塊級別在項目中可以分多層,可根據(jù)分數(shù)升級成子系統(tǒng)(見系統(tǒng)升級降級)。
  • C開頭:是組件級別,不可獨立部署。大多數(shù)是公共性組件,一般是單獨類庫存在,以DLL提供使用。一些開源組件也歸到這里,例:Aufofac,F(xiàn)luentData。 需要自搭Nuget服務(wù)器,進行統(tǒng)一版本管理。
  • 字母后面的數(shù)字:是代表服務(wù)的級別,見服務(wù)分級。
  • 系統(tǒng)通信: 各系統(tǒng)之間盡量走內(nèi)網(wǎng)Wcf/Tcp,對外合作單位及各移動端走WebApi/Http。
  • 傳輸格式: Protobuffer、Json。
  • 數(shù)據(jù)交換: 優(yōu)先通過數(shù)據(jù)服務(wù)接口,其次SSIS、Job。
  • 基礎(chǔ)平臺: 緩存Redis,隊列RabbitMq等。依賴抽象,框架可替換。
  • DB 層: 每個子系統(tǒng)擁有自己的子DB,原則上不能跨庫讀其他的。
  • 高可用 : 子系統(tǒng)自行做負載,服務(wù)變更通知使用zookeeper。
  • 單向2級:只能訂閱服務(wù),不能發(fā)布服務(wù),2級只能訂閱2級服務(wù)。
  • 定點:某個客戶端只能訂閱某個服務(wù)端提供的服務(wù)。

系統(tǒng)實施

SOA管理中心

這是新架構(gòu)的核心部分,主要功能如下:

  • 提供發(fā)布/訂閱/ServiceAdapter組件
  • 提供Web管理界面
  • 對服務(wù)訪問的各種配置
  • 在高峰期對服務(wù)限流/報警
  • 服務(wù)訪問授權(quán)、描述

發(fā)布服務(wù)

各系統(tǒng)通過Web管理頁面進行服務(wù)配置發(fā)布。
也可以通過管理中心提供的組件,進行配置發(fā)布:

    protected void Application_Start()    {        ServicePublisher.Pushlish(new ServiceConfig()        {            ServiceName = "獲取預(yù)訂單詳情",            Qps = 1000,            Level = 1,            Key = "xxxx-yyyy",            Source = SubscribeSource.All,            ServiceAddress = "/Order/GetDetail",            //其他        });    }    [ServiceFilter]    void GetDetail()    {    }

 

訂閱訪問服務(wù)

各系統(tǒng)通過管理中心提供的組件,去獲取訂閱的服務(wù),然后通過適配器去訪問接口,服務(wù)變更在心跳里面做:

    protected void Application_Start()    {        //獲取服務(wù)列表        var serviceList = ServiceManager.GetServiceList();        GlobalService.ServiceList=serviceList;    }    void Heartbeat()    {        var serviceList = ServiceManager.GetServiceList();        GlobalService.ServiceList=serviceList;    }    ServiceAdapter.Access(GlobalService.ServiceList[0]);

 

采蘑菇示例

設(shè)計目標

盡可能少的侵入

這點是非常重要的,如果不能很好的重用已有的系統(tǒng)或侵入性太強,勢必會導(dǎo)致:

  • 新架構(gòu)周期過長,長期維護二套結(jié)構(gòu)。這種情況下,成本太高,不好推行下去或者還未推行就被砍了。
  • 開發(fā)人員的抵抗,每個猿類內(nèi)心都有桀驁的脾氣、造輪子的天賦、重組世界的夢想...。如果太復(fù)雜、約束太強,天知道你們這群猿類會干出什么事情!

基于這種考慮,才采用服務(wù)分布式而不是服務(wù)集中式。

  • 每個系統(tǒng)在需要時,去訂閱服務(wù),然后拉取服務(wù)地址/MyNeedServcie.list。
  • 然后通過ServiceAdapter訪問服務(wù),ServiceAdapter中會做權(quán)限等一些校驗。
  • 在服務(wù)上增加ServiceFilter,F(xiàn)ileter會做權(quán)限校驗及服務(wù)被調(diào)用的信息采集。
  • 然后在管理中心添加服務(wù),文檔描述。

好處是:A系統(tǒng)與B系統(tǒng)是直接交互的,服務(wù)調(diào)用不走中轉(zhuǎn)路由,性能也好。而組件的作用僅是輔助性的約束。

服務(wù)自治&&水平擴展

由于侵入性較小,所以各個系統(tǒng)之間的服務(wù)變更,維護完全由各自研發(fā)團隊維護。
本系統(tǒng)之間通訊不走服務(wù),直接內(nèi)部調(diào)用。調(diào)用通過ServiceAdapter組件訪問,ServiceAdapter包含對進程內(nèi)、WCF、WebApi等訪問的封裝,這樣便于以后替換成其他服務(wù)。各服務(wù)在擴展上不受管理中心節(jié)制,自行做負載、增加服務(wù)器即可。

系統(tǒng)升級降級

當有個新需要過來時,會根據(jù)產(chǎn)品是否需要獨立部署,和現(xiàn)有系統(tǒng)耦合性等因素,來評估是模塊級還是系統(tǒng)級。
對于舊模塊,根據(jù)重要程度、訪問量等評估出分數(shù)。達標的由模塊抽離出子系統(tǒng),單獨管理。
同樣對于舊系統(tǒng),不達標的進行降級處理,縮小成模塊整合到其他系統(tǒng)里面。

這塊其實很重要,如果不對項目做好評估的話,往往會導(dǎo)致一個系統(tǒng)越來越沉重。最后的結(jié)果就是維護越來越麻煩,經(jīng)常出問題。最后逼不得已就推到重來,這個成本就較大些,當然成本的事情老大會考慮更多些。處于這種情況下猿類們會一邊吐槽著之前的同類渣渣,一邊躍躍欲試準備大展身手,讓你們瞧瞧什么叫DDD、TDD、設(shè)計模式......。

前提是在需求開發(fā)時,按模塊進行分小層而不是整個大層,這樣方便協(xié)作開發(fā)和抽取成子系統(tǒng)。

常見問題

ClientApi VS ServiceApi

ClientApi這個在前期用的比較多的辦法。優(yōu)點很明顯:簡單快捷,從Nuget上安裝引用即可。這樣后期會問題越來越多。
就拿緩存Redis來說,多個系統(tǒng)都使用客戶端直接訪問Redis服務(wù)器。如果有個系統(tǒng)連接數(shù)忘記關(guān)閉,就會影響整個大系統(tǒng),原因就是Client權(quán)限過大,客戶端是可以對redis服務(wù)器直接進行操控。這種情況下redis服務(wù)器本身是暴露在外的,哪怕客戶端封裝的再好也不行,只要研究下通信協(xié)議規(guī)范,就可以自己寫個客戶端連(參見:c#實現(xiàn)redis客戶端(一))。 這個通信期間無法管控,無法做攔截,同樣隊列等其他也是同樣情況。

ServiceApi:


我們在中間加了一層,在緩存系統(tǒng)里面做管控,同樣依賴抽象,Redis可替換。緩存系統(tǒng)以服務(wù)的形式發(fā)布給其他系統(tǒng)使用。避免不了的就是性能有損耗,當然這個損耗可以通過一些手段減小。

聚合服務(wù)

服務(wù)的顆粒度一直是SOA設(shè)計的頭疼事情。太粗了就很難復(fù)用,太細了需要多次往返交互,其性能、事務(wù)處理都是個問題。比如下訂單服務(wù),這個過程中包含創(chuàng)建用戶資料,生成預(yù)訂單、支付訂單,更新賬務(wù)關(guān)系,更新庫存等一系列的操作。這是個粗粒度服務(wù),里面包含若干子系統(tǒng)的提供的細粒度服務(wù)。粗粒度服務(wù)下,多個子系統(tǒng)避免不了互相交互,長久下去會讓系統(tǒng)過于沉重,變得職責混亂。
服務(wù)設(shè)計準則就是讓服務(wù)高內(nèi)聚,服務(wù)之間松耦合、邊界清晰。所以我們抽離一個聚合服務(wù)系統(tǒng),它專門負責把各系統(tǒng)提供的細粒度服務(wù)進行整合,提供給前端使用。而其他各個系統(tǒng)只做自己職責之內(nèi)的事情。在聚合服務(wù)系統(tǒng)中,方便我們更合理的把控服務(wù)的顆粒度,提高服務(wù)復(fù)用。

服務(wù)分級

多個研發(fā)團隊協(xié)作時,很難每個人都對全部業(yè)務(wù)熟悉。所以為了避免服務(wù)調(diào)用混亂,甚至循環(huán)依賴調(diào)用,增加了對服務(wù)的分級。
按圖中所示,1級服務(wù)不能調(diào)2級服務(wù),即低級不能調(diào)高級,高級可調(diào)低級,同級互相可調(diào)。
這個級別針對單個服務(wù)而分的。比如有個更新庫存服務(wù),它沒有外部依賴的服務(wù),只是更新自己的DB,這樣我們就可以把它劃分為1級服務(wù)。 而我們的聚合服務(wù)系統(tǒng)中有個下訂單粗粒度服務(wù),它內(nèi)部調(diào)用更新庫存服務(wù),那么它就是2級服務(wù)。很明顯這里的1級不應(yīng)該調(diào)用2級,對服務(wù)分級也是這個目的。

總結(jié)心得

  • 好架構(gòu)是不斷進化來的
  • 盡可能考慮到每個細節(jié)
  • 注重整體平衡性,而非局部最優(yōu)
  • 依賴抽象,而不是具體哪個框架技術(shù)
  • 先考慮人,在考慮用哪個技術(shù)
  • 跟妹紙相處時不要想程序那點事
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SCA 應(yīng)用程序開發(fā): 第 1 部分:服務(wù)組件體系結(jié)構(gòu)概述
SOA軟件架構(gòu)與測試實例解析
深入淺出SOA
SOA 快速指南 1 2 3(轉(zhuǎn)IBM developerWorks 中國)
組件化、模塊化、集中式、分布式、服務(wù)化、面向服務(wù)的架構(gòu)、微服務(wù)架構(gòu)
軟件架構(gòu)發(fā)展歷程分享
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服