侧边栏壁纸
  • 累计撰写 23 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

微服务中间件-API Gateway

usoo
2022-04-14 / 0 评论 / 0 点赞 / 137 阅读 / 0 字

在微服务担任的角色

API Gateway是一种微服务架构中的网关组件,它可以作为微服务的统一入口,客户端只需要与 API Gateway 通信,由它来将请求路由到合适的微服务。与Nginx对实例的策略管理不同, API Gateway是针对接口的管理和控制。

mmexport1728917479273_edit_283075696031962(1)

API Gateway提供的能力

  • 负载均衡。 API网关可以将请求分发到多个服务实例中,实现负载均衡。基于不同的算法对服务进行负载均衡,例如轮询、随机、最少连接数等。

  • API路由。根据请求的URL、HTTP方法等信息,将请求路由到相应的后端服务。例如对于/products 路径的 GET 请求,会将其转发到商品服务。

  • API组合。微服务系统通常由多个独立的服务组成。API网关可以将来自不同微服务的 API 进行聚合,对外提供统一的接口。

  • 流量控制。可以根据不同的规则和策略来控制请求的流量和速率,例如限制每秒的请求数、限制每个用户的请求频率等。

  • 安全认证 。API网关可以提供身份认证和访问授权等安全功能,例如基于API Key、OAuth、JWT等机制进行身份验证和访问授权。

  • 路由转换。通过网关提供的启动配置文件,可以实现接口路由的映射,比方说外部请求a路径而内容会通过网关进行接口请求的转发,转发至b路径或b接口。

    v2-7790d1c2e95047b7fd552ddceeb7806c_1440w

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 的安全配置,如身份验证方式、授权规则、加密设置等。
0

评论区