SlideShare a Scribd company logo
1 of 40
Download to read offline
軟體架構模式
Software Architecture Patterns



2015.05.11
Jack Yu
Software
Architecture 

Patterns
出版社:歐萊禮
出版時間:2015.02
作者:Mark Richards
⾴頁數:55 (含封⾯面)
⼤大綱
• 介紹
• 分層架構 (Layered Architecture)
• 事件驅動架構 (Event-Driven Architecture)
• 微核⼼心架構 (Microkernel Architecture)
• 微服務架構 (Microservices Architecture)
• 基於空間的架構 (Space-Based Architecture)
– Wikipedia
“Software architecture is the high level
structure of a software system”
– Wikipedia
“Architectural pattern is a general,
reusable solution to a commonly occurring
problem in software architecture within a
given context.”
為什麼要談軟體架構模式?
• 避免陷⼊入⼤大泥球反模式 (big ball of mud anti-pattern)
• 開發低耦合 、強健的、容易修改、有清楚的開發⽅方向的軟體
• 可以說出&討論應⽤用程式的架構特性
• 選擇對的架構來達成業務需求和⺫⽬目標
請暫時忘記實作,
以減少不必要的煩惱
分層架構
Layered Architecture Pattern
分層架構
• 也叫做多層架構模式 (N-tier architecture pattern)
• 多數 Java EE 的⾮非官⽅方標準
• 架構師、設計師、開發⼈人員最熟悉的架構
• 和傳統 IT 通訊、組織架構最接近 (Conway’s law)
模式描述
• 分層架構模式內的組件被劃分到多個
架構層,每⼀一層都代表應⽤用所需要的
特定⾓角⾊色和職能
• 分層數量不限,但⼀一般分為四層:表
現層、業務層、持久層和資料庫層
重點:關注分離 (separation of concerns)
封閉 vs. 開放
• 封閉層 (Closed Layer) 代表請求必須
⼀一層⼀一層的傳遞,達到隔離的效果
• 限制修改的影響範圍只有上下層,降
低組件之間的耦合
• 重構影響低
封閉 vs. 開放
• 開放層 (Open Layer) 代表請求可以
直接穿越它,存取其下的架構層
• 通常⽤用於提供共⽤用服務/資源
• 定義⼀一層的開放或封閉,確定了請求
流動的⽅方式
• 所有開發⼈人員都要理解這些限制
範例
筆記
• 如果你不知道要⽤用什麼架構,分層架構適合你。
• 避免污⽔水池反模式 (architecture sinkhole anti-pattern)
• 避免⼤大部分的請求在某些架構層總是直接流過
• 80-20 法則
模式分析
評價 原因
整體靈活性 低 修改費時、較為笨重、可能出現⾼高耦合
是否易於佈署 低 ⼩小改動可能影響到整體,需要有計劃進⾏行
可測試性 ⾼高 可分別測試或⽤用 mock 代替
性能 低 ⼀一次業務請求需要穿越⼤大量的架構層
伸縮性 低 架構層間的緊密耦合、通常規模較⼤大
是否容易開發 是 熟悉度⾼高、和組織分層相近
事件驅動架構
Event-Driven Architecture
事件驅動架構
• 主流的異步分發事件架構模式
• 由單⼀一⺫⽬目的、⾼高度解耦合的的事件處理組件 (Event Processor) 構成
• 常⽤用於需要⾼高度可擴展的應⽤用中
• 從⼩小⾄至⼤大型的應⽤用都表現不錯
• 有兩種拓撲結構:中介 (Mediator) 和 代理 (Broker)
中介 (Mediator)拓撲
• 適⽤用於處理事件有相依性和需要協調
的場景
• 組件:
• 事件列隊 (event queue)
• 事件通道 (event channel)
• 事件處理器 (event processor)
• 例如:Apache Camel、Apache
ODE+BPEL
初始事件
待處理
事件
範例
代理(Broker)拓撲
• 適⽤用於事件較為簡單,⾼高效能要求的
場景。
• 沒有核⼼心的事件中介,改由輕量的消
息列隊取代。
• 組件:
• 代理 (Broker)
• 事件處理器 (Event Process)
• 例如:ActiveMQ, ZeroMQ, etc.
Broker
範例
筆記
• 異步處理會造成實現上的困難
• 要處理遠程操作的可⽤用性,各個組件操作失敗的處理
• 顆粒度需要仔細思考
• 不⽀支援交易 (transaction)
• 要⼀一開始就定下事件處理的協定和格式
模式分析
評價 原因
整體靈活性 ⾼高 事件處理器⾼高度解耦合
是否易於佈署 ⾼高 事件處理器⾼高度解耦合
可測試性 低
雖然單元測試簡單,但整合測試困難 

(需要整體+異步問題)
性能 ⾼高 ⾼高度解耦合+異步處理
伸縮性 ⾼高 事件處理器⾼高度解耦合
是否容易開發 否 需考慮異步處理、訂定協定和流程、處理錯誤狀況
微核⼼心架構
Microkernel Architecture
微核⼼心架構
• 從 OS 得名,也稱作插件應⽤用架構
• 可以透過插件的⽅方式添加額外的特性到核⼼心系統
• 具備良好的擴展性和隔離性
• 例如 Eclipse IDE
微核⼼心架構
• 組成:核⼼心系統+插件組件
• 核⼼心系統通常只包含能讓系統運作的
最⼩小功能
• 從應⽤用⾓角度來看,核⼼心系統定義了業
務邏輯,⽽而插件則實作了具體業務邏
輯
• 插件是⽤用於提供新特性的獨⽴立模組,
但也可以互相溝通 (不建議)
核⼼心與插件的互動
• 實現上沒有限制
• 核⼼心系統存取插件可能是透過插件註冊表
• 註冊表提供插件名稱、傳輸協定、輸⼊入輸出規範
• 例如: SOAP + WSDL
• 插件連接核⼼心可能是⽤用:OSGi、Message Queue、Web service、DI
範例
筆記
• 微核⼼心架構可以嵌⼊入到另⼀一種架構中
• 良好⽀支援漸進式設計和增量開發
• 對於產品導向的應⽤用來說,微核⼼心架構是第⼀一選擇
模式分析
評價 原因
整體靈活性 ⾼高 插件兼的鬆耦合,可以隔離變化。
是否易於佈署 ⾼高 依據實作,插件可以⽀支援熱差拔
可測試性 ⾼高 各個插件可以分開測試。可使⽤用 mock
性能 ⾼高 透過插件調整可以只包含必要的模組
伸縮性 低 實現是基於產品,⾮非此架構特⻑⾧長
是否容易開發 否 需要設計和管理規約,版本控制,考慮顆粒度
微服務架構
Microservice Architecture
微服務架構
• 最近正夯,⽤用於取代 SOA,但仍在發展中
• 採⽤用獨⽴立佈署、分佈式的服務組件(service component),透過簡化的
傳輸⽅方式互動
• ⾼高擴展性、鬆耦合,容易佈署
• 如何正確設計組件的顆粒度是最⼤大難度
模式描述
• 是⼀一個演化⽽而來的架構
• 透過切割組件,解決分層架構環環
相扣的問題
• 透過概念簡化來消除 SOA 的複雜
度
• 常⾒見拓撲
• 基於 REST API
• 基於 REST 應⽤用
• 集中式消息
基於 REST API 拓撲
• 每⼀一個服務組件皆透過單獨佈署的
Web 服務,以 REST API 的⽅方式提供
服務。
• 顆粒度⾮非常的細 (也是名稱由來)
• 許多⼤大型企業提供此類服務
基於 REST 應⽤用拓撲
• 透過 Web 或是胖客⼾戶端來處理請
求,⽽而⾮非 API。
• 相較於前者,此實現的服務組件顆粒
度較⼤大
• 常⾒見於中⼩小型企業,或複雜度較低的
應⽤用
集中式消息實現
• 透過集中式的消息代理來存取服務。
• 適⽤用於較⼤大型的業務應⽤用,⽀支援排隊
機制、異步、監控、錯誤處理、負載
均衡和增強可擴展性。
• 可以透過代理群集來處理單點問題
決定顆粒度
• 此架構最⼤大挑戰就是決定服務組件的顆粒度
• 顆粒度過⼤大,此服務的好處都享受不到
• 顆粒度過細會造成使⽤用上的複雜度、效能犧牲
• 觀察
• 需要在應⽤用接⼝口中調⽤用多個服務=>可能切太細
• 在服務組件間需要通訊=>可能切太細
筆記
• 怎麼調整顆粒度都不對,代表你的應⽤用不適合
• 微服務架構提供了實時佈署能⼒力
• 他是分佈式架構,和事件驅動模式會有⼀一些共同的問題
模式分析
評價 原因
整體靈活性 ⾼高 服務組件⾼高度解耦合
是否易於佈署 ⾼高 服務組件⾼高度解耦合
可測試性 ⾼高
服務組件可分開測試,且相依度不⾼高,可以減少對整體進
⾏行測試的負擔
性能 低 分佈式特性不適合⾼高性能
伸縮性 ⾼高 服務組件⾼高度解耦合
是否容易開發
⾼高
功能被隔離成不同服務組件,開發範圍⼩小,且互相不影響
參考資料
• http://www.oreilly.com/programming/free/software-architecture-patterns.csp
• http://en.wikipedia.org/wiki/Software_architecture
• http://en.wikipedia.org/wiki/Architectural_pattern
• http://colobu.com/2015/04/08/software-architecture-patterns/
• https://github.com/bboyfeiyu/android-tech-frontier/tree/master/software-
architecture-patterns
• http://jonathanspeaking.blogspot.tw/2010/11/conways-law.html

More Related Content

What's hot

抽象階梯 導讀-陳詩雅
抽象階梯 導讀-陳詩雅抽象階梯 導讀-陳詩雅
抽象階梯 導讀-陳詩雅
Jeacy Wu
 
소프트웨어 테스팅
소프트웨어 테스팅소프트웨어 테스팅
소프트웨어 테스팅
영기 김
 

What's hot (20)

katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
[패스트캠퍼스] 야구선수 연봉예측
[패스트캠퍼스] 야구선수 연봉예측[패스트캠퍼스] 야구선수 연봉예측
[패스트캠퍼스] 야구선수 연봉예측
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
아마존 클라우드와 함께한 1개월, 쿠키런 사례중심 (KGC 2013)
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
Springboot Microservices
Springboot MicroservicesSpringboot Microservices
Springboot Microservices
 
抽象階梯 導讀-陳詩雅
抽象階梯 導讀-陳詩雅抽象階梯 導讀-陳詩雅
抽象階梯 導讀-陳詩雅
 
Azure Durable Functions
Azure Durable FunctionsAzure Durable Functions
Azure Durable Functions
 
Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기
 
모바일 메신저 아키텍쳐 소개
모바일 메신저 아키텍쳐 소개모바일 메신저 아키텍쳐 소개
모바일 메신저 아키텍쳐 소개
 
Monolith to Microservices - O’Reilly Oscon
Monolith to Microservices - O’Reilly OsconMonolith to Microservices - O’Reilly Oscon
Monolith to Microservices - O’Reilly Oscon
 
認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門
 
소프트웨어 테스팅
소프트웨어 테스팅소프트웨어 테스팅
소프트웨어 테스팅
 
Art of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices AntipatternsArt of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices Antipatterns
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
Searchable Snapshot でコスト削減
Searchable Snapshot でコスト削減Searchable Snapshot でコスト削減
Searchable Snapshot でコスト削減
 
[Gaming on AWS] 넥슨 - AWS를 활용한 모바일 게임 서버 개발: 퍼즐 주주의 사례
[Gaming on AWS] 넥슨 - AWS를 활용한 모바일 게임 서버 개발: 퍼즐 주주의 사례[Gaming on AWS] 넥슨 - AWS를 활용한 모바일 게임 서버 개발: 퍼즐 주주의 사례
[Gaming on AWS] 넥슨 - AWS를 활용한 모바일 게임 서버 개발: 퍼즐 주주의 사례
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)
 
BDD Approach with Karate Framework in Service Tests
BDD Approach with Karate Framework in Service TestsBDD Approach with Karate Framework in Service Tests
BDD Approach with Karate Framework in Service Tests
 

Viewers also liked

Viewers also liked (11)

如何培養架構性思考(談軟體架構師必經之路)
如何培養架構性思考(談軟體架構師必經之路)如何培養架構性思考(談軟體架構師必經之路)
如何培養架構性思考(談軟體架構師必經之路)
 
軟體開發之路甘苦談(Gelis)
軟體開發之路甘苦談(Gelis)軟體開發之路甘苦談(Gelis)
軟體開發之路甘苦談(Gelis)
 
活用 Application insight
活用 Application insight活用 Application insight
活用 Application insight
 
Natural Interfaces for Augmented Reality
Natural Interfaces for Augmented RealityNatural Interfaces for Augmented Reality
Natural Interfaces for Augmented Reality
 
Information system architecture
Information system architectureInformation system architecture
Information system architecture
 
How to make ir sensor using bread board
How to make ir sensor using bread boardHow to make ir sensor using bread board
How to make ir sensor using bread board
 
Wireless Sensor System Architecture
Wireless Sensor System ArchitectureWireless Sensor System Architecture
Wireless Sensor System Architecture
 
使用 DesignSpark PCB 軟體製作感應燈電路板
使用 DesignSpark PCB 軟體製作感應燈電路板使用 DesignSpark PCB 軟體製作感應燈電路板
使用 DesignSpark PCB 軟體製作感應燈電路板
 
用20分鐘搞懂 《系統分析、軟體工程、專案管理與設計模式》
用20分鐘搞懂   《系統分析、軟體工程、專案管理與設計模式》用20分鐘搞懂   《系統分析、軟體工程、專案管理與設計模式》
用20分鐘搞懂 《系統分析、軟體工程、專案管理與設計模式》
 
用十分鐘搞懂《離散數學》
用十分鐘搞懂《離散數學》用十分鐘搞懂《離散數學》
用十分鐘搞懂《離散數學》
 
System Analysis and Design
System Analysis and DesignSystem Analysis and Design
System Analysis and Design
 

Similar to 軟體架構模式

企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
Paul Chao
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
Paul Chao
 
从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1
天青 王
 
事件驱动编程
事件驱动编程事件驱动编程
事件驱动编程
banq jdon
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
pan weizeng
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计
YANGL *
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAE
q3boy
 

Similar to 軟體架構模式 (20)

微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp
 
廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
 
去哪儿Ugc平台设计经验
去哪儿Ugc平台设计经验去哪儿Ugc平台设计经验
去哪儿Ugc平台设计经验
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
 
从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1
 
事件驱动编程
事件驱动编程事件驱动编程
事件驱动编程
 
京东实时消息队列JDQ技术实践与探索
京东实时消息队列JDQ技术实践与探索京东实时消息队列JDQ技术实践与探索
京东实时消息队列JDQ技术实践与探索
 
Agile development
Agile developmentAgile development
Agile development
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?
 
ASP.Net MVC Framework
ASP.Net MVC FrameworkASP.Net MVC Framework
ASP.Net MVC Framework
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
 
纵览Loadrunner核心功能
纵览Loadrunner核心功能纵览Loadrunner核心功能
纵览Loadrunner核心功能
 
众行业公司系统架构案例介绍
众行业公司系统架构案例介绍众行业公司系统架构案例介绍
众行业公司系统架构案例介绍
 
202203-技术沙龙-k8s-v1.pptx
202203-技术沙龙-k8s-v1.pptx202203-技术沙龙-k8s-v1.pptx
202203-技术沙龙-k8s-v1.pptx
 
持續交付高品質程式碼 公開版
持續交付高品質程式碼 公開版持續交付高品質程式碼 公開版
持續交付高品質程式碼 公開版
 
我們與Azure DevOps的距離
我們與Azure DevOps的距離我們與Azure DevOps的距離
我們與Azure DevOps的距離
 
1 opening-jeff-storagesummit-347340-zhs
1 opening-jeff-storagesummit-347340-zhs1 opening-jeff-storagesummit-347340-zhs
1 opening-jeff-storagesummit-347340-zhs
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAE
 

軟體架構模式