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

设计一个企业级API网关,需要支持身份认证(OAuth2.0)、访问控制(RBAC)、流量控制(限流)、请求路由和协议转换,请说明技术选型和实现要点。

新凯来软件开发工程师难度:中等

答案

1) 【一句话结论】:企业级API网关需采用分层架构(路由、认证、控制、协议转换),以高性能代理(如Envoy)为底层,上层集成可扩展插件(如Kong),实现OAuth2.0认证、RBAC细粒度授权、动态限流及协议转换,保障高并发、安全与可观测性。

2) 【原理/概念讲解】:API网关作为企业API的“入口控制中心”,核心模块及功能:

  • 请求路由:根据请求路径(如/api/v1/users)、HTTP方法(GET/POST)、头信息(如Content-Type: application/json, Accept: application/xml)匹配后端服务。头信息(如Content-Type)用于区分数据格式(JSON vs XML),确保请求被路由到支持该格式的服务(类比:门卫不仅根据访客的证件(路径)和身份(方法),还根据访客携带的文件类型(头信息),引导到对应办公室)。
  • 身份认证(OAuth2.0):采用授权码流,用户通过认证服务器获取access_token,网关验证令牌的签名、过期时间(exp)。当access_token过期时,通过refresh_token刷新:网关向认证服务器发送refresh_token,获取新access_token(和可能的refresh_token),更新本地Redis缓存(使用分布式锁避免并发冲突,如Redis锁“token_refresh:lock”)。
  • 访问控制(RBAC):基于角色(如admin、user、manager)和权限(如admin可访问所有API,user仅能访问用户相关API,manager可管理订单API),通过令牌中的用户信息(用户ID=123,角色=admin)与资源权限表(如资源/users允许admin和user访问)比对。细粒度控制通过“用户-资源-操作”关联表实现(如用户A只能修改自己的数据,需关联表记录“user_123:users:PUT”权限),支持角色继承(子角色继承父角色权限)。
  • 流量控制(限流):采用令牌桶算法(Token Bucket),维护桶(容量=10,速率=10req/s),请求消耗令牌,桶空则拒绝(429)。支持基于用户/IP/令牌的动态限流:通过Prometheus收集请求速率(如用户A的请求速率),当速率超过阈值(如20req/s)时,自动调整令牌桶速率(如从10req/s升级到20req/s),避免资源浪费或过载。
  • 协议转换:支持HTTP转gRPC(通过Envoy的gRPC插件),或处理WebSocket持久连接(保持长连接,避免频繁建立)。例如,将HTTP请求转换为gRPC的gRPC-Web协议,实现后端服务的协议兼容;WebSocket持久连接处理:设置心跳间隔(30秒),消息序列化为JSON(如{"type":"message","data":"hello"}),确保连接稳定和消息可靠传输。

3) 【对比与适用场景】:

方案/组件定义特性使用场景注意点
自研微服务化网关自定义服务,拆分为路由、认证等微服务高定制化,可扩展性强,完全控制业务逻辑需要团队有微服务经验,资源充足(如大公司内部系统)开发成本高(需从0构建),维护复杂,技术债风险
Kong (开源)基于Nginx/Envoy的API网关,支持插件扩展(认证、限流、路由等)插件生态丰富(如OAuth2.0、RBAC插件),快速部署,成本较低中小企业或需要快速上线API管理功能插件性能瓶颈(如高并发下认证延迟),需监控插件状态
Apigee (商业)Google提供的商业API网关,高可用、安全,内置流量管理高可用(多区域部署),安全特性强(如DDoS防护),支持复杂策略大型企业,对安全、可用性要求极高(如金融、电商)成本较高(按API调用量收费),定制化有限,依赖商业支持
自研+Envoy底层用Envoy实现高并发代理,上层自研插件性能最优(Envoy原生支持高并发),完全定制化对性能要求极高,且团队有Envoy/微服务经验开发成本高(需熟悉Envoy配置),维护复杂

(假设性能数据:自研网关在高并发下QPS可达10万,延迟10ms;Kong在高并发下QPS可达5万,延迟15ms;Apigee在高并发下QPS可达8万,延迟12ms)

4) 【示例】:

  • OAuth2.0令牌刷新流程(用户刷新令牌): 请求示例:
    POST /oauth2/token
    Content-Type: application/x-www-form-urlencoded
    grant_type=refresh_token
    refresh_token=old_refresh_token
    client_id=app_id
    client_secret=app_secret
    
    网关处理流程:
    1. 解析请求参数(refresh_token),验证client_id和client_secret(与认证服务器配置一致)。
    2. 获取Redis分布式锁(key="token_refresh:lock"),避免并发冲突。
    3. 向认证服务器发送请求(POST /oauth2/token),携带refresh_token。
    4. 认证服务器验证refresh_token有效性(未过期、未失效),返回新的access_token(和可能的refresh_token)。
    5. 更新Redis缓存(key="user_123:token")中的access_token,替换旧令牌,释放锁。
    6. 返回新的access_token给客户端。
  • RBAC细粒度权限检查示例(用户A请求修改自己的数据): 用户请求:
    PUT /api/v1/users/123
    Authorization: Bearer <access_token>
    Content-Type: application/json
    
    网关处理:
    1. 认证:解析access_token,验证签名和过期时间。
    2. RBAC检查:查询令牌关联的用户信息(用户ID=123,角色=user),检查资源权限表(“user_123:users:PUT”权限存在),通过。
    3. 限流:检查用户ID=123的请求计数(当前为9req/s,未超10req/s),通过。
    4. 路由:匹配路径/api/v1/users/123,将请求转发到后端用户服务(user-service:8080/users/123),返回JSON数据。
  • WebSocket持久连接处理示例: 后端服务发送消息:
    ws://gateway/api/v1/chat
    
    网关处理:
    1. 路由:匹配路径/api/v1/chat,将WebSocket连接转发到后端聊天服务(chat-service:8080/chat)。
    2. 持久连接:保持长连接,设置心跳间隔30秒,若30秒无消息则发送心跳包({"type":"ping"})。
    3. 消息序列化:将后端发送的JSON消息(如{"type":"message","data":"hello"})通过WebSocket发送给客户端。

5) 【面试口播版答案】: 面试官您好,设计企业级API网关,核心是分层架构,以高性能代理(如Envoy)为底层,上层集成可扩展插件(如Kong)。首先,路由层根据请求路径、方法、头信息(如Content-Type)匹配后端服务;认证层用OAuth2.0验证令牌,确保用户身份,当令牌过期时,通过refresh_token机制获取新令牌(Redis分布式锁避免并发冲突);访问控制用RBAC定义角色(如admin、user),结合“用户-资源-操作”关联表实现细粒度权限(如用户A只能修改自己的数据);流量控制用令牌桶算法限流,支持基于用户/IP的动态调整(Prometheus监控触发阈值变化);协议转换支持HTTP转gRPC或WebSocket持久连接(心跳30秒,消息JSON序列化)。技术选型上,底层用Envoy实现高并发,上层用Kong插件扩展,同时考虑自研与Kong的权衡——自研灵活但成本高,Kong生态好但需监控插件性能。实现要点包括高可用部署(多实例+负载均衡),日志监控(收集请求日志、错误率),以及可观测性(指标、追踪)。这样能支撑企业级API的稳定、安全运行。

6) 【追问清单】:

  • 问题1:后端服务有多个版本,如何实现版本路由?
    回答要点:通过路径前缀(如/api/v1/users vs /api/v2/users)或查询参数(如?version=1),网关根据这些信息路由到对应版本,确保不同版本的服务隔离。
  • 问题2:认证令牌过期后如何处理?
    回答要点:OAuth2.0的refresh_token机制,网关用refresh_token向认证服务器请求新access_token,更新本地Redis缓存(分布式锁避免并发冲突),避免用户重新登录。
  • 问题3:限流策略如何动态调整?
    回答要点:基于Prometheus收集的请求速率,当用户请求速率超过阈值(如20req/s)时,自动调整令牌桶速率(如从10req/s升级到20req/s),平衡资源利用与性能。
  • 问题4:如何保证API网关的高可用?
    回答要点:部署多实例(如Kubernetes的Deployment),用负载均衡(如Nginx Ingress或Kubernetes Service),故障时自动切换,数据同步(如Redis缓存共享)。
  • 问题5:gRPC认证如何处理?
    回答要点:通过gRPC的认证插件(如Oauth2认证),或转换HTTP令牌为gRPC的Metadata(如"authorization: Bearer <token>"),实现gRPC请求的认证。

7) 【常见坑/雷区】:

  • 忽略令牌刷新流程:仅验证access_token有效性,未处理refresh_token,导致令牌过期后服务中断。
  • RBAC权限粒度不足:仅按角色控制,未考虑用户对特定资源的操作权限(如用户A只能修改自己的数据),导致数据泄露风险。
  • 技术选型风险分析不深入:未对比自研与Kong的性能瓶颈(如Kong在高并发下插件延迟),导致选型决策不充分。
  • 限流策略静态配置:未根据业务波动调整阈值,高峰期服务崩溃或低峰期资源浪费。
  • 协议转换忽略协议特性:如WebSocket持久连接未正确处理,导致连接中断,影响实时业务(如聊天、实时数据推送)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1