architecture-patterns by miles990/claude-software-skills
npx skills add https://github.com/miles990/claude-software-skills --skill architecture-patterns架构模式为构建软件系统提供了经过验证的解决方案。选择合适的架构对于可扩展性、可维护性和团队生产力至关重要。
描述:包含所有应用程序功能的单一可部署单元。
关键特性:
适用场景:
最佳实践:
src/
├── modules/ # 基于功能的组织
│ ├── users/
│ ├── orders/
│ └── products/
├── shared/ # 横切关注点
└── infrastructure/ # 外部服务
描述:由独立可部署服务组成的分布式系统。
关键特性:
适用场景:
:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 组件 | 用途 | 工具 |
|---|---|---|
| API 网关 | 入口点,路由 | Kong, AWS API Gateway |
| 服务发现 | 服务注册 | Consul, Kubernetes DNS |
| 配置管理 | 集中式配置 | Spring Cloud Config, Consul |
| 熔断器 | 容错 | Resilience4j, Hystrix |
最佳实践:
描述:通过事件进行通信的系统。
关键模式:
| 模式 | 描述 | 适用场景 |
|---|---|---|
| 事件溯源 | 将状态存储为事件 | 审计追踪,时间查询 |
| CQRS | 分离读写模型 | 高读取负载 |
| Saga | 分布式事务 | 跨服务工作流 |
事件溯源示例:
// Events are the source of truth
interface OrderEvent {
id: string;
type: 'OrderCreated' | 'ItemAdded' | 'OrderShipped';
timestamp: Date;
payload: unknown;
}
// Rebuild state from events
function rebuildOrder(events: OrderEvent[]): Order {
return events.reduce((order, event) => {
switch (event.type) {
case 'OrderCreated': return { ...event.payload };
case 'ItemAdded': return { ...order, items: [...order.items, event.payload] };
case 'OrderShipped': return { ...order, status: 'shipped' };
}
}, {} as Order);
}
描述:无需服务器管理的云托管执行环境。
关键特性:
注意事项:
| 方面 | 影响 |
|---|---|
| 冷启动 | 首次调用有 100ms-2s 的延迟 |
| 超时 | 通常最大执行时间为 15-30 分钟 |
| 状态 | 必须使用外部存储 |
| 供应商锁定 | 平台特定功能 |
最佳实践:
描述:以领域为中心、依赖倒置的架构。
层次结构:
┌──────────────────────────────────────┐
│ Frameworks & Drivers │ ← 外部(数据库,Web,UI)
├──────────────────────────────────────┤
│ Interface Adapters │ ← 控制器,网关
├──────────────────────────────────────┤
│ Application Business │ ← 用例
├──────────────────────────────────────┤
│ Enterprise Business │ ← 实体,领域规则
└──────────────────────────────────────┘
依赖规则:依赖指向内部。内层对外层一无所知。
描述:与业务领域对齐的架构。
战略模式:
| 模式 | 目的 |
|---|---|
| 限界上下文 | 清晰的领域边界 |
| 上下文映射 | 上下文之间的关系 |
| 通用语言 | 共享词汇表 |
战术模式:
| 模式 | 目的 |
|---|---|
| 实体 | 具有标识的对象 |
| 值对象 | 不可变的描述符 |
| 聚合 | 一致性边界 |
| 仓储 | 类似集合的持久化 |
| 领域事件 | 已发生的事情 |
START
│
├─ 团队规模 < 10? ──────────────────→ 单体
│
├─ 需要独立部署? ────→ 微服务
│
├─ 需要审计追踪? ────────────→ 事件溯源
│
├─ 可变/不可预测的负载? ─────→ 无服务器
│
├─ 复杂的业务逻辑? ──────────→ 整洁架构 + DDD
│
└─ 默认 ──────────────────────────→ 模块化单体
问题:为简单的应用程序从微服务开始 解决方案:从单体开始,在边界清晰时再提取服务
问题:必须一起部署的微服务 解决方案:确保服务真正独立,并具有清晰的 API 契约
问题:跨服务共享数据库 解决方案:每个服务拥有自己的数据,使用事件进行同步
描述:通过端口(接口)和适配器(实现)将应用程序核心与外部关注点隔离。
结构:
┌─────────────────────────────────────────────────────────────┐
│ 驱动适配器 │
│ (REST API, CLI, GraphQL, 消息消费者) │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ 输入端口 │
│ (用例接口) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 应用程序核心 │
│ (领域逻辑,实体) │
│ │
├─────────────────────────────────────────────────────────────┤
│ 输出端口 │
│ (仓储,网关接口) │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ 被驱动适配器 │
│ (数据库,外部 API,消息发布者) │
└─────────────────────────────────────────────────────────────┘
TypeScript 示例:
// Port (Interface)
interface OrderRepository {
save(order: Order): Promise<void>;
findById(id: string): Promise<Order | null>;
}
// Adapter (Implementation)
class PostgresOrderRepository implements OrderRepository {
constructor(private db: Database) {}
async save(order: Order): Promise<void> {
await this.db.query('INSERT INTO orders...', [order]);
}
async findById(id: string): Promise<Order | null> {
const row = await this.db.query('SELECT * FROM orders WHERE id = $1', [id]);
return row ? this.toDomain(row) : null;
}
}
// Use Case (Application Core)
class CreateOrderUseCase {
constructor(private orderRepo: OrderRepository) {} // Depends on Port, not Adapter
async execute(input: CreateOrderInput): Promise<Order> {
const order = new Order(input);
await this.orderRepo.save(order);
return order;
}
}
优势:
描述:具有严格模块边界的单体,为潜在的微服务提取做准备。
关键特性:
结构:
src/
├── modules/
│ ├── users/
│ │ ├── api/ # 模块的公共 API
│ │ │ └── UserService.ts
│ │ ├── internal/ # 私有实现
│ │ │ ├── UserRepository.ts
│ │ │ └── UserEntity.ts
│ │ └── index.ts # 仅导出公共 API
│ ├── orders/
│ │ ├── api/
│ │ │ └── OrderService.ts
│ │ ├── internal/
│ │ └── index.ts
│ └── shared/ # 横切实用工具
├── infrastructure/
│ ├── database/
│ ├── messaging/
│ └── http/
└── main.ts
模块通信规则:
// ✅ 良好:使用公共 API
import { UserService } from '@modules/users';
const user = await userService.getById(id);
// ❌ 不良:直接访问内部
import { UserRepository } from '@modules/users/internal/UserRepository';
强制执行:
// eslint rules or ts-paths to prevent internal imports
{
"rules": {
"no-restricted-imports": ["error", {
"patterns": ["@modules/*/internal/*"]
}]
}
}
描述:通过将流量路由到新实现,逐步替换遗留系统。
迁移过程:
Phase 1: Facade
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ Client │────→│ Facade │────→│ Legacy │
└─────────┘ └─────────┘ │ System │
└─────────────┘
Phase 2: Partial Migration
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ Client │────→│ Facade │──┬─→│ Legacy │
└─────────┘ └─────────┘ │ └─────────────┘
│ ┌─────────────┐
└─→│ New System │
└─────────────┘
Phase 3: Complete Migration
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ Client │────→│ Facade │────→│ New System │
└─────────┘ └─────────┘ └─────────────┘
实现:
class PaymentFacade {
constructor(
private legacyPayment: LegacyPaymentService,
private newPayment: NewPaymentService,
private featureFlags: FeatureFlags
) {}
async processPayment(payment: Payment): Promise<Result> {
// Gradually migrate traffic
if (this.featureFlags.isEnabled('new-payment-system', payment.userId)) {
return this.newPayment.process(payment);
}
return this.legacyPayment.process(payment);
}
}
描述:为每种前端类型(Web、移动端等)提供专用的后端。
结构:
┌─────────────┐
│ Web Client │
└──────┬──────┘
│
┌──────▼──────┐
│ Web BFF │
└──────┬──────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ User Service│ │Order Service│ │Product Svc │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└───────────────────┼───────────────────┘
│
┌──────▼──────┐
│ Mobile BFF │
└──────┬──────┘
│
┌──────▼──────┐
│Mobile Client│
└─────────────┘
优势:
何时使用:
| 场景 | 建议 |
|---|---|
| 单一客户端类型 | 跳过 BFF |
| Web + 移动端需求相同 | 单一 API 网关 |
| 每个平台有不同的用户体验 | 独立的 BFF |
| 每个前端有多个团队 | 专用的 BFF |
| 模式 | 复杂度 | 可扩展性 | 团队规模 | 最适合 |
|---|---|---|---|---|
| 单体 | 低 | 垂直 | 小(2-10) | MVP,简单应用 |
| 模块化单体 | 中 | 垂直 | 中(5-20) | 成长中的应用 |
| 微服务 | 高 | 水平 | 大(20+) | 复杂领域 |
| 无服务器 | 中 | 自动 | 任意 | 事件驱动,可变负载 |
| 事件驱动 | 高 | 水平 | 中-大 | 异步工作流 |
选择架构时,记录决策:
# ADR-001: 选择模块化单体
## 状态
已接受
## 背景
- 8 名开发者的团队
- 3 个月内完成 MVP 的截止日期
- 领域边界不确定
- 有限的 DevOps 资源
## 决策
采用具有严格边界的模块化单体
## 后果
### 积极方面
- 更快的初始开发
- 更简单的部署
- 后续可以提取服务
### 消极方面
- 单点故障
- 扩展仅限于垂直方向
- 需要遵守模块边界
## 考虑的替代方案
1. 微服务 - 对团队规模来说太复杂
2. 传统单体 - 没有扩展路径
┌─────────────────────────────────────────────────────────────────┐
│ 架构演进路径 │
│ │
│ 单体 ──→ 模块化单体 ──→ 微服务 │
│ │ │ │ │
│ │ │ ▼ │
│ │ │ 事件驱动 / CQRS │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ [简单] [成长中] [复杂/大规模] │
│ │
│ 提示:不要跳过步骤。每个阶段都教授领域边界。 │
└─────────────────────────────────────────────────────────────────┘
症状:没有清晰的结构,一切依赖于一切 修复:引入模块边界,应用整洁架构原则
症状:对每个项目使用相同的架构 修复:评估需求,使用决策指南
症状:架构比领域所需的更复杂 修复:从简单开始,仅在需要时增加复杂性
症状:为学习而非解决问题选择技术 修复:使架构与团队技能和项目需求对齐
症状:核心逻辑与云提供商紧密耦合 修复:使用六边形架构,抽象供应商特定代码
| 模式 | 延迟 | 吞吐量 | 冷启动 |
|---|---|---|---|
| 单体 | 低 | 高 | 不适用 |
| 微服务 | 中(网络) | 高(分布式) | 不适用 |
| 无服务器 | 可变 | 自动扩展 | 100ms-2s |
| 事件驱动 | 较高(异步) | 非常高 | 取决于 |
Unit Tests → Integration Tests → E2E Tests
70% 20% 10%
Unit Tests → Contract Tests → Integration → E2E
60% 20% 15% 5%
// Contract Test Example (Pact)
const provider = new Pact({ consumer: 'OrderService', provider: 'UserService' });
await provider.addInteraction({
state: 'user exists',
uponReceiving: 'get user request',
withRequest: { method: 'GET', path: '/users/123' },
willRespondWith: { status: 200, body: { id: '123', name: 'John' } }
});
每周安装数
99
仓库
GitHub 星标数
8
首次出现
Jan 24, 2026
安全审计
安装于
opencode96
gemini-cli91
codex88
github-copilot85
cursor85
claude-code79
Architecture patterns provide proven solutions for structuring software systems. Choosing the right architecture is crucial for scalability, maintainability, and team productivity.
Description : Single deployable unit containing all application functionality.
Key Features :
Use Cases :
Best Practices :
src/
├── modules/ # Feature-based organization
│ ├── users/
│ ├── orders/
│ └── products/
├── shared/ # Cross-cutting concerns
└── infrastructure/ # External services
Description : Distributed system of independently deployable services.
Key Features :
Use Cases :
Key Components :
| Component | Purpose | Tools |
|---|---|---|
| API Gateway | Entry point, routing | Kong, AWS API Gateway |
| Service Discovery | Service registration | Consul, Kubernetes DNS |
| Config Management | Centralized config | Spring Cloud Config, Consul |
| Circuit Breaker | Fault tolerance | Resilience4j, Hystrix |
Best Practices :
Description : Systems communicating through events.
Key Patterns :
| Pattern | Description | Use Case |
|---|---|---|
| Event Sourcing | Store state as events | Audit trails, temporal queries |
| CQRS | Separate read/write models | High-read workloads |
| Saga | Distributed transactions | Cross-service workflows |
Event Sourcing Example :
// Events are the source of truth
interface OrderEvent {
id: string;
type: 'OrderCreated' | 'ItemAdded' | 'OrderShipped';
timestamp: Date;
payload: unknown;
}
// Rebuild state from events
function rebuildOrder(events: OrderEvent[]): Order {
return events.reduce((order, event) => {
switch (event.type) {
case 'OrderCreated': return { ...event.payload };
case 'ItemAdded': return { ...order, items: [...order.items, event.payload] };
case 'OrderShipped': return { ...order, status: 'shipped' };
}
}, {} as Order);
}
Description : Cloud-managed execution without server management.
Key Features :
Considerations :
| Aspect | Impact |
|---|---|
| Cold Start | 100ms-2s latency on first invocation |
| Timeout | Usually 15-30 min max execution |
| State | Must use external storage |
| Vendor Lock-in | Platform-specific features |
Best Practices :
Description : Dependency-inverted architecture with domain at center.
Layer Structure :
┌──────────────────────────────────────┐
│ Frameworks & Drivers │ ← External (DB, Web, UI)
├──────────────────────────────────────┤
│ Interface Adapters │ ← Controllers, Gateways
├──────────────────────────────────────┤
│ Application Business │ ← Use Cases
├──────────────────────────────────────┤
│ Enterprise Business │ ← Entities, Domain Rules
└──────────────────────────────────────┘
Dependency Rule : Dependencies point inward. Inner layers know nothing about outer layers.
Description : Architecture aligned with business domain.
Strategic Patterns :
| Pattern | Purpose |
|---|---|
| Bounded Context | Clear domain boundaries |
| Context Map | Relationships between contexts |
| Ubiquitous Language | Shared vocabulary |
Tactical Patterns :
| Pattern | Purpose |
|---|---|
| Entity | Objects with identity |
| Value Object | Immutable descriptors |
| Aggregate | Consistency boundary |
| Repository | Collection-like persistence |
| Domain Event | Something that happened |
START
│
├─ Team size < 10? ──────────────────→ Monolith
│
├─ Need independent deployments? ────→ Microservices
│
├─ Audit trail required? ────────────→ Event Sourcing
│
├─ Variable/unpredictable load? ─────→ Serverless
│
├─ Complex business logic? ──────────→ Clean Architecture + DDD
│
└─ Default ──────────────────────────→ Modular Monolith
Problem : Starting with microservices for a simple application Solution : Start monolithic, extract services when boundaries are clear
Problem : Microservices that must deploy together Solution : Ensure services are truly independent with clear API contracts
Problem : Shared database across services Solution : Each service owns its data, use events for synchronization
Description : Application core isolated from external concerns through ports (interfaces) and adapters (implementations).
Structure :
┌─────────────────────────────────────────────────────────────┐
│ Driving Adapters │
│ (REST API, CLI, GraphQL, Message Consumer) │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ Input Ports │
│ (Use Case Interfaces) │
├─────────────────────────────────────────────────────────────┤
│ │
│ APPLICATION CORE │
│ (Domain Logic, Entities) │
│ │
├─────────────────────────────────────────────────────────────┤
│ Output Ports │
│ (Repository, Gateway Interfaces) │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ Driven Adapters │
│ (Database, External APIs, Message Publisher) │
└─────────────────────────────────────────────────────────────┘
TypeScript Example :
// Port (Interface)
interface OrderRepository {
save(order: Order): Promise<void>;
findById(id: string): Promise<Order | null>;
}
// Adapter (Implementation)
class PostgresOrderRepository implements OrderRepository {
constructor(private db: Database) {}
async save(order: Order): Promise<void> {
await this.db.query('INSERT INTO orders...', [order]);
}
async findById(id: string): Promise<Order | null> {
const row = await this.db.query('SELECT * FROM orders WHERE id = $1', [id]);
return row ? this.toDomain(row) : null;
}
}
// Use Case (Application Core)
class CreateOrderUseCase {
constructor(private orderRepo: OrderRepository) {} // Depends on Port, not Adapter
async execute(input: CreateOrderInput): Promise<Order> {
const order = new Order(input);
await this.orderRepo.save(order);
return order;
}
}
Benefits :
Description : Monolith with strict module boundaries, preparing for potential microservices extraction.
Key Features :
Structure :
src/
├── modules/
│ ├── users/
│ │ ├── api/ # Public API of module
│ │ │ └── UserService.ts
│ │ ├── internal/ # Private implementation
│ │ │ ├── UserRepository.ts
│ │ │ └── UserEntity.ts
│ │ └── index.ts # Only exports public API
│ ├── orders/
│ │ ├── api/
│ │ │ └── OrderService.ts
│ │ ├── internal/
│ │ └── index.ts
│ └── shared/ # Cross-cutting utilities
├── infrastructure/
│ ├── database/
│ ├── messaging/
│ └── http/
└── main.ts
Module Communication Rules :
// ✅ Good: Use public API
import { UserService } from '@modules/users';
const user = await userService.getById(id);
// ❌ Bad: Direct access to internal
import { UserRepository } from '@modules/users/internal/UserRepository';
Enforcement :
// eslint rules or ts-paths to prevent internal imports
{
"rules": {
"no-restricted-imports": ["error", {
"patterns": ["@modules/*/internal/*"]
}]
}
}
Description : Gradually replace legacy system by routing traffic to new implementation.
Migration Process :
Phase 1: Facade
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ Client │────→│ Facade │────→│ Legacy │
└─────────┘ └─────────┘ │ System │
└─────────────┘
Phase 2: Partial Migration
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ Client │────→│ Facade │──┬─→│ Legacy │
└─────────┘ └─────────┘ │ └─────────────┘
│ ┌─────────────┐
└─→│ New System │
└─────────────┘
Phase 3: Complete Migration
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ Client │────→│ Facade │────→│ New System │
└─────────┘ └─────────┘ └─────────────┘
Implementation :
class PaymentFacade {
constructor(
private legacyPayment: LegacyPaymentService,
private newPayment: NewPaymentService,
private featureFlags: FeatureFlags
) {}
async processPayment(payment: Payment): Promise<Result> {
// Gradually migrate traffic
if (this.featureFlags.isEnabled('new-payment-system', payment.userId)) {
return this.newPayment.process(payment);
}
return this.legacyPayment.process(payment);
}
}
Description : Dedicated backend for each frontend type (web, mobile, etc.).
Structure :
┌─────────────┐
│ Web Client │
└──────┬──────┘
│
┌──────▼──────┐
│ Web BFF │
└──────┬──────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ User Service│ │Order Service│ │Product Svc │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└───────────────────┼───────────────────┘
│
┌──────▼──────┐
│ Mobile BFF │
└──────┬──────┘
│
┌──────▼──────┐
│Mobile Client│
└─────────────┘
Benefits :
When to Use :
| Scenario | Recommendation |
|---|---|
| Single client type | Skip BFF |
| Web + Mobile with same needs | Single API Gateway |
| Different UX per platform | Separate BFFs |
| Multiple teams per frontend | Dedicated BFFs |
| Pattern | Complexity | Scalability | Team Size | Best For |
|---|---|---|---|---|
| Monolith | Low | Vertical | Small (2-10) | MVPs, Simple apps |
| Modular Monolith | Medium | Vertical | Medium (5-20) | Growing apps |
| Microservices | High | Horizontal | Large (20+) | Complex domains |
| Serverless | Medium | Auto | Any | Event-driven, Variable load |
| Event-Driven | High | Horizontal | Medium-Large | Async workflows |
When choosing an architecture, document decisions:
# ADR-001: Choose Modular Monolith
## Status
Accepted
## Context
- Team of 8 developers
- MVP deadline in 3 months
- Uncertain about domain boundaries
- Limited DevOps resources
## Decision
Adopt Modular Monolith with strict boundaries
## Consequences
### Positive
- Faster initial development
- Simpler deployment
- Can extract services later
### Negative
- Single point of failure
- Scaling limited to vertical
- Need discipline for module boundaries
## Alternatives Considered
1. Microservices - Too complex for team size
2. Traditional Monolith - No path to scale
┌─────────────────────────────────────────────────────────────────┐
│ Architecture Evolution │
│ │
│ Monolith ──→ Modular Monolith ──→ Microservices │
│ │ │ │ │
│ │ │ ▼ │
│ │ │ Event-Driven / CQRS │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ [Simple] [Growing] [Complex/Scale] │
│ │
│ Tip: Don't skip steps. Each stage teaches domain boundaries. │
└─────────────────────────────────────────────────────────────────┘
Symptom : No clear structure, everything depends on everything Fix : Introduce module boundaries, apply Clean Architecture principles
Symptom : Using same architecture for every project Fix : Evaluate requirements, use decision guide
Symptom : Architecture more complex than domain requires Fix : Start simple, add complexity only when needed
Symptom : Choosing tech for learning, not solving problems Fix : Align architecture with team skills and project needs
Symptom : Core logic tightly coupled to cloud provider Fix : Use Hexagonal Architecture, abstract vendor-specific code
| Pattern | Latency | Throughput | Cold Start |
|---|---|---|---|
| Monolith | Low | High | N/A |
| Microservices | Medium (network) | High (distributed) | N/A |
| Serverless | Variable | Auto-scale | 100ms-2s |
| Event-Driven | Higher (async) | Very High | Depends |
Unit Tests → Integration Tests → E2E Tests
70% 20% 10%
Unit Tests → Contract Tests → Integration → E2E
60% 20% 15% 5%
// Contract Test Example (Pact)
const provider = new Pact({ consumer: 'OrderService', provider: 'UserService' });
await provider.addInteraction({
state: 'user exists',
uponReceiving: 'get user request',
withRequest: { method: 'GET', path: '/users/123' },
willRespondWith: { status: 200, body: { id: '123', name: 'John' } }
});
Weekly Installs
99
Repository
GitHub Stars
8
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode96
gemini-cli91
codex88
github-copilot85
cursor85
claude-code79
任务估算指南:敏捷开发故事点、计划扑克、T恤尺码法详解
10,500 周安装