# Sdari.Gateway **Repository Path**: sdari/sdari.gateway ## Basic Information - **Project Name**: Sdari.Gateway - **Description**: 一个设计用于简化 API 管理、增强安全性并提供统一访问控制的轻量级 API 网关。该项目旨在帮助开发者和企业快速部署并保护其后端服务,通过提供身份验证、授权、请求路由、限流、监控等核心功能,确保 API 的安全、高效与可扩展性。 - **Primary Language**: C# - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 56 - **Forks**: 18 - **Created**: 2024-07-23 - **Last Updated**: 2025-05-28 ## Categories & Tags **Categories**: api-gateway **Tags**: None ## README # 项目介绍 一个设计用于简化 API 管理、增强安全性并提供统一访问控制的轻量级 API 网关。该项目旨在帮助开发者和企业快速部署并保护其后端服务,通过提供身份验证、授权、请求路由、限流、监控等核心功能,确保 API 的安全、高效与可扩展性。 1. 身份验证(Authentication): 支持多种身份验证机制,如 JWT (JSON Web Tokens)、OAuth 2.0、Basic Auth 等,确保只有经过授权的客户端能够访问 API。 灵活的认证策略配置,允许为不同 API 路径或方法设置不同的认证要求。 2. 授权(Authorization): 基于角色的访问控制(RBAC),允许为不同用户或客户端分配不同的权限集。 精细的权限控制,可以指定哪些用户可以访问哪些 API 路径,以及执行哪些操作(如 GET、POST、PUT、DELETE)。 3. 请求路由与转发: 智能的路由逻辑,根据请求的路径、方法、头部等信息,将请求转发到后端相应的服务或微服务上。 支持负载均衡,自动将请求分发到健康的服务实例上,提升系统整体性能和可靠性。 4. 限流与熔断: 提供限流机制,防止因请求量过大而导致的服务崩溃。 熔断器模式,当后端服务异常或不可用时,自动切断请求,避免系统级故障。 5. 日志与监控: 详细的请求日志记录,包括请求时间、来源 IP、请求方法、请求路径、响应状态码等,便于问题排查和性能分析。 实时监控系统状态,包括 API 调用次数、响应时间、错误率等关键指标,帮助开发者快速定位问题。 # api网关使用说明 ## 配置路由 1. 确定api的访问路径 2. 为每一组Api添加nginx节点 * 一般每个服务器配一个端口,添加一个: 例子1: ``` #通讯 location /example1/ { auth_request /auth; proxy_pass http://example-ip:port/api/; } ``` 例子2: ``` location /example2/ { auth_request /auth; proxy_pass http://example-api-root/; } ``` ## 配置权限 * 打开:http://server/admin 1. 添加应用程序用户 * 选择 **应用管理** * 点击Create New * 输入用户的名称 * 点击Generate生成ClientId和Secret * 如果要限制Ip,就输入ipv4和ipv6(限制功能需要确认后开发) * 输入用户描述 * 点击Create创建 2. 添加api * 选择 **Api管理** * 点击Create New * 输入api的名称、地址、帮助地址、和说明文档 * 点击Create创建 3. 配置访问权限 * 选择 **访问权限管理** * 点击Create New * 选择要发放权限的api * 选择赋予权限的应用的Id * Accessibility设置为1表示运行访问 * 点击Create创建 * api模糊匹配的功能需要确认后开发 ## 应用程序调用 1. 获取token * 访问地址 http://server/Token/ * 其中clientId和secret是应用程序用户所拥有的ClientId和Secret * 访问方式为 **Post** * 例子: ``` http://server/Token/?clientId=111111&secret=66666666666666 ``` * 成功后会返回token ```Json { "code": 0, "msg": "success", "data": { "token": "12345678-1234-1234-1234-123456789abc", "expire": 7200 } } ``` 其中 **token** 是我们后续调用需要使用的内容;**expire** 是过期时间(刷新机制和token的获取频率需要确认需求后开发) 2. 访问api * 访问api的请求头中添加一个AccessKey,其值是获得的token,例如: ``` AccessKey: "12345678-1234-1234-1234-123456789abc" ``` * 调用api,获取api的返回值