51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

好未来需要设计一个RESTful API接口,用于获取学生课程列表(支持分页、排序、筛选),要求支持请求限流(防止恶意请求)、日志记录(记录请求时间、响应时间、错误信息)。请说明接口的设计要点,并解释如何实现限流和日志记录。

好未来Java难度:中等

答案

1) 【一句话结论】:设计一个支持分页、排序、筛选的RESTful接口,通过令牌桶限流控制请求速率,并采用结构化日志记录请求时间、响应时间及错误信息,确保接口性能与可观测性。

2) 【原理/概念讲解】:

  • RESTful API设计:遵循HTTP GET方法,路径清晰(如/students/courses),参数通过查询字符串传递(分页page/size、排序sort/direction、筛选filter)。
  • 分页:通过page(当前页)、size(每页数量)控制数据量,避免一次性返回过多数据。
  • 排序:通过sort(字段名)、direction(asc/desc)指定排序规则。
  • 筛选:通过filter(字段=值)过滤数据,支持多条件(如status=active&grade=high)。
  • 限流:请求限流用令牌桶算法(维护固定容量桶,每秒生成固定令牌,请求消耗令牌,无令牌则拒绝),适合突发流量场景。
  • 日志记录:使用结构化日志(如JSON),包含request_time(请求时间)、response_time(响应时间)、params(请求参数)、response(响应数据)、error(错误信息),便于日志分析(如ELK)。

3) 【对比与适用场景】:
限流算法对比(令牌桶 vs 漏桶):

算法定义特性使用场景注意点
令牌桶维护固定容量桶,每秒生成固定令牌,请求消耗令牌允许突发流量(桶满后请求等待),速率恒定突发流量(如促销活动)需设置桶容量与令牌生成速率
漏桶维护固定容量桶,以固定速率向桶中添加令牌,请求消耗令牌速率平滑,限制最大速率严格速率限制(如API调用限制)需设置桶容量与漏速率

4) 【示例】:

  • 接口路径:GET /api/students/courses
  • 请求示例:
    GET /api/students/courses?page=1&size=10&sort=courseName,asc&filter=status=active&grade=high
    
  • 伪代码(Java):
    @GetMapping("/courses")
    public ResponseEntity<PagedResult<Course>> getCourses(
        @RequestParam(defaultValue = "1") int page,
        @RequestParam(defaultValue = "10") int size,
        @RequestParam(defaultValue = "courseName") String sort,
        @RequestParam(defaultValue = "asc") String direction,
        @RequestParam Map<String, String> filter) {
        // 分页、排序、筛选逻辑
        PagedResult<Course> result = courseService.getCourses(page, size, sort, direction, filter);
        return ResponseEntity.ok(result);
    }
    
    • 限流:用Guava RateLimiter,配置为每秒10请求:
      RateLimiter rateLimiter = RateLimiter.create(10); // 10请求/秒
      rateLimiter.acquire(); // 获取令牌,超时则拒绝
      
    • 日志记录:用SLF4J + Logback,结构化日志:
      log.info("request_time={}, response_time={}, params={}, response={}, error={}",
              startTime, endTime, params, result, error);
      

5) 【面试口播版答案】:
“面试官您好,设计这个RESTful接口的核心是支持分页、排序、筛选,同时通过限流和日志记录保障性能与可观测性。首先,接口设计上,路径用/students/courses,通过查询参数实现分页(page/size)、排序(sort/direction)、筛选(filter),比如page=1&size=10&sort=courseName,asc&filter=status=active。然后,限流方面,采用令牌桶算法,用Guava的RateLimiter,配置为每秒10请求,确保恶意请求不会压垮服务器。日志记录用结构化日志,记录请求时间、响应时间、参数、响应数据,方便后续分析。具体实现时,在Controller层调用限流中间件,然后调用服务层处理分页、排序、筛选,最后记录日志。这样既保证了接口的灵活性,又通过限流和日志提升了系统的稳定性和可维护性。”

6) 【追问清单】:

  • 问:分页参数的默认值如何处理?
    答:默认page=1,size=10,避免空值导致错误。
  • 问:限流阈值如何动态调整?
    答:通过配置中心(如Nacos)动态更新,根据流量变化调整。
  • 问:日志记录是否影响性能?
    答:使用异步日志记录(如Logback的AsyncAppender),减少对业务线程的影响。
  • 问:筛选条件是否考虑SQL注入?
    答:使用参数化查询(如JPA的@Query或MyBatis的#{}),避免注入风险。
  • 问:缓存是否优化分页查询?
    答:对于热门课程,可缓存分页结果(如Redis),减少数据库压力。

7) 【常见坑/雷区】:

  • 分页参数未处理空值或负数,导致错误或逻辑错误。
  • 排序参数未校验合法性(如非法字段名),导致异常。
  • 限流配置过高或过低,过高无法限流,过低影响正常用户。
  • 日志记录未结构化,导致分析困难。
  • 筛选条件未做参数化,导致SQL注入风险。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1