Files
AIEC_Skills/codebase_architecture_analyzer_v1/reference/patterns.md
2025-11-12 10:27:56 +08:00

642 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 常见架构模式参考
本文档提供各种架构模式的识别方法和 Mermaid 模板。
## 目录
- [1. Multi-Agent 架构](#1-multi-agent-架构)
- [2. 微服务架构](#2-微服务架构)
- [3. 事件驱动架构](#3-事件驱动架构)
- [4. 数据管道ETL](#4-数据管道etl)
- [5. 分层架构MVC](#5-分层架构mvc)
- [6. CQRS 架构](#6-cqrs-架构)
---
## 1. Multi-Agent 架构
### 模式 1.1: LangGraph 编排
**代码特征**
```python
from langgraph.graph import StateGraph, END
# 定义状态
class AgentState(TypedDict):
query: str
data: List[str]
result: str
# 创建图
graph = StateGraph(AgentState)
# 添加节点Agent
graph.add_node("researcher", research_agent)
graph.add_node("writer", writing_agent)
# 添加边(流转规则)
graph.add_edge("researcher", "writer")
graph.add_conditional_edges(
"writer",
should_continue,
{
"continue": "researcher",
"end": END
}
)
# 设置入口
graph.set_entry_point("researcher")
```
**识别方法**
1. 搜索 `from langgraph``StateGraph`
2. 提取所有 `add_node()` 调用 → Agent 清单
3. 提取所有 `add_edge()``add_conditional_edges()` → 流转规则
4. 读取每个 Agent 函数的实现
**Mermaid 模板**
```mermaid
stateDiagram-v2
[*] --> Researcher: 用户查询
Researcher --> Writer: 数据收集完成
Writer --> QualityChecker: 生成草稿
QualityChecker --> Researcher: 质量不足<br/>评分 < 7
QualityChecker --> [*]: 质量通过
note right of Researcher
文件: agents/researcher.py:45
职责: 调用搜索 API 收集资料
输入: ResearchTask
输出: List[Document]
end note
note right of Writer
文件: agents/writer.py:78
职责: 基于资料生成报告
输入: List[Document]
输出: Report
end note
```
**关键信息提取**
- Agent 名称
- 文件位置(文件:行号)
- 职责描述
- 输入/输出类型
- 条件分支逻辑
---
### 模式 1.2: CrewAI 编排
**代码特征**
```python
from crewai import Agent, Task, Crew
# 定义 Agent
researcher = Agent(
role="Researcher",
goal="Collect comprehensive information",
tools=[search_tool]
)
writer = Agent(
role="Writer",
goal="Write engaging articles",
tools=[writing_tool]
)
# 定义任务
research_task = Task(
description="Research AI trends",
agent=researcher
)
writing_task = Task(
description="Write article based on research",
agent=writer
)
# 创建 Crew
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
process=Process.sequential
)
```
**识别方法**
1. 搜索 `from crewai``Agent(`
2. 提取所有 `Agent()` 定义
3. 提取所有 `Task()` 定义
4. 分析 `Crew()` 的 process 类型sequential/hierarchical
**Mermaid 模板**
```mermaid
flowchart TD
Start([开始]) --> Task1[Research Task<br/>Agent: Researcher]
Task1 --> Task2[Writing Task<br/>Agent: Writer]
Task2 --> End([结束])
style Task1 fill:#e1f5ff
style Task2 fill:#fff4e1
```
---
### 模式 1.3: AutoGen 多智能体
**代码特征**
```python
from autogen import AssistantAgent, UserProxyAgent
# 定义 Agent
assistant = AssistantAgent(
name="assistant",
llm_config={"config_list": config_list}
)
user_proxy = UserProxyAgent(
name="user_proxy",
code_execution_config={"work_dir": "coding"}
)
# 发起对话
user_proxy.initiate_chat(
assistant,
message="Analyze this dataset"
)
```
**Mermaid 模板**
```mermaid
sequenceDiagram
participant User as UserProxy
participant Asst as AssistantAgent
User->>Asst: 发起任务
Asst->>Asst: 生成代码
Asst->>User: 返回代码
User->>User: 执行代码
User->>Asst: 反馈执行结果
Asst->>User: 最终答案
```
---
## 2. 微服务架构
### 模式 2.1: Docker Compose 微服务
**代码特征**
```yaml
# docker-compose.yml
services:
api-gateway:
build: ./api-gateway
ports:
- "8000:8000"
user-service:
build: ./services/user-service
environment:
- DATABASE_URL=postgres://...
order-service:
build: ./services/order-service
notification-service:
build: ./services/notification-service
```
```python
# api-gateway/routes.py
@app.post("/orders")
def create_order(order_data):
# 调用 user-service
user = requests.get(f"http://user-service:8001/users/{user_id}")
# 调用 order-service
order = requests.post("http://order-service:8002/orders", json=order_data)
# 调用 notification-service
requests.post("http://notification-service:8003/notify", json={
"user_id": user_id,
"order_id": order["id"]
})
return order
```
**识别方法**
1. 读取 `docker-compose.yml`,提取所有 services
2. 在每个服务的代码中搜索 `requests.get|post`, `httpx.`
3. 提取目标 URL识别服务间调用关系
**Mermaid 模板**
```mermaid
graph TB
Client[客户端] --> Gateway[API Gateway<br/>:8000]
Gateway -->|GET /users/:id| UserSvc[User Service<br/>:8001]
Gateway -->|POST /orders| OrderSvc[Order Service<br/>:8002]
Gateway -->|POST /notify| NotifySvc[Notification Service<br/>:8003]
UserSvc --> UserDB[(User DB<br/>PostgreSQL)]
OrderSvc --> OrderDB[(Order DB<br/>PostgreSQL)]
style Gateway fill:#ff6b6b
style UserSvc fill:#4ecdc4
style OrderSvc fill:#45b7d1
style NotifySvc fill:#f9ca24
```
**关键信息提取**
- 服务名称
- 端口号
- 服务间调用关系from → to
- 数据库连接
---
### 模式 2.2: Kubernetes 微服务
**代码特征**
```yaml
# k8s/user-service.yaml
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- port: 8001
```
**识别方法**
1. 查找 `k8s/`, `kubernetes/`, `.yaml` 文件
2. 提取所有 `kind: Service` 定义
---
## 3. 事件驱动架构
### 模式 3.1: 事件总线Event Bus
**代码特征**
```python
# event_bus.py
class EventBus:
def __init__(self):
self._listeners = {}
def on(self, event_name, handler):
self._listeners.setdefault(event_name, []).append(handler)
def emit(self, event_name, data):
for handler in self._listeners.get(event_name, []):
handler(data)
# handlers.py
@event_bus.on("order_created")
def send_confirmation_email(order):
email.send(order.customer_email, ...)
@event_bus.on("order_created")
def update_inventory(order):
inventory.decrease(order.items)
@event_bus.on("order_created")
def log_order(order):
logger.info(f"Order {order.id} created")
# service.py
def create_order(order_data):
order = Order(**order_data)
db.save(order)
event_bus.emit("order_created", order) # 发布事件
```
**识别方法**
1. 搜索 `emit(`, `publish(`, `dispatch(`
2. 搜索 `@on(`, `@subscribe(`, `.on(`
3. 提取事件名称和对应的处理器
**Mermaid 模板**
```mermaid
graph TB
OrderService[Order Service] -->|emit| Event[order_created 事件]
Event --> Handler1[send_confirmation_email<br/>handlers.py:15]
Event --> Handler2[update_inventory<br/>handlers.py:28]
Event --> Handler3[log_order<br/>handlers.py:42]
Handler1 --> EmailSvc[Email Service]
Handler2 --> InventoryDB[(Inventory DB)]
Handler3 --> Logger[Logger]
style Event fill:#ffd93d,stroke:#333,stroke-width:3px
```
---
### 模式 3.2: 消息队列RabbitMQ/Kafka
**代码特征**
```python
# producer.py
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='tasks')
def publish_task(task_data):
channel.basic_publish(
exchange='',
routing_key='tasks',
body=json.dumps(task_data)
)
# consumer.py
def callback(ch, method, properties, body):
task = json.loads(body)
process_task(task)
channel.basic_consume(
queue='tasks',
on_message_callback=callback,
auto_ack=True
)
```
**Mermaid 模板**
```mermaid
graph LR
Producer[任务生产者] -->|发布| Queue[(RabbitMQ<br/>tasks 队列)]
Queue -->|消费| Consumer1[Worker 1]
Queue -->|消费| Consumer2[Worker 2]
Queue -->|消费| Consumer3[Worker 3]
style Queue fill:#ff6b6b
```
---
## 4. 数据管道ETL
### 模式 4.1: 顺序管道
**代码特征**
```python
def run_pipeline(source_file):
# Step 1: Extract
raw_data = extract_from_csv(source_file)
# Step 2: Transform
cleaned_data = remove_duplicates(raw_data)
enriched_data = add_metadata(cleaned_data)
validated_data = validate_schema(enriched_data)
# Step 3: Load
load_to_database(validated_data)
load_to_s3(validated_data)
```
**Mermaid 模板**
```mermaid
flowchart LR
CSV[CSV 文件] --> Extract[Extract<br/>提取数据]
Extract --> Clean[Clean<br/>去重]
Clean --> Enrich[Enrich<br/>添加元数据]
Enrich --> Validate[Validate<br/>校验]
Validate --> DB[(PostgreSQL)]
Validate --> S3[(S3 存储)]
style Extract fill:#e1f5ff
style Clean fill:#fff4e1
style Enrich fill:#e8f5e8
style Validate fill:#ffe1e1
```
---
### 模式 4.2: Airflow DAG
**代码特征**
```python
from airflow import DAG
from airflow.operators.python import PythonOperator
dag = DAG('data_pipeline', schedule_interval='@daily')
extract_task = PythonOperator(
task_id='extract',
python_callable=extract_data,
dag=dag
)
transform_task = PythonOperator(
task_id='transform',
python_callable=transform_data,
dag=dag
)
load_task = PythonOperator(
task_id='load',
python_callable=load_data,
dag=dag
)
extract_task >> transform_task >> load_task
```
**Mermaid 模板**
```mermaid
graph LR
Start([每日触发]) --> Extract[Extract Task]
Extract --> Transform[Transform Task]
Transform --> Load[Load Task]
Load --> End([完成])
```
---
## 5. 分层架构MVC
### 模式 5.1: 三层架构
**代码特征**
```python
# routes.py (Controller 层)
@app.route("/users", methods=["POST"])
def create_user():
data = request.json
user = UserService.create(data) # 调用 Service 层
return jsonify(user.to_dict())
# services/user_service.py (Service 层)
class UserService:
@staticmethod
def create(data):
# 业务逻辑
if not validate_email(data["email"]):
raise ValueError("Invalid email")
user = User(**data) # 使用 Model 层
db.session.add(user)
db.session.commit()
return user
# models/user.py (Model 层)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), unique=True)
name = db.Column(db.String(80))
```
**Mermaid 模板**
```mermaid
graph TD
Client[HTTP 客户端] -->|POST /users| Controller[Controller<br/>routes.py]
Controller --> Service[Service 层<br/>user_service.py]
Service --> Model[Model 层<br/>user.py]
Model --> DB[(Database)]
Service --> Validator[验证器<br/>validate_email]
style Controller fill:#ff6b6b
style Service fill:#4ecdc4
style Model fill:#45b7d1
```
---
## 6. CQRS 架构
### 模式 6.1: 命令查询分离
**代码特征**
```python
# commands/create_order.py (写操作)
class CreateOrderCommand:
def execute(self, order_data):
order = Order(**order_data)
write_db.save(order)
event_bus.emit("order_created", order)
# queries/get_order.py (读操作)
class GetOrderQuery:
def execute(self, order_id):
return read_db.query(Order).filter_by(id=order_id).first()
```
**Mermaid 模板**
```mermaid
graph TB
Client[客户端]
Client -->|写操作| CommandHandler[Command Handler]
CommandHandler --> WriteDB[(Write DB<br/>PostgreSQL)]
CommandHandler -->|发布事件| EventBus[Event Bus]
Client -->|读操作| QueryHandler[Query Handler]
QueryHandler --> ReadDB[(Read DB<br/>Redis/Elasticsearch)]
EventBus -->|同步| ReadDB
style CommandHandler fill:#ff6b6b
style QueryHandler fill:#4ecdc4
```
---
## 7. 混合架构识别
### 示例:微服务 + 事件驱动 + CQRS
**特征**
- 多个独立服务(微服务)
- 服务间通过事件通信(事件驱动)
- 每个服务内部 CQRS命令查询分离
**Mermaid 模板**
```mermaid
graph TB
subgraph "Order Service"
OrderCmd[Command Handler]
OrderQuery[Query Handler]
OrderWriteDB[(Write DB)]
OrderReadDB[(Read DB)]
end
subgraph "Inventory Service"
InvCmd[Command Handler]
InvQuery[Query Handler]
InvWriteDB[(Write DB)]
InvReadDB[(Read DB)]
end
EventBus[Event Bus<br/>RabbitMQ]
OrderCmd --> OrderWriteDB
OrderCmd --> EventBus
OrderQuery --> OrderReadDB
EventBus -->|order_created| InvCmd
InvCmd --> InvWriteDB
InvQuery --> InvReadDB
style EventBus fill:#ffd93d
```
---
## 8. 模式识别决策树
```
1. 检测 docker-compose.yml 或 k8s/ 目录
→ 是: 可能是微服务架构
→ 否: 继续
2. 检测 agents/ 目录 OR langgraph/crewai 导入
→ 是: Multi-Agent 架构
→ 否: 继续
3. 检测 emit/publish/subscribe
→ 是: 事件驱动架构
→ 否: 继续
4. 检测 extract/transform/load 函数
→ 是: 数据管道架构
→ 否: 继续
5. 检测 routes/ + services/ + models/
→ 是: 分层架构MVC
→ 否: 继续
6. 默认: 通用应用,分析主要调用链
```
---
## 9. 使用建议
1. **不要生搬硬套** - 并非所有项目都符合标准模式
2. **可以组合** - 一个项目可能同时使用多种模式
3. **关注核心** - 识别最重要的架构特征
4. **标注依据** - 在报告中注明识别依据(代码位置)
---
## 10. 扩展阅读
- **Martin Fowler's Architecture Patterns**: https://martinfowler.com/architecture/
- **Microservices Patterns**: https://microservices.io/patterns/
- **Event Driven Architecture**: https://martinfowler.com/articles/201701-event-driven.html