市场数据微服务

一个基于FastAPI的轻量级微服务,提供市场数据端点(如ticker、OHLCV、订单簿和交易记录),支持可插拔的市场服务后端和异步Redis缓存。

  • by Mrigank923
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Mrigank923/mcp_server

使用说明

MCP服务器

一个紧凑的FastAPI微服务,公开市场数据端点(股票代码、OHLCV、订单簿、交易),由可插拔的 MarketService 以及异步Redis缓存。 它使用可插拔 MarketService 后端(包括ccxt适配器)和用于短期缓存的异步Redis缓存。

本自述文件记录了项目结构、如何在本地设置和运行、配置环境变量、API详细信息、模式类型、测试、已知兼容性说明以及开发过程中所做的假设。

目标和方法

  • 在市场数据服务之上提供精简的HTTP API(MarketService)因此,客户可以请求股票行情、OHLCV、订单簿和最近的交易。
  • 保持HTTP层最小化:端点仅支持GET,并将请求转发到服务层,在服务错误时返回502。
  • 使用异步Redis客户端(redis.asyncio)缓存响应并在工作进程之间共享状态。
  • 使用 ccxt 作为从交易所获取市场数据的适配器;适配器被包裹在 app/adapters/ccxt_adapter.py 并被使用 app/services/market_service.py.

快速摘要

  • 基本URL(dev):http://localhost:8000
  • API前缀: /api/v1
  • 主要特点:
    • 调用异步的FastAPI端点 MarketService (ccxt适配器)
    • 异步Redis缓存(redis.asyncio)in app/cache/redis_cache.py
    • Pydantic模式 app/schemas.py 用于验证和文档

存储库布局

mcp_server/
├─ app/
│  ├─ api/v1/endpoints.py        # FastAPI routes (mounted at /api/v1)
│  ├─ cache/redis_cache.py       # async redis helper (init/get/set/close)
│  ├─ services/market_service.py # business logic, caching orchestration
│  ├─ adapters/ccxt_adapter.py   # ccxt wrapper to fetch exchange data
│  ├─ config.py                  # pydantic settings and env defaults
│  ├─ schemas.py                 # Pydantic response/request schemas
	│  └─ main.py                   # FastAPI app, startup/shutdown hooks
├─ requirements.txt
├─ run_server.sh                  # convenience script to start uvicorn
├─ Dockerfile
├─ docker-compose.yml
└─ tests/unit/                    # unit tests

API端点

所有端点都是GET,并挂载在 /api/v1.

  • 获取 / --健康检查。退货: { "status": "ok" }.

  • 获取 /api/v1/ticker

    • 查询参数: symbol (必填,例如。 BTC/USDT), exchange (可选,例如。 binance)
    • 返回该交易品种的股票代码对象(请参见 app/schemas.py -> TickerModel).
  • 获取 /api/v1/ohlcv

    • 查询参数: symbol (必填), exchange (可选), timeframe (默认值 1m), since (可选,ms epoch), limit (默认值为100)
    • 返回OHLCV列表(参见 OHLCVModel).
  • 获取 /api/v1/orderbook

    • 查询参数: symbol (必填), exchange (可选), limit (默认值50)
    • 退货订单簿(请参阅 OrderBookModel).
  • 获取 /api/v1/trades

    • 查询参数: symbol (必填), exchange (可选), limit (默认值50)
    • 返回最近的交易(请参阅 TradeModel / TradesModel).

示例卷曲(股票代码):

curl 'http://localhost:8000/api/v1/ticker?symbol=BTC%2FUSDT&exchange=binance'

错误行为

  • 如果服务层引发异常,端点将返回HTTP 502和异常消息 detail.
  • API从客户端的角度来看是同步的,但使用异步处理程序实现。

模式

Pydantic模型在 app/schemas.py.主要型号包括:

  • TickerModel --诸如符号、时间戳、最后一次、出价、要价、基本交易量等字段。
  • OHLCVModel --OHLCV阵列列表: [timestamp, open, high, low, close, volume].
  • OrderBookModel — bids, asks,时间戳。
  • TradeModel / TradesModel --个人交易和列表。

这些模式用于标准化API输出,并出现在以下位置的OpenAPI文档中 /docs 当应用程序运行时。

配置(环境变量)

配置存在于 app/config.py (Pydantic Settings).重要的环境变量和默认值:

  • REDIS_HOST (默认值: localhost)
  • REDIS_PORT (默认值: 6379)
  • REDIS_DB (默认值: 0)
  • REDIS_URL (默认值: redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB})
  • DEFAULT_EXCHANGE (默认值: binance)--当 exchange 省略查询参数。

在运行服务器之前,在shell或容器编排中设置它们。

要求和兼容性

项目依赖关系位于 requirements.txt.关键问题:

  • FastAPI
  • uvicorn[标准]
  • 仓储管理系统
  • redis(redis-py)——通过使用 redis.asyncio
  • aioredis(历史;代码使用 redis.asyncio)
  • 坚韧
  • httpx
  • pytest,pytest-asyncio(测试)

兼容性说明(重要):

  • 此仓库中的测试使用 httpx.AsyncClient(app=app, ...) 其依赖于较旧的httpx API行为。较新的httpx版本(0.28+)删除了 app= kwarg。如果你运行测试并看到以下失败: TypeError: AsyncClient.__init__() got an unexpected keyword argument 'app' 那么任一引脚 httpx 到旧版本(例如 httpx==0.23.3)或更新测试以使用现代ASGI测试方法。

建议快速安装(项目venv调用 menv 在此回购中):

# from repo root
python -m venv menv
source menv/bin/activate
python -m pip install -r requirements.txt

如果你喜欢钉 httpx 添加到兼容版本 httpx==0.23.3 到 requirements.txt 并重新安装。

在本地运行(开发)

  1. 如果你还没有Redis,请启动Redis(本地):
docker run -p 6379:6379 -d --name redis redis:7
  1. 使用便利脚本或uvicorn启动应用程序:
./run_server.sh
# or
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

打开 http://localhost:8000/docs 用于交互式OpenAPI UI。

测试

从项目根运行单元测试,以便 app 可导入:

# ensure venv is activated and deps installed
python -m pytest -q tests/unit

如果你击中 AsyncClient(..., app=app) TypeError,任一引脚 httpx 或更新测试以使用ASGI传输/寿命管理器。

码头工人

此回购包含 Dockerfile 和 docker-compose.yml.典型的本地组合用法:

docker-compose up --build

确保compose文件连接Redis服务并设置任何所需的env变量(或使用外部Redis并设置 REDIS_URL).

故障排除

  • ModuleNotFoundError:没有名为“redis”的模块——在用于运行uvicorn的同一Python环境中安装要求。
  • Pydantic模型错误——确保中的属性 app/config.py 类型正确(非字段属性应注释为 ClassVar).
  • 缩进错误/语法错误--运行 python -m py_compile <file> 查找语法问题。
  • Httpx AsyncClient TypeError——请参阅上面的兼容性说明。

假设和设计说明

  • MarketService 方法是异步的,返回交换规范化的数据。该服务协调从 CCXTAdapter,在Redis中缓存,并返回结构化响应。
  • Redis用于响应的短期缓存(JSON序列化),以减少外部交换调用。
  • OpenAPI模式通过以下方式提供 app/schemas.py 以记录响应形状。
  • 该项目主要是面向开发者的服务;生产强化(身份验证、速率限制、连接池、监控)超出了此存储库的范围。

下一步去哪里看

  • app/services/market_service.py --缓存和编排逻辑。
  • app/adapters/ccxt_adapter.py --交换层实现。
  • app/cache/redis_cache.py --Redis客户端帮助程序(init/get/set/close)。
  • tests/unit/ --如何在测试中执行端点和适配器的示例。