當代的軟體開發與系統維運工程 Modern Application Development

2021-12-27

筆記應用程式現代化所整合的知識與工具 🐳

logo

說明

項目 以往 趨勢
架構 單體式 微服務
部署 實體機/虛擬機 容器
開發 瀑布式 敏捷
維護 瀑布式 敏捷
環境 地端 雲端 / 混合
介接 資料庫 API
規模 固定 彈性

當代開發與系統維運的進化方向

軟體交付:瀑布 -> 敏捷 -> DevOps
軟體架構:單體式 -> SOA / N-Tier -> Microservices
服務設備:實體機 -> 虛擬機 -> 容器

微服務, MicrosService

相較於以往單體式 (Monolith) 將所有元件集中的設計方式,微服務將元件切割彼此溝通來達成服務,而如何決定微服務的劃分範疇?則透過領域驅動設計 (Domain Driven Design, DDD) 來達成。

微服務的一個性質是由原本單一資料庫,切割為多個服務,服務本身有自己的資料模型以及資料庫。

微服務要解決的問題

達成分散式、高可用性、模組化的應用系統架構。

微服務的模組化能夠為系統開發帶來好處,因為服務被分割、邏輯單一,同時各個服務可以採取不同的技術 (.NET & JAVA),只要保持服務之間的溝通介面一致,模組化的服務更適合快速進行部署以及易於進行安全性測試。

微服務對於營運管理上,能夠帶來管理上的便利以及資源的最大使用效率,結合容器化技術 (Docker) 所達成的分散式,其虛擬化使用的資源較傳統虛擬化的方式更少,且以映像檔的部署方式更易於快速擴展部署、水平式擴大;同時微服務也更易於資源的監測 (Monitor)。

微服務的挑戰在於 CAP,也就是 Consistency、Availability 以及 Partition-tolerance 三者要兼顧的困難。

Consistency
保證所有節點的資料數據都是一致
Availability
保證每次的請求行為都能得到回應
Partition-tolerance
保證系統因網路通訊問題時,分散的架構服務仍能維持運作

領域驅動設計, DDD

Kubernetes, K8S

改採容器的部署方式後,隨著容器數量的增加,藉由容器管理工具如 Kubernetes 進行系統化、自動化的管理。

K8S is not panacea and elixir.

Container (Docker)

容器是新的虛擬化方式,並將軟體包裝成映像檔 (image) 並置於容器當中,容器的輕巧、快速啟動的性質特別適合用於無狀態的應用程式服務,而不同於以往虛擬化是獨立的作業系統,容器是共用作業系統的方式。

容器化技術與傳統虛擬機的方式相比有下列優勢:

項目 容器 虛擬機
啟動速度 Sesc Mins
記憶體耗用
儲存空間 MBs GBs
數量 1000 10
隔離 安全隔離 完全隔離
複製遷移 超快

圖片來源:docker.com

CI / CD

Continuous Integration, CI

TL;DR; 持續整合在解決協作開發,在版本控制與合併衝突帶來的痛點,藉由持續整合以消弭痛點並為快速交付定下基礎。

持續整合,強調團隊的開發人員參與合作的關係,藉由提高程式碼的整合頻率,避免大規模整合衍生的問題。在整合的過程所加入的單元測試、安全性測試,可以提升程式碼的穩定、安全性與品質。

為了達到持續整合,必有由伺服器端負責版本控制維護、自動建置與測試機制、讓開發人員交流開發情況。

CI 的重要性

  • 保證 Commit 的程式碼可以編譯
  • 及早發現程問題、改善問題
  • 讓協作衍生的問題降低 (衝突)
  • 提高開發者生產力 (自動化編譯、測試、程式碼分析)
  • 為快速部署與快速交付作為基礎

CI 的關鍵字

  • Pipelines
  • Test
  • Automation
  • Source Control
  • Build Agent

Continuous Delivery, CD

持續交付需要人為把關,經由人員核准後再將部署進入自動部署作業至正式環境。

Continuous Deployment, CD

持續部署是全自動的部署流程,通過整合、編譯與測試的軟體成品會自動部署到正式環境。

Code Analysis

在 CI 階段,程式碼的分析是除建置與測試外另一個要達成的目標。分析包含對於程式碼的 Coding Style、Best Practices 以及 Security & Vulnerability 去檢視。

使用的工具包含

Category Tool
Coding Style && Best Practices Lint, ESLint, SonatLint
Security CheckMarx, Fortify, WhiteSource

Unit Test

在 CI 階段,除建置與程式碼分析外,測試也是其中一項重點。而 Unit Test 是經常使用,對於程式碼中的最小單元 (函式、模組) 進行功能正確性的檢驗。

Unit Test -> Integration Test -> System Test

DevOps

DevOps 融合開發、部署與維運三個階段,具體可以再細分為:

  • 規劃 Plan
  • 開發 Code
  • 建置 Build
  • 測試 Test
  • 部署 Deploy
  • 維運 Operator
  • 監控 Monitor

其中一個觀念是融合「開發人員」、「Infra 人員」與「系統管理人員」為一體。而為達成這個融合目標,將藉由工具平台達到流程步驟自動化,並促成三方的溝通機制,在組織的結構與流程也必須有相對應的調整,最終的追求數位轉型下,資訊系統能扮演好營利與服務的重要角色。

How To Learn DevOps 如何學習 DevOps 邁向現代化開發維運整合之路

參考資料

應用程式現代化 | IBM

何謂微服務 | IBM

何謂 DevOps | IBM

何謂持續整合 | IBM

什麼是持續整合 | Amazon

什麼是持續交付 | Amazon

何謂持續部署 | IBM

何謂 Docker | IBM

何謂 kubernetes | IBM

微服務架構探討與建置 | 國家災害防救科技中心