一、前言
在微服务架构和前后端分离的趋势下,API 已经成为系统间交互的标准方式。对于起名类产品来说,名字打分、八字排盘、名字推荐等核心功能,如果能封装为标准化的 API,不仅能支持 Web 端、移动端、小程序等多端调用,还能开放给第三方开发者使用,拓展业务边界。笔者在开发 529宝宝起名网 时,将核心的名字打分算法封装为 RESTful API,支持每秒上千次并发调用,本文将完整记录从算法封装到部署运维的全流程。
选择 FastAPI 作为 API 框架,主要基于以下考虑:自动生成 OpenAPI 文档、原生异步支持、Pydantic 数据校验、类型提示友好、性能接近 Node.js 和 Go。相比 Flask 需要手动组装文档和校验,FastAPI 能大幅减少样板代码,提升开发效率。
本文将涵盖以下内容:
- API 需求分析与架构设计
- 核心算法封装(五格三才、八字排盘)
- RESTful API 接口设计与实现
- 限流、缓存与性能优化
- 监控、日志与告警
- 容器化部署与运维
- 性能测试与效果验证
二、API 需求分析与架构设计
2.1 功能需求
表格
| POST /api/v1/score | 名字打分 | 姓氏、名字、出生日期 | 五格分数、三才配置、综合评分 | P0 |
| POST /api/v1/bazi | 八字排盘 | 出生日期时间 | 四柱八字、五行统计、喜用神 | P0 |
| POST /api/v1/recommend | 名字推荐 | 姓氏、性别、出生日期、偏好 | 名字列表(含评分) | P1 |
| GET /api/v1/char/{char} | 汉字详情 | 汉字 | 拼音、笔画、五行、释义 | P1 |
| POST /api/v1/batch/score | 批量打分 | 名字列表 | 批量评分结果 | P2 |
2.2 非功能需求
表格
| 响应时间 | P95 < 200ms | 单名打分接口 |
| 并发能力 | 支持 1000 QPS | 峰值流量 |
| 可用性 | 99.9% | 年停机时间 < 8.76 小时 |
| 缓存命中率 | > 80% | 热门名字打分结果缓存 |
| 限流 | 单 IP 100 次 / 分钟 | 防止滥用 |
| 数据校验 | 100% | 所有输入参数校验 |
2.3 技术选型对比
表格
| FastAPI | 高 | 原生 | 是(OpenAPI) | Pydantic | 丰富 | 高性能 API、微服务 |
| Flask | 中 | 需扩展 | 需扩展 | 需扩展 | 非常丰富 | 小型应用、灵活定制 |
| Django REST | 中 | 部分 | 是 | 是 | 非常丰富 | 大型项目、Admin 后台 |
| Tornado | 高 | 原生 | 否 | 需手动 | 一般 | 长连接、WebSocket |
综合评估后选择 FastAPI,配合 Redis 做缓存和限流,Prometheus+Grafana 做监控,Docker 做容器化部署。
2.4 系统架构
┌──────────┐ ┌──────────────┐ ┌─────────────────┐
│ 客户端 │ ──>│ Nginx反向代理 │ ──>│ FastAPI应用服务 │
│ (Web/App)│ │ (负载均衡) │ │ (Gunicorn+Uvicorn)│
└──────────┘ └──────────────┘ └────────┬────────┘
│
┌────────────────────────────┼────────────────────────────┐
│ │ │
┌─────▼─────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Redis缓存 │ │ 算法计算层 │ │ 监控日志层 │
│ (打分结果/ │ │ (五格/八字/ │ │ (Prometheus/ │
│ 限流/会话) │ │ 推荐算法) │ │ ELK/告警) │
└─────────────┘ └──────────────┘ └──────────────┘
三、核心算法封装
3.1 算法层与接口层分离
良好的 API 设计应该将算法逻辑与接口逻辑分离,算法层只负责纯计算,接口层负责参数校验、调用算法、格式化响应。这样算法可以独立测试和复用,接口层可以随时替换框架。
# app/core/name_scorer.py
from dataclasses import dataclass
from typing import Dict, List, Optional
@dataclass
class ScoreResult:
\”\”\”打分结果数据类\”\”\”
name: str
total_score: float
level: str
wuge: Dict[str, int]
wuge_scores: Dict[str, float]
sancai: Dict[str, str]
sancai_level: str
char_meanings: List[str]
class NameScorer:
\”\”\”名字打分器(纯算法,无框架依赖)\”\”\”
def __init__(self, char_db: dict):
self.char_db = char_db # 汉字康熙笔画数据库
def score(self, surname: str, given_name: str,
birth_date: Optional[str] = None) -> ScoreResult:
\”\”\”
计算名字综合评分
surname: 姓氏
given_name: 名字
birth_date: 出生日期(可选,用于八字五行评分)
\”\”\”
# 1. 计算五格
wuge = self._calculate_wuge(surname, given_name)
# 2. 五格数理评分
wuge_scores = self._score_wuge(wuge)
# 3. 三才配置判定
sancai = self._calculate_sancai(wuge)
sancai_level, sancai_score = self._judge_sancai(sancai)
# 4. 综合评分(五格80% + 三才20%)
wuge_weighted = (
wuge_scores[\”ren_ge\”] * 0.30 +
wuge_scores[\”zong_ge\”] * 0.25 +
wuge_scores[\”di_ge\”] * 0.20 +
wuge_scores[\”tian_ge\”] * 0.15 +
wuge_scores[\”wai_ge\”] * 0.10
)
total_score = wuge_weighted * 0.8 + sancai_score * 0.2
# 5. 等级划分
level = self._score_level(total_score)
# 6. 字义解释
char_meanings = [
self.char_db.get(c, {}).get(\”definition\”, \”\”)
for c in given_name
]
return ScoreResult(
name=surname + given_name,
total_score=round(total_score, 1),
level=level,
wuge=wuge,
wuge_scores=wuge_scores,
网硕互联帮助中心





评论前必须登录!
注册