Prisma 服务托管指南:为基于 Prisma 的 GraphQL 服务器选择部署方案
Prisma 服务托管指南为基于 Prisma 的 GraphQL 服务器选择部署方案【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1基于 Prisma 构建 GraphQL 服务器时Prisma 本身只负责提供数据库层的 GraphQL API面向客户端应用的 GraphQL 服务器应用层需要由你自己部署和托管。本文以 docs/1.2/04-Reference/09-Migration-Guides/06-Server-Hosting.md 为核心系统梳理托管该应用层服务器的三种主流方案——Zeit Now、Apex Up 与 Serverless Framework——并讲解区域region选择、无服务器函数的适用边界等关键决策点。读完本文你将掌握为 Prisma 应用选择合适托管方式的方法并能避开订阅功能与无服务器架构冲突的常见陷阱。为什么你的 GraphQL 服务器需要单独托管在 Prisma 的架构中你的后端由两个 GraphQL 层组成详见 迁移指南概述数据库层由 Prisma 提供本质上是服务的核心。它根据数据模型datamodel暴露通用的 CRUD 操作是一个通用的 GraphQL API。应用层由你自己编写和部署它定义面向客户端的另一个 GraphQL API承载业务逻辑、鉴权、权限、文件处理等全部应用逻辑实现方式就是传统的 GraphQL resolver。关键点在于Prisma 服务本身运行在 Docker 上可以部署到任何云提供商如 Digital Ocean、AWS或使用 Prisma Cloud 的托管方案参考 集群部署教程.md)。而你的应用层 GraphQL 服务器例如使用 GraphQL Yoga、Apollo Server 等实现的 resolver 层需要独立托管才能把功能提供给客户端应用。区域Region选择与 Prisma 服务保持同区域在托管你的 GraphQL 服务器例如使用 Zeit Now、AWS Lambda 或其他托管提供商时应确保它部署在与 Prisma 服务相同的 region以获得最佳性能。这一要求的原因很直接应用层服务器上的每个 resolver 几乎都要把请求委托给底层的 Prisma API。如果两者部署在不同区域每次数据访问都要跨区域传输延迟会显著增加。同区域部署可以最大程度缩短应用层与数据库层之间的网络往返时间。从仓库实现看Prisma 集群的端点由 CLI 的Cluster类统一管理见 cli/packages/prisma-yml/src/Cluster.tsgetApiEndpoint负责拼接 HTTP API 端点baseUrl/service/stage形式getWSEndpoint将其中的http替换为ws以得到订阅端点getDeployEndpoint则指向集群的管理端点。你部署应用层服务器时填写的 Prisma endpoint就来自这一类拼接逻辑因此保持两边 region 一致是部署前的硬性检查项。方案一使用 Zeit Now 一键部署Zeit Now即今天的 Vercel是一个面向 Web 应用的一键部署工具它把部署过程抽象到极致只需要在项目目录中运行一次部署命令即可获得一个对外可访问的 HTTPS 地址。在 Prisma 的应用场景下Now 适合托管那些无状态、以请求-响应为主的 GraphQL 应用层服务器。Now 的官方文档与社区中有完整的教程演示如何将基于 Prisma 的 GraphQL 服务器部署到 Now原文档中以内部别名链接给出了该教程入口。该方案的特点是无需自己管理服务器进程、自动获得 CDN 与 SSL 能力与前面提到的同区域部署要求结合时只需在 Now 项目配置中指定与 Prisma 服务相同的部署区域即可。方案二使用 Apex Up 部署传统 Web 服务器Apex Up 解决的是另一个问题它允许你把传统的 Web 服务器直接部署到 AWS Lambda 上。如果你已经有了一个按传统方式编写的 Node.js GraphQL 服务器监听端口、运行 HTTP 框架不想为无服务器做大幅重构Up 会自动完成打包、上传、负载均衡与 HTTPS 配置使你的服务器以无服务器方式运行。在 Prisma 场景中这意味着你可以保留熟悉的服务器开发方式同时享受 AWS Lambda 的弹性伸缩与按需计费。需要留意的是Up 部署的应用本质上仍是 Lambda 上的进程因此下文关于无服务器函数与订阅冲突的限制同样适用。方案三使用 Serverless Framework 部署函数第三种选择是直接用无服务器函数提供商如 AWS Lambda、Google Cloud、Microsoft Azure来承载你的 GraphQL 应用层而最便捷的途径是使用 Serverless Framework。订阅功能与无服务器函数的冲突警告只有当你的客户端没有使用 GraphQL subscriptions 做实时功能时才能用无服务器函数提供商部署你的 GraphQL 服务器。原因是订阅要求 Web 服务器维持状态——服务器必须记住哪些客户端订阅了哪些事件并保持与这些客户端的开放连接——而无服务器函数无法做到这一点。这一点可以从本仓库的订阅服务实现得到印证server/servers/subscriptions/是一个独立运行的订阅服务模块它维护着与客户端的持久连接与会话状态例如 SubscriptionDependencies.scala 定义了订阅服务的依赖装配SubscriptionProtocol.scala 实现了客户端与服务端之间的订阅会话协议包含GqlConnectionInit等会话消息。这类保持连接、追踪订阅者的状态管理正是典型的长期运行进程职责与无服务器函数的按需、短生命周期模型天然冲突。因此在选择 Serverless 方案之前先回答一个问题你的应用是否依赖 GraphQL subscriptions 做实时推送如果答案是肯定的应改用 Now、Up 或传统容器方案如果只使用 query 与 mutation无服务器方案则完全可行。开始使用 Serverless Framework要开始使用 Serverless Framework首先需要安装 CLI 并登录npm install -g serverless serverless login安装并登录后根据你选择的无服务器函数提供商可以参照 Serverless Framework 官方文档中的快速入门指南完成配置。它支持的主流提供商包括AWS LambdaMicrosoft Azure FunctionsIBM Open WhiskGoogle Cloud Platform FunctionsKubeless运行在 Kubernetes 上的无服务器框架SpotinstWebtasksAuth0 提供的无服务器平台每种提供商的配置文件serverless.yml与函数打包方式略有差异但整体工作流一致定义一个函数即你的 GraphQL 应用层入口通过 API 网关将 HTTP 请求路由到该函数函数内部调用 Prisma API 完成数据读写。实操建议在 Prisma 场景下的部署检查清单结合 prisma.yml 服务配置文档 与上述托管方案部署时建议按以下清单核对确认两层端点分离prisma.yml中配置的cluster、stage决定 Prisma API 端点例如https://cluster-url/service/stage你的应用层服务器代码中引用的 Prisma endpoint 必须与该端点一致。区域一致应用层托管区域与 Prisma 服务所在 region 保持一致。订阅能力评估若使用 subscriptions选择能维持长连接状态的托管方式Now、Up、容器、自建服务器纯 query/mutation 应用可放心使用无服务器函数。鉴权与密钥prisma.yml中的secret用于签发 JWT 令牌CLI 侧的实现见 Cluster.ts其中PRISMA_MANAGEMENT_API_SECRET环境变量可覆盖集群密钥。将密钥注入托管平台的环境变量而不是写死在代码或配置文件中。部署验证在开发环境完成整个迁移与部署流程后再进入生产环境官方迁移指南的建议见 迁移指南概述并使用import/export功能在不同项目间迁移数据。总结托管基于 Prisma 的 GraphQL 服务器时核心决策不是哪种工具更好而是你的应用是否依赖实时订阅需要 subscriptions选择 Zeit Now、Apex Up 或传统容器部署因为它们能维持服务器状态与开放连接仅 query/mutationZeit Now、Apex Up、Serverless Framework 均可其中 Serverless Framework 覆盖 AWS Lambda、Azure、GCP 等主流无服务器平台。无论选择哪种方案都请牢记两条铁律应用层服务器与 Prisma 服务同区域部署以保障性能将prisma.yml中的集群配置、鉴权密钥与订阅能力评估纳入部署清单确保上线后的 GraphQL 服务稳定、低延迟且可维护。【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考