TPIsoftwareOSPO/digiRunner-Open-Source

GitHub: TPIsoftwareOSPO/digiRunner-Open-Source

一款轻量级企业级 API 网关,提供微服务流量治理与 AI 服务编排能力,帮助团队统一管理 API 并安全接入大语言模型。

Stars: 306 | Forks: 16

[![](/digiRunner.png)][tpi-url] # digiRunner:API 与 AI 服务的统一控制平面 安全地将您的基础设施与 AI 革命连接起来。 这是一个企业级 API Gateway,旨在精准治理 Microservices 并编排大型语言模型 (LLMs)。 [TPI.dev](https://tpi.dev) | [文档](https://docs.tpi.dev/) | [博客](https://tpi.dev/blog) | [社区](https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source/discussions)| [LinkedIn](https://www.linkedin.com/company/opentpi/) ## 目录 - [概述](#overview) - [快速开始](#quick-start) - [使用 Container](#1-using-container) - [选项 1:Docker](#option-1-docker) - [选项 2:Docker-Compose](#option-2-docker-compose) - [选项 3:Kubernetes](#option-3-kubernetes) - [选项 4:Helm](#option-4-helm) - [在本地计算机上即时运行 digiRunner](#2-run-digirunner-instantly-on-your-local-machine) - [运行您自己的构建](#3-run-your-own-build) - [创建简单的 Api 代理](#create-a-simple-api-proxy) - [文档](#documentation) - [构建您自己的 JAR](#build-your-own-jar) - [在本地 Container Registry 中运行 digiRunner](#run-digirunner-in-a-local-container-registry) ## 概述 digiRunner 是一款专为现代混合云设计的轻量级、高性能 API Gateway。随着企业竞相采用生成式 AI,它们面临着一系列新的挑战:不可预测的成本、供应商锁定,以及将内部数据暴露给公共模型所带来的安全风险。 digiRunner 超越了传统的流量管理,进化为您的 AI Gateway。它在您的应用与 AI 提供商(如 OpenAI、Azure 或本地 Ollama 实例)之间充当智能桥梁,让您能够将业务逻辑与快速变化的 AI 领域解耦。 借助 digiRunner,您将停止硬编码 API 密钥,并开始将 AI 作为受治理的基础设施资产进行管理。 ## 为什么选择 digiRunner AI Gateway? 我们提供了标准模型 API 所缺乏的 Guardrails 和治理能力。 1. 🛡️ 零供应商锁定(通用接口) 不再需要在每次发布新模型时重写代码。 - 供应商抽象:集中定义您的 AI 供应商(例如 OpenAI、Azure)和模型配置。您的应用调用统一的 digiRunner endpoint,让您无需部署新代码即可即时切换后端模型。 - 安全的密钥管理:永远不再在客户端代码中暴露提供商的 API 密钥。digiRunner 会在 gateway 层安全地注入凭据。 2. 💰 FinOps 与 Tokenomics 控制 传统的速率限制(每分钟请求数)在处理 LLM 时会失效,因为单次请求可能会消耗超过 1 万个 token。digiRunner 深刻理解 Tokenomics。 - 细粒度的成本控制:强制执行严格的输入限制(防止长上下文滥用)和输出限制(防止失控生成)。 - 灵活的策略:选择“拒绝”(硬停止)以限制预算,或选择“继续使用”以允许流量通过,同时标记超额部分以供审计。 3. 📝 将 Prompt Engineering 作为基础设施 像对待 API 一样对待您的 Prompt——进行版本控制、集中管理并保持可见。 - 模板注册表:使用内置的 AI Prompt 模板引擎,在全球范围内创建、更新和启用/禁用 prompt。 - 标准化:确保所有应用程序都使用经过批准和优化的 prompt,以减少幻觉并确保品牌一致性。 ## 解决真实的 API 挑战 | **挑战** | **digiRunner 解决方案** | |-------------------------------------------|------------------------------------------------------------------------------------------| | 访问控制不一致 | 可视化 RBAC、API 密钥、支持 OAuth2 和 OIDC | | 杂乱无章的 Microservice endpoint | 具备智能路由的统一 API Gateway | | 开发和运维人员的学习曲线陡峭 | UI 驱动的配置 + AI 驱动的文档 | | 孤立的日志和监控盲区 | 内置仪表盘和实时分析 | | 缓慢的 API 拖累整体系统性能。 | 具备“快速通道”的智能流量整形优先处理快速 API,防止系统出现瓶颈。 | | 对性能的可见性有限 | 追踪 API 性能并在用户之前捕捉异常 | | 缺乏可扩展性和治理能力 | 构建具有基于策略的流量控制和企业级安全性的 API 优先应用 | ## 核心 API 管理功能 在底层,digiRunner 依然是处理标准 RESTful 服务的强大引擎: - 高性能:专为高并发环境设计的低延迟路由。 - K8s 与混合云就绪:与 Kubernetes (K3s/Rancher) 无缝集成,适用于本地或云端部署。 - 全生命周期管理:在单一仪表盘中设计、发布、保护和分析您的 API。 ## digiRunner 的适用场景:真实业务场景 digiRunner 赋能各行各业的团队,轻松实施关键任务的 API 管理用例: • 金融服务 – 在数字银行和金融科技生态系统中执行安全标准,并控制对客户交易 API 的访问。 • 零售与电子商务 – 在流量高峰期,通过内置的速率限制、版本控制和监控来管理目录、库存和结账 API。 • 医疗保健与保险 – 通过细粒度的访问策略和审计追踪来治理敏感的 API endpoint。 • 软件与 SaaS 提供商 – 提供具备清晰文档和使用分析的、可扩展且安全的 API 层,以赋能合作伙伴和开发者。 • 政府与公共部门 – 将遗留系统与现代服务 API 统一在单个网关下,简化外部集成并确保合规性。 这些用例建立在 digiRunner 在可观测性、可扩展性和治理方面的核心优势之上——为团队提供了实现增长与敏捷的稳定基础。 ## 服务架构 Readme_Image_2025_12_16 ## 快速开始 ### 1. 使用 Container 选择以下选项之一以通过容器启动服务 #### 选项 1:Docker ``` docker run -it -d -p 31080:18080 tpisoftwareopensource/digirunner-open-source ``` #### 选项 2:Docker-Compose ``` name: digirunner-open-source services: dgr: image: tpisoftwareopensource/digirunner-open-source ports: - "31080:18080" environment: - TZ=Asia/Taipei ``` - 将上述配置保存为 `opendgr-compose.yml` - 在与 `opendgr-compose.yml` 相同的目录下运行 `docker-compose -f opendgr-compose.yml up -d` #### 选项 3:Kubernetes ``` apiVersion: v1 kind: Service metadata: name: digirunner-open-source-svc spec: ports: - name: tcp nodePort: 31080 port: 18080 protocol: TCP targetPort: 18080 selector: app: digirunner sessionAffinity: None type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: digirunner name: digirunner-open-source-deploy spec: replicas: 1 selector: matchLabels: app: digirunner template: metadata: labels: app: digirunner namespace: digirunner-open-source-ns spec: containers: - env: - name: TZ value: Asia/Taipei image: tpisoftwareopensource/digirunner-open-source imagePullPolicy: Always name: digirunner ports: - containerPort: 18080 name: tcp protocol: TCP workingDir: /opt/digirunner ``` - 将上述配置保存为 `digirunner-open-source.yml` - 运行 `kubectl apply -f digirunner-open-source.yml` #### 选项 4:Helm 贡献内容: - **[how-to-package-digirunner-using-helm](https://github.com/vulcanshen-tpi/how-to-package-digirunner-using-helm)** - 关于如何使用 Helm 打包 digirunner 开源项目的分步指南。 - 快速安装示例 #### 连接到服务 - 打开浏览器并访问:http://localhost:31080/dgrv4/login - 使用默认凭据登录: - 用户名:`manager` - 密码:`manager123` ### 2. 在本地计算机上即时运行 digiRunner 如果您想**无需安装或设置即可快速试用 digiRunner**,您可以使用我们为您的操作系统预打包的版本。 #### 🧩 步骤 1. 下载安装包 选择您的操作系统并从 [发布页面](https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source/releases/) 下载相应的文件: - **macOS (ARM64):** [`digirunner-opensource-macos-arm64-vX.X.X.X(version).zip`] - **Windows (AMD64):** [`digirunner-opensource-windows-amd64-vX.X.X.X(version).zip`] #### ⚙️ 步骤 2. 解压并运行 1. 解压下载的安装包。 2. 打开解压后的文件夹。 3. 双击 **`quickstart.exe`** 在您的本地计算机上启动 digiRunner。 您现在可以立即开始探索 digiRunner —— 无需安装,无需配置! #### 🌐 步骤 3. 在浏览器中访问 digiRunner 启动 digiRunner 后,打开浏览器并访问: 👉 [http://localhost:18080/dgrv4/login](http://localhost:18080/dgrv4/login) 使用以下默认凭据登录: ``` username: manager password: manager123 ``` 登录后,您就可以开始探索 digiRunner 的管理控制台,并在本地测试其功能。 #### ⚠️ 注意 首次运行该文件时,您可能会收到来自 macOS 或 Windows 的**安全或防火墙警告**。 这是因为我们尚未加入 Apple 或 Microsoft 开发者计划。 #### 🧹 步骤 4. 清理 测试后,您只需**删除整个解压后的文件夹**即可 —— digiRunner 不会在您的系统上修改或安装任何内容。 这个快速入门版本非常适合想要: - 在几分钟内在本地测试 digiRunner - 无需设置开销即可探索 API 管理功能 - 在测试后安全地删除所有内容 祝您愉快地体验 digiRunner!💡 ### 3. 运行您自己的构建 ### 前置条件 - OpenJDK 25 1. 克隆代码仓库: git clone https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source.git 2. 切换目录: cd digiRunner-Open-Source/ 3. 运行服务: ./gradlew :dgrv4_Gateway_serv:bootRun 4. 等待 digiRunner 的横幅出现。 ``` _ ____ _ _ __| | __ _| _ \ _ _ _ __ _ __ ___ _ __ __ __ || | / _` |/ _` | |_) | | | | '_ \| '_ \ / _ \ '__| \ \ / / || |_ | (_| | (_| | _ <| |_| | | | | | | | __/ | \ V /|__ _| \__,_|\__, |_| \_\\__,_|_| |_|_| |_|\___|_| \_/ |_| |___/ ========== dgRv4 web server info ============ ... ``` 5. 打开浏览器并访问:http://localhost:18080/dgrv4/login 6. 使用默认凭据登录: - 用户名:`manager` - 密码:`manager123` ## 创建简单的 API 代理 - [Documentation/create_a_simple_api_proxy](https://docs.tpi.dev/get-started/registering-your-first-apis-with-digirunner) ## 文档 - [文档](https://docs.tpi.dev/) ## 构建您自己的 JAR 1. 切换到 digiRunner 目录: cd digiRunner/ 2. 构建 JAR: ./gradlew :dgrv4_Gateway_serv:clean :dgrv4_Gateway_serv:bootJar 3. 定位 JAR 文件:`dgrv4_Gateway_serv/build/libs/digiRunner-{version}.jar` 4. 运行 JAR: java -jar dgrv4_Gateway_serv/build/libs/digiRunner-{version}.jar --digiRunner.token.key-store.path=$PWD/dgrv4_Gateway_serv/keys ## 在本地 Container Registry 中运行 digiRunner ### 1. 构建镜像 #### 切换到 digiRunner 目录: ``` cd digiRunner/ ``` #### 构建 Docker 镜像: ``` docker build -t digirunner . ``` ### 2. 运行容器 ``` docker run -p 18080:18080 digirunner ``` 打开浏览器并访问:http://localhost:18080/dgrv4/login ## SMART on FHIR 代理 digiRunner 实现了 **HL7 SMART on FHIR STU2.2** 标准,同时充当 **OAuth 2.0 授权服务器**和 FHIR API 资源的**反向代理**。这使医疗保健应用能够跨后端服务器安全地对 FHIR 请求进行身份验证、授权和路由。 ### 关键特性 - **SMART App Launch (独立与 EHR 启动)** — 完整的授权码流程,支持 PKCE S256、scope 验证、同意管理和 refresh token 轮换 - **FHIR 反向代理** — 将 `/smart-on-fhir/{proxyName}/*` 请求路由到可配置的后端 FHIR 服务器,包含 URL 重写、安全检查 (SQLi/XSS/XXE) 和 TPS 速率限制 - **客户端身份验证** — 支持 `public`、`client_secret_basic`、`client_secret_post` 和 `private_key_jwt`(根据 RFC 7523 的 client assertion)验证方法 - **分流与粘性路由** — 跨多个后端进行基于概率的流量拆分,通过粘性会话绑定实现资源类型亲和性 - **RS256 JWT token** — Access token 使用 RS256 签名;支持 `id_token` (OIDC)、token 内省 (RFC 7662) 和 JWKS endpoint - **管理 CRUD API** — 通过管理控制台创建、更新、搜索、删除、导入和导出 SMART Client 和 Proxy 配置 ### 授权流程 ``` sequenceDiagram participant App as SMART App participant DGR as digiRunner Gateway participant IdP as Built-in IdP participant FHIR as FHIR Server Note over App,FHIR: Standalone Launch App->>DGR: GET .well-known/smart-configuration DGR-->>App: endpoints, capabilities, scopes App->>DGR: GET /smart/authorize?aud=&client_id=&scope=&redirect_uri=&code_challenge=S256 DGR-->>IdP: 302 Redirect to IdP login IdP-->>App: User authenticates App->>DGR: GET /smart/callback?code=dgRcode DGR-->>App: 302 to consent page (or direct auth code if autoApprove) App->>DGR: POST /smart/approve (approved scopes & patient context) DGR-->>App: 302 ?code=authCode&state= App->>DGR: POST /smart/token (grant_type=authorization_code + code_verifier) DGR-->>App: {access_token, id_token, refresh_token, patient, encounter} App->>DGR: GET /smart-on-fhir/{proxyName}/Patient/123 (Bearer JWT) DGR->>+FHIR: Forward request (with security checks) FHIR-->>-DGR: FHIR Resource DGR-->>App: Rewritten response (URLs updated) ``` ### 发现 Endpoint 响应 `.well-known/smart-configuration` endpoint 返回 SMART on FHIR 的能力声明。它通过代理的 URL 路径提供服务: ``` GET http://localhost:18080/smart-on-fhir/{proxyName}/.well-known/smart-configuration ``` ``` { "token_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/token", "grant_types_supported": [ "authorization_code", "client_credentials", "refresh_token" ], "capabilities": [ "launch-standalone", "launch-ehr", "client-public", "client-confidential-symmetric", "client-confidential-asymmetric", "context-standalone-patient", "context-ehr-patient", "context-ehr-encounter", "permission-patient", "permission-user", "permission-v2", "permission-offline", "sso-openid-connect" ], "code_challenge_methods_supported": [ "S256" ], "issuer": "http://localhost:18080", "jwks_uri": "http://localhost:18080/dgrv4/ssotoken/smart/jwks", "authorization_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/authorize", "scopes_supported": [ "openid", "fhirUser", "profile", "launch", "launch/patient", "launch/encounter", "patient/*.cruds", "user/*.cruds", "system/*.cruds", "offline_access" ], "response_types_supported": [ "code" ], "introspection_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/introspect", "revocation_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/revoke", "token_endpoint_auth_methods_supported": [ "client_secret_basic", "client_secret_post", "private_key_jwt" ] } ``` ### 快速开始 **步骤 1:创建 SMART Client** 在管理 UI 中,导航到 **SMART Client Setting** 并注册一个客户端: - Client ID、类型 (公开/机密)、允许的 scope (例如 `patient/*.read`, `openid`, `profile`)、重定向 URI、启动模式 (独立/ehr/两者) **步骤 2:创建 FHIR Proxy** 在 **SMART on FHIR Proxy** 中,创建一个代理配置: - Proxy 名称 (用于 URL 路径)、后端 FHIR 服务器 URL、分流权重、安全设置 (启用 SQLi/XSS/XXE 检查)、TPS 限制 **步骤 3:配置粘性路由 (可选)** 将特定的 FHIR 源类型绑定到分流目标,以实现会话亲和性。 **步骤 4:获取 Access Token** 使用 SMART App Launch 流程获取 JWT access token,或者对后端服务使用带 client assertion 的 `client_credentials` 授权。 **步骤 5:调用 FHIR 资源** ``` curl -H "Authorization: Bearer " \ http://localhost:18080/smart-on-fhir/{proxyName}/Patient/123 ``` ## 🏅 社区徽章 我们通过徽章系统来表彰杰出的贡献者。 [初阶徽章](./Badges_Assets/01-First%20Step%20Badge.svg) [项目构建徽章](./Badges_Assets/02-Project%20Builder%20Badge.svg) - 📘 [徽章标准](./Badges.md) - 👑 [徽章获得者](./Community_Badges.md)
标签:AI网关, API网关, DLL 劫持, JS文件枚举, 后台面板检测, 域名枚举, 大语言模型, 子域名突变, 流量管理, 请求拦截