Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

  • Java 8 + 特性类

  • 其他技术类

    • 有没有碰到过执行计划不一致的情况?
    • 如果查询优化器选错了索引怎么办?
    • 当给第三方提供接口调用,需要注意哪些事情?
      • 接口防刷怎么实现?
      • 如果 JVM 出现频繁 FullGC 该如何解决
      • JVM OOM 问题如何排查和解决
      • CPU 使用率较高排查和解决
    • 常见面试题
    • 其他技术类
    刘博
    2025-12-29
    目录

    当给第三方提供接口调用,需要注意哪些事情?

    给第三方提供接口时,核心要保证 “安全性、稳定性、易用性、可扩展性”,避免接口滥用、数据泄露或调用失败,具体注意事项如下:

    # 1. 安全性保障

    • 接口鉴权:强制第三方使用 API 密钥(如 AppID+AppSecret)、Token(如 JWT、OAuth2.0)鉴权,避免匿名调用;
    • 数据加密:敏感数据(如用户信息、金额)通过 HTTPS 传输,核心字段(如密码)可额外加密(如 AES);
    • 防滥用机制:设置接口限流(如单 IP / 单 AppID 每秒最多调用 100 次)、防重放攻击(如添加 timestamp+nonce 参数,避免请求被重复提交);
    • 权限控制:基于最小权限原则,给第三方分配仅需的接口权限(如只读权限、仅操作自身数据的权限)。

    # 2. 稳定性保障

    • 接口版本控制:在 URL 中包含版本号(如/api/v1/user),后续迭代不影响旧版本接口调用;
    • 超时与重试机制:明确接口超时时间(如 5 秒),提供重试建议(如幂等性接口可重试,非幂等性接口需避免重复调用);
    • 异常处理:统一异常返回格式(如{"code":500,"msg":"服务器错误","data":null}),避免返回原始异常堆栈;
    • 服务高可用:部署多实例、负载均衡,核心接口提供降级方案(如非核心功能故障时返回默认值)。

    # 3. 易用性保障

    • 提供详细文档:文档包含接口 URL、请求方法、参数说明(字段名、类型、是否必填)、返回示例、错误码说明;
    • 统一数据格式:请求 / 返回采用 JSON 格式,字段命名规范(如下划线命名user_id),避免歧义;
    • 兼容性支持:兼容常见的请求头(如Content-Type: application/json),参数支持可选字段(非必填字段提供默认值);
    • 提供测试环境:给第三方提供测试环境接口,便于联调,避免直接操作生产数据。

    # 4. 可扩展性与监控

    • 接口解耦:内部逻辑与接口层解耦,便于后续功能扩展(如新增字段不影响现有调用);
    • 日志与监控:记录接口调用日志(调用方、时间、参数、返回结果),监控接口调用成功率、响应时间,异常时及时告警;
    • 变更通知:接口升级或调整前,提前通知第三方(如邮件、公告),预留足够适配时间;
    • 幂等性设计:核心接口(如支付、下单)支持幂等性(如通过订单号唯一标识请求),避免重复调用导致数据异常。

    # 4. 接口防刷怎么实现?

    接口防刷是指 “防止第三方或恶意用户高频调用接口,导致服务过载、数据泄露或业务损失”,核心实现思路是 “限制调用频率、识别恶意请求、拦截非法调用”,具体方案如下:

    # 1. 核心实现方案

    • 方案 1:基于限流的防刷(最常用)

      • 原理:限制单位时间内的接口调用次数(如单 IP / 单用户 / 单 AppID 每秒最多调用 10 次);

      • 实现方式:

        • 本地缓存:用 Guava RateLimiter(令牌桶算法)、Caffeine 缓存记录调用次数,适合单实例服务;
        • 分布式缓存:用 Redis 记录调用次数(如SET key 1 EX 10 NX,INCR key统计次数),适合多实例服务;
      • 示例(Redis 实现):

      // 接口调用前检查
      public boolean checkLimit(String key, int limit, int expireSeconds) {
          String redisKey = "api_limit:" + key; // key可设为IP+接口名、AppID+接口名
          Long count = redisTemplate.opsForValue().increment(redisKey, 1);
          if (count == 1) {
              redisTemplate.expire(redisKey, expireSeconds, TimeUnit.SECONDS); // 设置过期时间
          }
          return count <= limit; // 超过限制返回false
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
    • 方案 2:基于验证码的防刷

      • 原理:高频接口(如登录、注册、发送短信)调用前,要求用户输入图形验证码、短信验证码,验证通过后才允许调用;
      • 适用场景:非机器调用场景(如用户操作接口),防止恶意脚本批量调用;
      • 实现方式:集成第三方验证码服务(如极验、腾讯云验证码),或自建验证码生成接口。
    • 方案 3:基于黑名单的防刷

      • 原理:识别恶意请求源(如频繁触发限流的 IP、多次调用失败的账号),加入黑名单,禁止后续调用;
      • 实现方式:用 Redis 存储黑名单(如SADD blacklist:ip 192.168.1.1),接口调用前先检查是否在黑名单中;
      • 策略:黑名单设置过期时间(如 24 小时),避免误封后无法恢复。
    • 方案 4:基于请求特征的防刷

      • 原理:分析请求特征(如请求头异常、参数固定、无 Referer),识别机器调用或恶意请求;
      • 实现方式:
        • 校验请求头:要求携带合法的User-Agent、Referer;
        • 检查参数:避免参数重复(如短信接口的手机号 + 验证码组合)、参数异常(如手机号格式错误);
        • 行为分析:如短时间内同一 IP 调用多个不同接口、请求间隔固定(机器特征)。

    # 2. 进阶优化

    • 分层限流:接口层(Nginx 限流)+ 应用层(Redis 限流)+ 业务层(验证码),多层防护;
    • 动态调整阈值:根据服务负载动态调整限流阈值(如高峰期阈值降低,低峰期阈值提高);
    • 幂等性配合:核心接口实现幂等性,即使限流失效,也不会因重复调用导致业务异常;
    • 告警机制:频繁触发限流、黑名单新增时及时告警,人工介入排查恶意请求。

    上次更新: 12/30/2025
    如果查询优化器选错了索引怎么办?
    接口防刷怎么实现?

    ← 如果查询优化器选错了索引怎么办? 接口防刷怎么实现?→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式