第四章 系统整体架构设计

好的架构不是功能最多,而是每一层都知道自己应该做什么。

经过前面的需求分析和技术选型,我们已经确定了整个项目的技术路线。

但是,仅仅知道使用 FastAPI、OpenResty、DeepSeek 这些技术还远远不够。

真正决定一个项目是否能够长期维护、持续扩展的,是系统架构。

这一章,我们不会写一行业务代码,而是先搭建整个系统的骨架。

有了清晰的架构,后面的开发就会像搭积木一样自然。


4.1 整体架构设计原则

开始画架构图之前,我先给自己定下了五条原则。

第一原则:单一职责(Single Responsibility)

每一个模块,只负责一件事情。

例如:

  • OpenResty 负责 HTTPS、反向代理、安全控制
  • FastAPI 负责业务逻辑
  • AI Service 负责调用大模型
  • Tool Service 负责工具调用
  • Memory Service 负责上下文管理

任何模块,都不要"什么都做"。

职责越清晰,维护越简单。


第二原则:低耦合(Low Coupling)

模块之间尽量减少依赖。

例如:

AI Service 不应该知道企业微信。

它只应该知道:

输入:

用户消息

输出:

AI 回复

至于消息来自企业微信、飞书还是网页聊天室,

AI 根本不需要关心。

这样未来接入新的聊天平台时,

AI Service 可以完全不用修改。


第三原则:高内聚(High Cohesion)

同一类功能必须放在一起。

例如:

app/

    ai/

    wecom/

    tools/

    memory/

    config/

而不是:

utils.py

common.py

helper.py

tools.py

functions.py

随着项目越来越大,

“万能工具类"最终都会变成维护噩梦。


第四原则:配置与代码分离

所有配置必须放到配置文件。

例如:

API Key

企业微信 Token

AESKey

数据库密码

Redis 地址

模型名称

全部放到:

.env

或者:

config.py

以后迁移服务器,

几乎不用修改代码。


第五原则:模块可替换

整个系统必须做到:

任何一个模块,

都可以随时替换。

例如:

DeepSeek

↓

OpenAI

或者:

Qwen

↓

Claude

业务代码不应该发生变化。


4.2 系统整体架构图

整个系统可以划分为六层。

                    ┌────────────────────────────┐
                    │        企业微信客户端        │
                    └────────────┬───────────────┘
                                 │
                           HTTPS 回调
                                 │
                    ┌────────────▼───────────────┐
                    │        OpenResty           │
                    │ SSL / Nginx / ReverseProxy │
                    └────────────┬───────────────┘
                                 │
                    ┌────────────▼───────────────┐
                    │       FastAPI Gateway      │
                    │ 企业微信消息入口            │
                    └────────────┬───────────────┘
                                 │
      ┌──────────────┬───────────┴──────────────┬─────────────┐
      │              │                          │             │
      ▼              ▼                          ▼             ▼
 消息解析        Session管理              AI Service      Tool Manager
 XML解析         上下文缓存               DeepSeek         ERP
 AES解密         Redis                  OpenAI          数据库
 签名校验        Memory                 Claude          天气API
      │              │                          │             │
      └──────────────┴──────────────┬───────────┘
                                     ▼
                             回复企业微信消息

整个架构非常简单。

真正复杂的只有消息处理这一层。

其它模块几乎都是标准的软件架构。


4.3 消息流转过程

下面来看一次完整的消息处理流程。

例如:

用户发送:

今天北京天气怎么样?

整个系统会经历以下步骤。

企业微信

↓

HTTPS

↓

OpenResty

↓

FastAPI

↓

验证签名

↓

AES 解密

↓

XML 转 JSON

↓

Session 查询

↓

调用 DeepSeek

↓

获得回复

↓

XML 加密

↓

返回企业微信

↓

用户收到回复

整个过程,

用户通常感觉不到。

耗时一般在:

1~3 秒

这就是一个完整的请求生命周期(Request Lifecycle)。


4.4 模块划分

为了方便维护,

我把整个项目拆分成多个模块。

app/

├── api/
│
├── wecom/
│
├── ai/
│
├── tools/
│
├── memory/
│
├── models/
│
├── services/
│
├── config/
│
└── utils/

下面分别介绍每个模块。


api/

负责:

所有 HTTP 接口。

例如:

/wecom/callback

/health

/version

它只负责:

接收请求。

绝不写业务逻辑。


wecom/

企业微信专用模块。

里面包括:

消息解密

消息加密

XML解析

签名验证

Reply封装

以后如果接飞书。

这里基本不用修改。

新增:

feishu/

即可。


ai/

负责所有 AI。

例如:

DeepSeek

OpenAI

Claude

Gemini

统一提供:

chat()

stream()

embedding()

业务层永远不要直接调用 SDK。


memory/

负责上下文。

例如:

Redis

SQLite

PostgreSQL

向量数据库

以后升级,

这里只需要替换实现。

其它模块不需要改。


tools/

负责所有工具。

例如:

天气

数据库

ERP

CRM

邮件

Excel

知识库

未来 Tool Calling,

全部从这里管理。


services/

真正业务逻辑。

例如:

聊天流程

Agent

工作流

消息处理

Prompt拼接

这里,

才是整个系统的大脑。


4.5 请求生命周期(Request Lifecycle)

下面画一个更加完整的数据流。

用户

↓

企业微信

↓

HTTPS

↓

OpenResty

↓

FastAPI

↓

WeCom Handler

↓

Decrypt

↓

Parse XML

↓

Session

↓

Prompt Builder

↓

AI Model

↓

Tool Calling

↓

AI Result

↓

Encrypt XML

↓

HTTP Response

↓

企业微信

↓

用户

可以发现。

真正调用 AI,

其实只是整个流程中的一步。

很多初学者,

把所有代码都写在:

main.py

里面。

几十行还可以。

几百行以后,

整个项目就无法维护了。

因此:

模块拆分非常重要。


4.6 为什么采用 Gateway 模式?

很多教程直接这样写:

企业微信

↓

FastAPI

↓

AI

看起来很简单。

但是以后:

增加:

公众号

飞书

钉钉

Telegram

Slack

怎么办?

于是,

我们增加一层:

Gateway

变成:

企业微信

↓

Gateway

↓

AI

Gateway 的职责只有三个。

第一:

统一入口。

第二:

统一认证。

第三:

统一消息格式。

这样:

AI 永远只处理:

UserMessage

而不是:

XML

JSON

Webhook

HTTP

这就是 Gateway 的意义。


4.7 部署架构

整个部署也尽量简单。

                    Internet
                        │
                  443 HTTPS
                        │
               OpenResty(Nginx)
                        │
                127.0.0.1:8000
                        │
                   FastAPI
                        │
         ┌──────────────┴──────────────┐
         │                             │
     DeepSeek API                  Redis
         │                             │
         └──────────────┬──────────────┘
                        │
                    PostgreSQL

以后增加:

Qdrant

Milvus

MinIO

RabbitMQ

都不会影响整体架构。


4.8 日志系统设计

很多项目上线以后,

最怕的一句话就是:

“程序好像坏了。”

为什么坏了?

没人知道。

所以,

日志一定要提前设计。

建议分四类。

access.log

error.log

ai.log

wecom.log

其中:

OpenResty 负责:

access.log

error.log

FastAPI 负责:

application.log

AI 调用单独:

ai.log

以后排查问题,

速度会快很多。


4.9 为什么这样设计?

很多读者可能会觉得:

这个架构是不是有点复杂?

其实恰恰相反。

复杂的不是架构。

而是未来业务。

好的架构,

应该让业务越来越复杂,

而代码依然保持整洁。

随着系统不断成长,

你可以继续增加:

  • MCP Server
  • Agent Router
  • Workflow Engine
  • RAG
  • Knowledge Base
  • Multi-Agent
  • Scheduler
  • Message Queue

而不用推倒重来。

这,

才是真正的软件架构。


本章小结

这一章,我们没有编写任何业务代码,而是完成了整个系统的架构设计。

我们明确了五大设计原则:单一职责、低耦合、高内聚、配置分离、模块可替换,并围绕这些原则构建了企业微信 AI 助手的整体框架。

整个系统采用了典型的分层架构:

  • OpenResty:统一 HTTPS 入口和安全控制。
  • FastAPI Gateway:统一处理企业微信回调请求。
  • WeCom 模块:完成消息解密、签名校验和 XML 解析。
  • AI Service:统一封装大模型调用能力。
  • Tool Manager:负责所有外部工具和业务能力。
  • Memory Service:负责会话上下文和长期记忆。
  • Service Layer:承载业务逻辑和 Agent 流程。

同时,我们还规划了完整的请求生命周期、项目目录结构、部署拓扑和日志体系。

至此,一个能够长期维护、易于扩展、支持多模型、多平台接入的 AI 助手基础架构已经搭建完成。

下一章开始,我们将正式进入开发阶段,从零开始搭建开发环境,并创建整个项目的工程骨架。