當代的軟體開發與系統維運工程 Modern Application Development
2021-12-27
筆記應用程式現代化所整合的知識與工具 🐳
說明
項目 | 以往 | 趨勢 |
---|---|---|
架構 | 單體式 | 微服務 |
部署 | 實體機/虛擬機 | 容器 |
開發 | 瀑布式 | 敏捷 |
維護 | 瀑布式 | 敏捷 |
環境 | 地端 | 雲端 / 混合 |
介接 | 資料庫 | 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 進行系統化、自動化的管理。
Container (Docker)
容器是新的虛擬化方式,並將軟體包裝成映像檔 (image) 並置於容器當中,容器的輕巧、快速啟動的性質特別適合用於無狀態的應用程式服務,而不同於以往虛擬化是獨立的作業系統,容器是共用作業系統的方式。
容器化技術與傳統虛擬機的方式相比有下列優勢:
項目 | 容器 | 虛擬機 |
---|---|---|
啟動速度 | Sesc | Mins |
記憶體耗用 | 少 | 多 |
儲存空間 | MBs | GBs |
數量 | 1000 | 10 |
隔離 | 安全隔離 | 完全隔離 |
複製遷移 | 超快 | 快 |
CI / CD
Continuous Integration, CI
持續整合,強調團隊的開發人員參與合作的關係,藉由提高程式碼的整合頻率,避免大規模整合衍生的問題。在整合的過程所加入的單元測試、安全性測試,可以提升程式碼的穩定、安全性與品質。
為了達到持續整合,必有由伺服器端負責版本控制維護、自動建置與測試機制、讓開發人員交流開發情況。
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 邁向現代化開發維運整合之路