在微服务担任的角色
API Gateway是一种微服务架构中的网关组件,它可以作为微服务的统一入口,客户端只需要与 API Gateway 通信,由它来将请求路由到合适的微服务。与Nginx对实例的策略管理不同, API Gateway是针对接口的管理和控制。
API Gateway提供的能力
-
负载均衡。 API网关可以将请求分发到多个服务实例中,实现负载均衡。基于不同的算法对服务进行负载均衡,例如轮询、随机、最少连接数等。
-
API路由。根据请求的URL、HTTP方法等信息,将请求路由到相应的后端服务。例如对于/products 路径的 GET 请求,会将其转发到商品服务。
-
API组合。微服务系统通常由多个独立的服务组成。API网关可以将来自不同微服务的 API 进行聚合,对外提供统一的接口。
-
流量控制。可以根据不同的规则和策略来控制请求的流量和速率,例如限制每秒的请求数、限制每个用户的请求频率等。
-
安全认证 。API网关可以提供身份认证和访问授权等安全功能,例如基于API Key、OAuth、JWT等机制进行身份验证和访问授权。
-
路由转换。通过网关提供的启动配置文件,可以实现接口路由的映射,比方说外部请求a路径而内容会通过网关进行接口请求的转发,转发至b路径或b接口。
API Gateway实现应用
下面是基于flask框架实现的api网关能力
1.搭建api网关的基础框架
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
@app.route('/<path:path>', methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH']) //满足协议的通用化
def api_manage(path):
res = requests.request(method = request.method, url = f'{request.path}', header = request.headers, //接口请求转发
data = request.data)
if 'html' in res.text:
return res.text, res.status_code
return jsonify(res.json()), res.status_code //接口返回的透传
if __name__ == '__main__':
app.run()
2.路由管理,只有已注册到网关的接口才允许请求
info(request.remote_addr)
if path not in config['api'].keys():
return jsonify({"msg": "route not found"}), 404
3.安全认证,aes加密校验
try:
sign = request.headers['sign']
except Exception as e:
print(e)
return jsonify({'message': 'sign error'}), 403
aes_handle_res = aes_decrypt(sign, config['aesKey'].encode('utf-8'), config['aesIv'].encode('utf-8'))
if aes_handle_res is not True:
return jsonify({'message': 'sign error'}), 403
4.身份校验,通过sid校验是否同个用户
try:
sid = request.cookies['sid']
except Exception as err:
print(err)
return jsonify({"message": "user auth fail"}), 401
res = requests.get(url='http://127.0.0.1:8100/query', headers={"Content-Type": "application/json"},
cookies={'sid': sid}, timeout=3)
if res.status_code != 200:
return jsonify({"message": "user auth fail"}), 401
5.流量控制
if config['apiGateWay']['status'] is True:
current = int(redis_conn.get('limit_num') or 0)
if current >= config['apiGateWay']['limit']:
return jsonify({"msg": "requests out of limit"}), 500
redis_conn.set('limit_num', current + 1, ex=config['apiGateWay']['time'])
6.负载均衡
path_config = config['api'][path]
slb_index = random.randint(0, len(path_config['server']) - 1)
API Gateway测试策略
一、功能测试
1. 请求路由测试
- 准备各种类型的请求(‘GET’, ‘POST’, ‘PUT’, ‘DELETE’, ‘PATCH’),组合不同URL路径,校验各种组合是否准确地将请求转发到预期的目标。
2. 安全控制测试
- 使用不同的身份验证方式,校验 API Gateway 是否识别用户身份正确性。
- 模拟错误的身份验证信息,校验是否返回适当的错误响应。
- 发送包含敏感数据的请求到 API Gateway,校验是否能够正确地对数据进行加密传输以及解密数据
3. 负载均衡测试
- 模拟高并发请求,观察 API Gateway 是否能均匀地将请求分发到多个后端服务实例上。
- 检查负载均衡算法的有效性,确保各个实例的负载相对均衡。
二、性能测试
1. 响应时间测试
- 使用性能测试工具发送大量请求,测试API Gateway 的响应时间。 分析不同负载情况下的响应时间变化,确保在高并发场景下也能保持较快的响应速度。
2. 吞吐量测试
- 测试 API Gateway 在单位时间内能够处理的请求数量。逐渐增加并发请求的数量,观察吞吐量的变化趋势,确定系统的最大处理能力。
3. 压力测试
- 持续向 API Gateway 发送大量请求,超过其正常处理能力,观察系统在高压力下的表现。检查是否会出现错误、响应时间过长或系统崩溃等情况。
三、安全测试
1. 漏洞扫描
- 使用安全扫描工具对 API Gateway 进行漏洞扫描,查找潜在的安全漏洞,如 SQL 注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等。
2. 安全配置审查
- 检查 API Gateway 的安全配置,如身份验证方式、授权规则、加密设置等。
评论区