主頁 > 軟體設計 > 架構師必須掌握的重要微服務架構設計模式!

架構師必須掌握的重要微服務架構設計模式!

2021-03-07 11:15:43 軟體設計

作為一名合格的架構師,要掌握很多方面的技能和能力,其中架構的設計能力是必須具備的能力之一,在架構設計的程序中,架構師會使用一些重要的架構設計模式來進行架構設計,

近年來,微服務架構由于其“微”的特性,給架構帶來了更大的靈活性和便利性,也因此受到了很多架構師的青睞和使用,

本文重點介紹一下微服務架構的定義及其重要的設計模式,并介紹每種模式的優點,缺點,適用場景和不適用的場景,及其可用實作的技術有哪些,還有相應的擴展文章,希望對已經是架構師或者打算成為架構師的小伙伴有指導性幫助!

微服務架構定義

Martin Fowler的這篇文章《Microservices》通俗易懂的講解了什么是微服務架構.

微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值,每個服務運行在其獨立的行程中,服務與服務間采用輕量級的通信機制互相協作(通常是基于HTTP協議的RESTful API),每個服務都圍繞著具體業務進行構建,并且能夠被獨立的部署到生產環境、類生產環境等,

微服務架構的重要特征:

  • 整個應用程式被拆分成相互獨立但包含多個內部模塊的子行程,

  • 與模塊化的單體應用(Modular Monoliths)或 SOA 相反,微服務應用程式根據業務范圍或領域垂直拆分,

  • 微服務邊界是外部的,微服務之間通過網路呼叫(RPC 或訊息)相互通信,

  • 微服務是獨立的行程,它們可以獨立部署,

  • 它們以輕量級的方式進行通信,不需要任何智能通信通道,

微服務架構的優點:

  • 更好的開發規模,

  • 更快的開發速度,

  • 支持迭代開發或現代化增量開發,

  • 充分利用現代軟體開發生態系統的優勢(云、容器、 DevOps、Serverless),

  • 支持水平縮放和細粒度縮放,

  • 小體量,較低了開發人員的認知復雜性,

微服務架構的缺點:

  • 更高數量級的活動組件(服務、資料庫、行程、容器、框架),

  • 復雜性從代碼轉移到基礎設施,

  • RPC 呼叫和網路通信的大量增加,

  • 整個系統的安全性管理更具有挑戰性,

  • 整個系統的設計變得更加困難,

  • 引入了分布式系統的復雜性,

何時使用微服務架構:

  • 大規模 Web 應用開發,

  • 跨團隊企業級應用協作開發,

  • 長期收益優先于短期收益,

  • 團隊擁有能夠設計微服務架構的軟體架構師或高級工程師,

以下是架構師必須掌握的重要微服務架構設計模式:

  • 獨享資料庫(Database per Microservice)
  • 事件源(Event Sourcing)
  • 命令和查詢職責分離(CQRS)
  • Saga
  • 面向前端的后端 (BFF)
  • API 網關
  • Strangler
  • 斷路器
  • 外部化配置
  • 消費端驅動的契約測驗

獨享資料庫(Database per Microservice)

當一家公司將大型單體系統替換成一組微服務,首先要面臨的最重要決策是關于資料庫,單體架構會使用大型中央資料庫,即使轉移到微服務架構許多架構師仍傾向于保持資料庫不變,雖然有一些短期收益,但它卻是反模式的,特別是在大規模系統中,微服務將在資料庫層嚴重耦合,整個遷移到微服務的目標都將面臨失敗(例如,團隊授權、獨立開發等問題),

更好的方法是為每個微服務提供自己的資料存盤,這樣服務之間在資料庫層就不存在強耦合,這里我使用資料庫這一術語來表示邏輯上的資料隔離,也就是說微服務可以共享物理資料庫,但應該使用分開的資料結構、集合或者表,這還將有助于確保微服務是按照領域驅動設計的方法正確拆分的,

Md Kamaruzzaman 的微服務獨享資料庫

優點

  • 資料由服務完全所有,

  • 服務的開發團隊之間耦合度降低,

缺點

  • 服務間的資料共享變得更有挑戰性,

  • 在應用范圍的保證 ACID 事務變得困難許多,

  • 細心設計如何拆分單體資料庫是一項極具挑戰的任務,

何時使用獨享資料庫

  • 在大型企業應用程式中,

  • 當團隊需要完全把控微服務以實作開發規模擴展和速度提升,

何時不宜使用獨享資料庫

  • 在小規模應用中,

  • 如果是單個團隊開發所有微服務,

可用技術示例

所有 SQL、 NoSQL 資料庫都提供資料的邏輯分離(例如,單獨的表、集合、結構、資料庫),

事件源(Event Sourcing)

在微服務架構中,特別使用獨享資料庫時,微服務之間需要進行資料交換,對于彈性高可伸縮的和可容錯的系統,它們應該通過交換事件進行異步通信,在這種情況,您可能希望進行類似更新資料庫并發送訊息這樣的原子操作,如果在大資料量的分布式場景使用關系資料庫,您將無法使用兩階段鎖協議(2PL),因為它無法伸縮,而 NoSQL 資料庫因為大多不支持兩階段鎖協議甚至無法實作分布式事務,

在這些場景,可以基于事件的架構使用事件源模式,在傳統資料庫中,直接存盤的是業務物體的當前“狀態”,而在事件源中任何“狀態”更新事件或其他重要事件都會被存盤起來,而不是直接存盤物體本身,這意味著業務物體的所有更改將被保存為一系列不可變的事件,因為資料是作為一系列事件存盤的,而非直接更新存盤,所以各項服務可以通過重放事件存盤中的事件來計算出所需的資料狀態,

Md Kamaruzzaman 的事件源

優點

  • 為高可伸縮系統提供原子性操作,

  • 自動記錄物體變更歷史,包括時序回溯功能,

  • 松耦合和事件驅動的微服務,

缺點

  • 從事件存盤中讀取物體成為新的挑戰,通常需要額外的資料存盤(CQRS 模式),

  • 系統整體復雜性增加了,通常需要領域驅動設計,

  • 系統需要處理事件重復(冪等)或丟失,

  • 變更事件結構成為新的挑戰,

何時使用事件源

  • 使用關系資料庫的、高可伸縮的事務型系統,

  • 使用 NoSQL 資料庫的事務型系統,

  • 彈性高可伸縮微服務架構,

  • 典型的訊息驅動或事件驅動系統(電子商務、預訂和預約系統),

何時不宜使用事件源

  • 使用 SQL 資料庫的低可伸縮性事務型系統

  • 在服務可以同步交換資料(例如,通過 API)的簡單微服務架構中,

可用技術示例

事件存盤: EventStoreDB, Apache Kafka, Confluent Cloud, AWS Kinesis, Azure Event Hub, GCP Pub/Sub, Azure Cosmos DB, MongoDB, Cassandra. Amazon DynamoDB

框架: Lagom, Akka, Spring, akkatecture, Axon,Eventuate

延伸閱讀

事件驅動

事件驅動模式-云設計模式

微服務模式:事件驅動

命令和查詢職責分離(CQRS)

如果我們使用事件源,那么從事件存盤中讀取資料就變得困難了,要從資料存盤中獲取物體,我們需要處理所有的物體事件,有時我們對讀寫操作還會有不同的一致性和吞吐量要求,

這種情況,我們可以使用 CQRS 模式,在該模式中,系統的資料修改部分(命令)與資料讀取部分(查詢)是分離的,而 CQRS 模式有兩種容易令人混淆的模式,分別是簡單的和高級的,

在其簡單形式中,不同物體或 ORM 模型被用于讀寫操作,如下所示:

Md Kamaruzzaman 的 CQRS (簡單)

它有助于強化單一職責原則和分離關注點,從而實作更簡潔的設計,

在其高級形式中,會有不同的資料存盤用于讀寫操作,高級的 CQRS 通常結合事件源模式,根據不同情況,會使用不同型別的寫資料存盤和讀資料存盤,寫資料存盤是“記錄的系統”,也就是整個系統的核心源頭,

Md Kamaruzzaman 的 CQRS(高級)

對于讀頻繁的應用程式或微服務架構,OLTP 資料庫(任何提供 ACID 事務保證的關系或非關系資料庫)或分布式訊息系統都可以被用作寫存盤,對于寫頻繁的應用程式(寫操作高可伸縮性和大吞吐量),需要使用寫可水平伸縮的資料庫(如全球托管的公共云資料庫),標準化的資料則保存在寫資料存盤中,

對搜索(例如 Apache Solr、Elasticsearch)或讀操作(KV 資料庫、檔案資料庫)進行優化的非關系資料庫常被用作讀存盤,許多情況會在需要 SQL 查詢的地方使用讀可伸縮的關系資料庫,非標準化和特殊優化過的資料則保存在讀存盤中,

資料是從寫存盤異步復制到讀存盤中的,所以讀存盤和寫存盤之間會有延遲,但最終是一致的,

優點

  • 在事件驅動的微服務中資料讀取速度更快,

  • 資料的高可用性,

  • 讀寫系統可獨立擴展,

缺點

  • 讀資料存盤是弱一致性的(最終一致性),

  • 整個系統的復雜性增加了,混亂的 CQRS 會顯著危害整個專案,

何時使用 CQRS

  • 在高可擴展的微服務架構中使用事件源,

  • 在復雜領域模型中,讀操作需要同時查詢多個資料存盤,

  • 在讀寫操作負載差異明顯的系統中,

何時不宜使用 CQRS

  • 在沒有必要存盤大量事件的微服務架構中,用事件存盤快照來計算物體狀態是一個更好的選擇,

  • 在讀寫操作負載相近的系統中,

可用技術示例

寫存盤: EventStoreDB, Apache Kafka, Confluent Cloud, AWS Kinesis, Azure Event Hub, GCP Pub/Sub, Azure Cosmos DB, MongoDB, Cassandra. Amazon DynamoDB

讀存盤:Elastic Search, Solr, Cloud Spanner, Amazon Aurora, Azure Cosmos DB, Neo4j

框架:Lagom, Akka, Spring, akkatecture, Axon, Eventuate

延伸閱讀

bliki:CQRS

CQRS模式 - Azure 架構中心

微服務模式:命令和查詢職責分離(CQRS)

Saga

如果微服務使用獨享資料庫,那么通過分布式事務管理一致性是一個巨大的挑戰,你無法使用傳統的兩階段提交協議,因為它要么不可伸縮(關系資料庫),要么不被支持(多數非關系資料庫),

但您還是可以在微服務架構中使用 Saga 模式實作分布式事務,Saga 是 1987 年開發的一種古老模式,是關系資料庫中關于大事務的一個替代概念,但這種模式的一種現代變種對分布式事務也非常有效,Saga 模式是一個本地事務序列,其每個事務在一個單獨的微服務內更新資料存盤并發布一個事件或訊息,Saga 中的首個事務是由外部請求(事件或動作)初始化的,一旦本地事務完成(資料已保存在資料存盤且訊息或事件已發布),那么發布的訊息或事件則會觸發 Saga 中的下一個本地事務,

Md Kamaruzzaman 的 Saga

如果本地事務失敗,Saga 將執行一系列補償事務來回滾前面本地事務的更改,

Saga 事務協調管理主要有兩種形式:

  • 事件編排 Choreography:分散協調,每個微服務生產并監聽其他微服務的事件或訊息然后決定是否執行某個動作,

  • 命令編排 Orchestration:集中協調,由一個協調器告訴參與的微服務哪個本地事務需要執行,

優點

  • 為高可伸碩訓松耦合的、事件驅動的微服務架構提供一致性事務,

  • 為使用了不支持 2PC 的非關系資料庫的微服務架構提供一致性事務,

缺點

  • 需要處理瞬時故障,并且提供等冪性,

  • 難以除錯,而且復雜性隨著微服務數量增加而增加,

何時使用 Saga

  • 在使用了事件源的高可伸縮、松耦合的微服務中,

  • 在使用了分布式非關系資料庫的系統中,

何時不宜使用 Saga

  • 使用關系資料庫的低可伸縮性事務型系統,

  • 在服務間存在回圈依賴的系統中,

可用技術示例

Axon, Eventuate, Narayana

延伸閱讀

Saga分布式事務-Azure設計模式

微服務模式:Sagas

Saga 模式:微服務中的應用程式事務

面向前端的后端 (BFF)

在現代商業應用開發,特別是微服務架構中,前后端應用是分離和獨立的服務,它們通過 API 或 GraphQL 連接,如果應用程式還有移動 App 客戶端,那么 Web 端和移動客戶端使用相同的后端微服務就會出現問題,因為移動客戶端和 Web 客戶端有不同的螢屏尺寸、顯示屏、性能、能耗和網路帶寬,它們的 API 需求不同,

面向前端的后端模式適用于需要為特殊 UI 定制單獨后端的場景,它還提供了其他優勢,比如作為下游微服務的封裝,從而減少 UI 和下游微服務之間的頻繁通信,此外,在高安全要求的場景中,BFF 為部署在 DMZ 網路中的下游微服務提供了更高的安全性,

Md Kamaruzzaman 的面向前端的后端

優點

  • 分離 BFF 之間的關注點,使得我們可以為具體的 UI 優化他們,

  • 提供更高的安全性,

  • 減少 UI 和下游微服務之間頻繁的通信,

缺點

  • BFF 之間代碼重復,

  • 大量的 BFF 用于其他用戶界面(例如,智能電視,Web,移動端,PC 桌面版),

  • 需要仔細的設計和實作,BFF 不應該包含任何業務邏輯,而應只包含特定客戶端邏輯和行為,

何時使用 BFF

  • 如果應用程式有多個含不同 API 需求的 UI,

  • 出于安全需要,UI 和下游微服務之間需要額外的層,

  • 如果在 UI 開發中使用微前端,

何時不宜使用 BFF

  • 如果應用程式雖有多個 UI,但使用的 API 相同,

  • 如果核心微服務不是部署在 DMZ 網路中,

可用技術示例

任何后端框架(Node.js,Spring,Django,Laravel,Flask,Play,…)都能支持,

延伸閱讀

Sam Newman - 面向前端的后端

面向前端的后端模式 - 云設計模式

微服務模式: API 網關模式

API 網關

在微服務架構中,UI 通常連接多個微服務,如果微服務是細粒度的(FaaS) ,那么客戶端可能需要連接非常多的微服務,這將變得繁雜和具有挑戰性,此外,這些服務包括它們的 API 還將不斷進化,大型企業還希望能有其他橫切關注點(SSL 終止、身份驗證、授權、節流、日志記錄等),

一個解決這些問題的可行方法是使用 API 網關,API 網關位于客戶端 APP 和后端微服務之間充當 facade,它可以是反向代理,將客戶端請求路由到適當的后端微服務,它還支持將客戶端請求扇出到多個微服務,然后將回應聚合后回傳給客戶端,它還支持必要的橫切關注點,

Md Kamaruzzaman 的 API 網關

優點

  • 在前端和后端服務之間提供松耦合,

  • 減少客戶端和微服務之間的呼叫次數,

  • 通過 SSL 終端、身份驗證和授權實作高安全性,

  • 集中管理的橫切關注點,例如,日志記錄和監視、節流、負載平衡,

缺點

  • 可能導致微服務架構中的單點故障,

  • 額外的網路呼叫帶來的延遲增加,

  • 如果不進行擴展,它們很容易成為整個企業應用的瓶頸,

  • 額外的維護和開發費用,

何時使用 API 網關

  • 在復雜的微服務架構中,它幾乎是必須的,

  • 在大型企業中,API 網關是中心化安全性和橫切關注點的必要工具,

何時不宜使用 API 網關

  • 在安全和集中管理不是最優先要素的私人專案或小公司中,

  • 如果微服務的數量相當少,

可用技術示例

Amazon API 網關, Azure API 管理, Apigee, Kong, WSO2 API 管理器

延伸閱讀

微服務模式: API 網關模式

API 網關-Azure 架構中心

Strangler

如果想在運行中的專案中使用微服務架構,我們需要將遺留的或現有的單體應用遷移到微服務,將現有的大型在線單體應用程式遷移到微服務是相當有挑戰性的,因為這可能破壞應用程式的可用性,

一個解決方案是使用 Strangler 模式,Strangler 模式意味著通過使用新的微服務逐步替換特定功能,將單體應用程式增量地遷移到微服務架構,此外,新功能只在微服務中添加,而不再添加到遺留的單體應用中,然后配置一個 Facade (API 網關)來路由遺留單體應用和微服務間的請求,當某個功能從單體應用遷移到微服務,Facade 就會攔截客戶端請求并路由到新的微服務,一旦遷移了所有的功能,遺留單體應用程式就會被“扼殺(Strangler)”,即退役,

Md Kamaruzzaman 的 Strangler

優點

  • 安全的遷移單體應用程式到微服務,

  • 可以并行地遷移已有功能和開發新功能,

  • 遷移程序可以更好把控節奏,

缺點

  • 在現有的單體應用服務和新的微服務之間共享資料存盤變得具有挑戰性,

  • 添加 Facade (API 網關)將增加系統延遲,

  • 端到端測驗變得困難,

何時使用 Strangler

  • 將大型后端單體應用程式的增量遷移到微服務,

何時不宜使用 Strangler

  • 如果后端單體應用很小,那么全量替換會更好,

  • 如果無法攔截客戶端對遺留的單體應用程式的請求,

可用技術示例

API 網關后端應用框架,

延伸閱讀

bliki: StranglerFig 應用程式

Strangler 模式 - 云設計模式

微服務模式:Strangler 應用程式

斷路器

在微服務架構中,微服務通過同步呼叫其他服務來滿足業務需求,服務呼叫會由于瞬時故障(網路連接緩慢、超時或暫時不可用) 導致失敗,這種情況重試可以解決問題,然而,如果出現了嚴重問題(微服務完全失敗),那么微服務將長時間不可用,這時重試沒有意義且浪費寶貴的資源(執行緒被阻塞,CPU 周期被浪費),此外,一個服務的故障還會引發整個應用系統的級聯故障,這時快速失敗是一種更好的方法,

在這種情況,可以使用斷路器模式挽救,一個微服務通過代理請求另一個微服務,其作業原理類似于電氣斷路器,代理通過統計最近發生的故障數量,并使用它來決定是繼續請求還是簡單的直接回傳例外,

Md Kamaruzzaman 的斷路器

斷路器可以有以下三種狀態:

  • 關閉:斷路器將請求路由到微服務,并統計給定時段內的故障數量,如果超過閾值,它就會觸發并進入打開狀態,

  • 打開:來自微服務的請求會快速失敗并回傳例外,在超時后,斷路器進入半開啟狀態,

  • 半開:只有有限數量的微服務請求被允許通過并進行呼叫,如果這些請求成功,斷路器將進入閉合狀態,如果任何請求失敗,斷路器則會進入開啟狀態,

優點

  • 提高微服務架構的容錯性和彈性,

  • 阻止引發其他微服務的級聯故障,

缺點

  • 需要復雜的例外處理,

  • 日志和監控,

  • 應該支持人工復位,

何時使用斷路器

  • 在微服務間使用同步通信的緊耦合的微服務架構中,

  • 如果微服務依賴多個其他微服務,

何時不宜使用斷路器

  • 松耦合、事件驅動的微服務架構,

  • 如果微服務不依賴于其他微服務,

可用技術示例

API 網關,服務網格,各種斷路器庫(Hystrix, Reselience4J, Polly),

延伸閱讀

bliki:斷路器

斷路器模式 - 云設計模式

微型服務模式:斷路器

外部化配置

每個業務應用都有許多用于各種基礎設施的配置引數(例如,資料庫、網路、連接的服務地址、憑據、證書路徑),此外在企業應用程式通常部署在各種運行環境(Local、 Dev、 Prod)中,實作這些的一個方法是通過內部配置,這是一個致命糟糕實踐,它會導致嚴重的安全風險,因為生產憑證很容易遭到破壞,此外,配置引數的任何更改都需要重新構建應用程式,這在在微服務架構中會更加嚴峻,因為我們可能擁有數百個服務,

更好的方法是將所有配置外部化,使得構建程序與運行環境分離,生產的組態檔只在運行時或通過環境變數使用,從而最小化了安全風險,

優點

  • 生產配置不屬于代碼庫,因而最小化了安全漏洞,

  • 修改配置引數不需要重新構建應用程式,

缺點

  • 我們需要選擇一個支持外部化配置的框架,

何時使用外部化配置

  • 任何重要的生產應用程式都必須使用外部化配置,

何時不宜使用外部化配置

  • 在驗證概念的開發中,

可用技術示例

幾乎所有企業級的現代框架都支持外部化配置,

延伸閱讀

微服務模式:外部化配置

一次構建,到處運行:外部化你的配置

消費端驅動的契約測驗

在微服務架構中,通常有許多有不同團隊開發的微服務,這些微型服務協同作業來滿足業務需求(例如,客戶請求),并相互進行同步或異步通信,消費端微服務的集成測驗具有挑戰性,通常用 TestDouble 以獲得更快、更低成本的測驗運行,但是 TestDouble 通常并不能代表真正的微服務提供者,而且如果微服務提供者更改了它的 API 或 訊息,那么 TestDouble 將無法確認這些,另一種選擇是進行端到端測驗,盡管它在生產之前是強制性的,但卻是脆弱的、緩慢的、昂貴的且不能替代集成測驗(Test Pyramid),

在這方面消費端驅動的契約測驗可以幫助我們,在這里,負責消費端微服務的團隊針對特定的服務端微服務,撰寫一套包含了其請求和預期回應(同步)或訊息(異步)的測驗套件,這些測驗套件稱為顯式的約定,對于微服務服務端,將其消費端所有約定的測驗套件都添加到其自動化測驗中,當特定服務端微服務的自動化測驗執行時,它將一起運行自己的測驗和約定的測驗并進行驗證,通過這種方式,契約測驗可以自動的幫助維護微服務通信的完整性,

優點

  • 如果提供程式意外更改 API 或訊息,可以被快速的自動發現,

  • 更少意外、更健壯,特別是包含大量微服務的企業應用程式,

  • 改善團隊自主性,

缺點

  • 需要額外的作業來開發和集成微服務服務端的契約測驗,因為他們可能使用完全不同的測驗工具,

  • 如果契約測驗與真實服務情況不匹配,將可能導致生產故障,

何時使用需求驅動的契約測驗

  • 在大型企業業務應用程式中,通常由不同的團隊開發不同服務,

何時不宜使用消費端驅動的契約測驗

  • 所有微服務由同一團隊負責開發的小型簡單的應用程式,

  • 如果服務端微服務是相對穩定的,并且不處在活躍的開發狀態,

可用技術示例

Pact, Postman, Spring Cloud Contract

延伸閱讀

需求驅動契約:一種服務演進模式

微服務模式:服務集成契約測驗

什么是消費端驅動的契約測驗?

----------------------------------
大家好,我是流水,一個資深的IT從業人員和架構師. 非常高興您能搜索到,并看到這篇文章,希望這篇文章的內容能給您帶來新的知識和幫助,

也歡迎掃描以下的二維碼或微信搜索 “superxtech”,關注我的微信公眾號 , 我會把更多更好的IT領域技術知識帶給您!

----------------------------------

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267066.html

標籤:其他

上一篇:鴻蒙內核原始碼分析(例外接管篇) | 社會很單純 , 復雜的是人 | 中文注解HarmonyOS原始碼 | v39.02

下一篇:SpringMVC作業流程 -- 詳解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more