在本文中,我將引导您使用TypeScript、AWS Lambda和Apollo Server創建無服務器的GraphQL API。
無服務器計算
無服務器計算是一種雲計算執行模型,在這種模型中,雲提供商自動管理運行應用程序的基础設施。在這個模型中,開發者撰寫代码,雲提供商則負責運行、擴展和維護服務器,意味著開發者不需要擔心服務器管理、基礎設施提供或擴展。 “無服務器”這個詞彙并不意味着沒有服務器參與,而是指服務器管理任務從開發者手中抽象化。AWS Lambda 是Amazon Web Services (AWS)提供的無服務器計算服務,讓您能夠在不提供或管理服務器的情況下運行代碼
GraphQL
GraphQL是一種用於API的查询语言和執行這些查询的运行時。它允許客戶端请求确切需要的数据,与REST相比,这更为高效,REST可能会过度获取或不足获取数据。通过GraphQL,客户端指定响应的形状和结构,在一次请求中检索多个资源。这种灵活性提高了性能并减少了网络开销。GraphQL是强类型的,有一个定义可用类型和操作的架构。它在现代应用程序中广泛使用,以优化前端和后端之间的通信,实现更响应和高效的数据管理。
Apollo Server
流行、開源的 GraphQL 服務器,助於開發者輕鬆創建 GraphQL API。它通過處理要提高的定義、查詢執行和回應格式化, simplify the process of building a robust and scalable GraphQL API。Apollo Server 支持如资料获取、缓存和认证等特性,使其對於現代應用程序來說高度適應。它與各種數據源无缝工作需要,包括 REST APIs、數據庫和微服務。凭借内置的性能监控和錯誤處理工具,Apollo Server 常被用來簡化後端開發,為 GraphQL 環境中的客戶端和服務器之間提供高效和靈活的通信。
為甚麼使用 TypeScript?
這是 JavaScript 的超集,為語言添加了靜態類型。它有助於在開發過程中捕获錯誤、提高代人阅读性以及增强重构。通過提供類型安全和支持工具,TypeScript 使更易於維護和可擴展的應用程序變得理想,使其成為大項目或團隊的理想選擇。
為甚麼我認為无服务器和 GraphQL 一起工作得很好(或在“代码中的一段爱情故事”)
- 最佳化的資源使用:GraphQL 精確的數據獲取與无服务器按使用量付費模式完美對應,確保有效地資源利用。
- 簡化的後端:無服务器函數可以有效地處理 GraphQL 解算器,簡化了後端架构。
- 提升性能:GraphQL 減少數據開銷的能力强,搭配無服务器架構能使應用程序運行得更快。
- 可伸縮性: 兩種技術皆擅长處理不同負載,使其組合具有高度可伸縮性。
- 成本效益: 无服务器计算的按使用付费模式,加之GraphQL高效的数据传输,可帶來显著的成本节省。
“無服务器和GraphQL的組合可以使可伸縮且高效的API快速開發。這是一對強大的組合,可以顯著減少開發時間和運營成本。” – Nader Dabit, “全栈无服务器“
以下是使用AWS Lambda中的GraphQL部署服務的步驟。
- 步驟1: 初始化一個新的TypeScript項目並安裝依賴。
mkdir serverless-graphql-api
cd serverless-graphql-api
npm init -y
npm install typescript @types/node --save-dev
npx tsc --init
npm install apollo-server-lambda graphql @types/aws-lambda
npm install --save-dev serverless-offline
- 步驟2: 使用必要的元素定義GraphQL架构。
import { gql } from 'apollo-server-lambda';
export const typeDefs = gql`
type Query {
auto: String
}
type Mutation {
sayAuto(name: String!): String
}
`;
- 步驟3: 實現解算器:
export const resolvers = {
Query: {
auto: () => 'Hello from serverless GraphQL!',
},
Mutation: {
sayAuto: (_: any, { name }: { name: string }) => `Hello, ${name}!`,
},
};
- 步驟4: 創建Lambda處理程序:
import { ApolloServer } from 'apollo-server-lambda';
import { typeDefs } from './schema';
import { resolvers } from './resolvers';
const server = new ApolloServer({
typeDefs,
resolvers,
});
export const graphqlHandler = server.createHandler();
- 步驟5: 配置無服務器部署。創建一個
serverless.yml
文件:
service: serverless-graphql-api provider: name: aws runtime: nodejs16.x stage: dev region: us-east-1 functions: graphql: handler: handler.graphqlHandler events: - http: path: graphql method: post - http: path: graphql method: get plugins: - serverless-offline
您可以直接在AWS中使用Lambda撰寫程式碼(快速的Hello World),並使用適當的部署選項如CDK或Terraform。由於無伺服器計算和GraphQL持續發展,我們可以期待出現更多強大的工具和實踐。
結論
通過 embrace serverless GraphQL,開發者可以創建可輕鬆擴展且精確滿足客戶需求的API。這就像擁有了一個总是一目了然、知道 Always exactly what data to fetch and scale 的晶體球。
Source:
https://dzone.com/articles/serverless-computing-and-graphql