
1) 【一句话结论】采用分层架构(核心层+插件层)实现功能解耦,通过插件化动态扩展金融场景的双向TLS认证、限流等能力,结合负载均衡、熔断降级、健康检查等机制,保障API稳定性。
2) 【原理/概念讲解】老师口吻,解释API网关作为外部系统请求的统一入口,核心层负责基础路由(如根据路径、HTTP方法匹配后端服务)和负载均衡(如加权轮询结合最小连接数,适配低延迟需求);插件层负责业务逻辑(如双向TLS验证插件、限流插件)。金融场景下需强化安全:采用双向TLS(客户端验证网关证书,网关验证客户端证书),确保数据传输加密和双向认证。稳定性保障:熔断机制(后端故障时断开请求)、降级策略(返回默认数据)、健康检查(定期Ping后端服务,异常时切换到备用实例)。
3) 【对比与适用场景】
| 对比项 | 单向TLS | 双向TLS(证书验证) |
| 定义 | 仅服务器验证客户端证书(如客户端证书为客户端身份标识) | 服务器和客户端互相验证对方证书(双向认证) |
| 特性 | 服务器验证客户端身份,客户端不验证服务器 | 双方互相验证,确保通信双方身份可信 |
| 适用场景 | 客户端身份已通过其他方式验证(如金融场景中客户端是已认证的银行系统) | 金融、保险等高安全场景,需双向认证防止中间人攻击 |
| 注意点 | 需确保客户端证书安全存储,避免泄露 | 证书管理复杂(需维护客户端证书库、更新周期),部署成本较高 |
4) 【示例】
POST https://api.changan.com/v1/finance/order,请求头包含Client-TLS-Cert: <客户端证书内容>,Authorization: Bearer <JWT Token>(可选)。/v1/finance/order,方法POST,路由到后端服务finance-order-service。403 Forbidden。finance-order-service的实例(如实例1、实例2,实例1权重更高)。# 核心层:路由匹配
def route_request(request):
path = request.path
method = request.method
service = router.get_service(path, method) # 查找路由规则(如/v1/finance/order -> finance-order-service)
return service
# 插件层:双向TLS验证
def tls_auth_plugin(request):
client_cert = request.headers.get('Client-TLS-Cert')
if not client_cert:
return False
try:
# 假设使用OpenSSL库验证证书
cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, client_cert)
# 验证证书链(假设已配置CA证书)
if verify_certificate_chain(cert, ca_certs):
return True
return False
except Exception:
return False
# 插件层:限流插件(线程安全)
import threading
request_id_to_bucket = {}
bucket_lock = threading.Lock()
def rate_limit_plugin(request):
with bucket_lock:
bucket = request_id_to_bucket.get(request.id)
if not bucket:
bucket = TokenBucket(capacity=1000, refill_rate=10) # 每秒生成10个令牌
request_id_to_bucket[request.id] = bucket
return bucket.consume() # 消耗令牌,返回True/False
# 健康检查(Ping实现)
def health_check(service_name):
try:
# 假设通过HTTP GET请求健康端点(如/api/health)
response = requests.get(f"http://{service_name}:8080/api/health")
return response.status_code == 200
except Exception:
return False
# 故障切换(蓝绿部署示例)
primary_service = "finance-order-service-primary"
standby_service = "finance-order-service-standby"
def failover():
global primary_service, standby_service
primary_service, standby_service = standby_service, primary_service
print("故障切换完成,切换到备用服务")
5) 【面试口播版答案】
面试官您好,针对API网关的设计,我核心思路是采用分层架构(核心层+插件层)实现功能解耦,通过插件化动态扩展金融场景的双向TLS认证、限流等能力,结合负载均衡、熔断降级、健康检查等机制,适配金融等高安全场景。具体来说,核心层负责基础路由(根据路径、HTTP方法匹配后端服务)和负载均衡(如加权轮询结合最小连接数,适配低延迟需求);插件层负责业务逻辑,比如双向TLS验证插件(通过客户端证书验证金融系统身份,确保双向认证),限流插件(线程安全实现令牌桶,控制请求频率);稳定性保障方面,引入熔断机制(后端服务响应超时或错误率超过阈值时断开请求),降级策略(熔断后返回默认数据),以及健康检查(定期Ping后端服务,异常时切换到备用实例)。这样既能满足金融、出行等多系统请求的处理需求,又能保证API的稳定性和安全性。
6) 【追问清单】
7) 【常见坑/雷区】