API网关
--- title: "API网关" description: "LLM API网关设计、Kong配置与流量管理实践" tags: ["API网关", "Kong", "流量管理", "服务治理", "负载均衡"] category: "llm" icon: "🧠"
API网关
API网关是LLM应用系统中的关键基础设施,作为所有LLM请求的统一入口,提供认证授权、流量管理、安全防护、监控分析等功能。一个设计良好的API网关能够大幅提升LLM服务的可靠性和可管理性。
核心功能
API网关提供认证与授权(API Key验证、OAuth2.0、JWT校验)、路由与负载均衡(多模型路由、健康检查)、速率限制(请求频率、Token使用限制)、安全防护(内容安全检查、提示注入检测)以及监控与日志(延迟指标、成本追踪)。
Kong网关配置
安装与基础配置
# Docker部署Kong
docker run -d --name kong-database \
-p 5432:5432 -e POSTGRES_USER=kong \
-e POSTGRES_DB=kong -e POSTGRES_PASSWORD=kongpass \
postgres:15
docker run --rm --link kong-database:kong-database \
-e KONG_DATABASE=postgres \
-e KONG_PG_HOST=kong-database \
-e KONG_PG_PASSWORD=kongpass \
kong:latest kong migrations bootstrap
docker run -d --name kong \
--link kong-database:kong-database \
-e KONG_DATABASE=postgres \
-e KONG_PG_HOST=kong-database \
-e KONG_PG_PASSWORD=kongpass \
-e KONG_PROXY_ACCESS_LOG=/dev/stdout \
-e KONG_ADMIN_LISTEN=0.0.0.0:8001 \
-p 8000:8000 -p 8443:8443 -p 8001:8001 \
kong:latest
配置LLM代理服务
# 创建LLM服务
curl -i -X POST http://localhost:8001/services \
--data name=llm-api \
--data url=http://localhost:11434
# 创建路由
curl -i -X POST http://localhost:8001/services/llm-api/routes \
--data name=llm-chat \
--data paths[]=/v1/chat/completions \
--data methods[]=POST
# 添加API Key认证插件
curl -i -X POST http://localhost:8001/services/llm-api/plugins \
--data name=key-auth \
--data config.key_names=Authorization
# 配置速率限制
curl -i -X POST http://localhost:8001/services/llm-api/plugins \
--data name=rate-limiting \
--data config.minute=60 \
--data config.policy=local
流式响应支持
import httpx
from fastapi import FastAPI, Request
from fastapi.responses import StreamingResponse
app = FastAPI()
async def proxy_sse(request: Request):
body = await request.json()
async with httpx.AsyncClient() as client:
async with client.stream(
"POST",
"http://localhost:11434/api/chat",
json={
"model": body.get("model", "qwen2.5:7b"),
"messages": body["messages"],
"stream": True
},
timeout=120.0
) as response:
async for chunk in response.aiter_text():
yield chunk
@app.post("/v1/chat/completions")
async def chat_completions(request: Request):
return StreamingResponse(proxy_sse(request), media_type="text/event-stream")
LLM特殊需求
流式支持
LLM通常使用流式输出,网关需要支持Server-Sent Events(SSE),流式转发不缓冲,支持流式超时。传统网关可能缓冲响应,导致流式输出失效。
Token计费集成
import tiktoken
class TokenBilling:
def __init__(self, input_price_per_1k: float, output_price_per_1k: float):
self.input_price = input_price_per_1k
self.output_price = output_price_per_1k
self.encoder = tiktoken.get_encoding("cl100k_base")
def count_tokens(self, text: str) -> int:
return len(self.encoder.encode(text))
def calculate_cost(self, input_text: str, output_text: str) -> dict:
input_tokens = self.count_tokens(input_text)
output_tokens = self.count_tokens(output_text)
cost = (input_tokens * self.input_price + output_tokens * self.output_price) / 1000
return {
"input_tokens": input_tokens,
"output_tokens": output_tokens,
"total_cost": f"${cost:.6f}"
}
billing = TokenBilling(0.002, 0.006)
result = billing.calculate_cost("你好,请介绍一下自己", "我是一个AI助手,很高兴为您服务。")
print(result)
主流方案对比
Kong适合通用API网关场景,插件生态丰富;AWS API Gateway适合AWS云原生环境;Envoy适合微服务架构,可观测性强;LiteLLM是专为LLM设计的轻量级网关。
部署建议
- 从简单的代理模式开始,逐步添加功能
- 优先实现认证和速率限制
- 建立完善的监控和告警机制
- 定期进行安全审计
- 持续优化性能和成本
API网关是LLM系统工程化的重要组成部分,为LLM服务提供了必要的治理和保护能力。