KOA技术分享

专注 Koa.js 框架的编程知识分享

RESTful API 进阶实践与性能优化

接口版本控制

API 需要持续迭代,版本控制是保证向后兼容的关键。

版本控制策略

Koa.js 版本控制示例

// middleware/version.js
const versionMap = {
  'v1': require('../controllers/v1/users'),
  'v2': require('../controllers/v2/users')
};

module.exports = async (ctx, next) => {
  const version = ctx.params.version || 'v1';
  ctx.apiVersion = version;
  ctx.apiController = versionMap[version] || versionMap.v1;
  await next();
};

数据缓存策略

HTTP 缓存

服务端缓存

缓存实现示例

// 缓存中间件
const cache = new Map();

async function cacheMiddleware(ctx, next) {
  const key = ctx.url;

  // GET 请求尝试读取缓存
  if (ctx.method === 'GET' && cache.has(key)) {
    const { data, expire } = cache.get(key);
    if (Date.now() < expire) {
      ctx.set('X-Cache', 'HIT');
      ctx.body = data;
      return;
    }
    cache.delete(key);
  }

  await next();

  // 写入缓存
  if (ctx.status === 200 && ctx.method === 'GET') {
    cache.set(key, {
      data: ctx.body,
      expire: Date.now() + 60 * 1000 // 1分钟
    });
    ctx.set('X-Cache', 'MISS');
  }
}

分页优化

-offset 分页

传统分页方式,大偏移量时性能差:

?page=1&limit=20
// SQL: LIMIT 20 OFFSET 0

游标分页(推荐)

基于上一页最后一条记录的 ID,性能稳定:

?cursor=abc123&limit=20
// SQL: WHERE id > 'abc123' LIMIT 20

限流与熔断

限流策略

熔断降级

Rate Limit 中间件

const ratelimit = require('koa-ratelimit');
const Redis = require('ioredis');

app.use(ratelimit({
  driver: 'redis',
  db: new Redis(),
  duration: 60000,
  errorMessage: '请求过于频繁,请稍后重试',
  key: ctx => ctx.ip,
  max: 100,
  disableHeader: false
}));

接口安全

API 文档

推荐使用 Swagger/OpenAPI 规范:

← 下一篇:RESTful API 设计最佳实践