← 返回首页
🧠

API网关

📂 llm ⏱ 2 min 298 words

--- 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设计的轻量级网关。

部署建议

  1. 从简单的代理模式开始,逐步添加功能
  2. 优先实现认证和速率限制
  3. 建立完善的监控和告警机制
  4. 定期进行安全审计
  5. 持续优化性能和成本

API网关是LLM系统工程化的重要组成部分,为LLM服务提供了必要的治理和保护能力。