Pluto 构建云应用:食用指南

开发者只需在代码中定义一些变量,Pluto 就能基于这些变量自动创建与管理必要的云资源组件,达到简化部署和管理云基础设施的目的,让开发者更容易使用云。

这里的云资源并非指 IaaS,而是指 BaaS、FaaS 等托管资源组件。这类托管组件相较于自建实例通常具有更高的可靠性与更低的成本。

这篇文章将介绍 Pluto 的安装步骤与示例,帮助开发者熟悉 Pluto 的特性。

安装

前置条件

  • Node.js: Pluto 支持使用 TypeScript 编写云应用程序。
  • Pulumi: Pluto 使用 Pulumi 与云平台(AWS 或 K8s)进行交互,部署云资源。

Pluto CLI

Pluto 命令行工具利用 npm 进行安装:

shell 复制代码
npm install -g @plutolang/cli

验证是否安装成功:

shell 复制代码
pluto --version

Hello, Pluto

接下来,开始创建并部署一个 Pluto 项目。

创建 Pluto 项目

通过运行以下命令,使用 Pluto CLI 创建 Pluto 项目:

shell 复制代码
pluto new

该命令将交互式地创建一个项目,并使用提供的项目名称创建一个目录。下面是一个输出示例:

vbnet 复制代码
$ pluto new
? Project name hello-pluto
? Stack name dev
? Select a platform AWS
? Select an IaC engine Pulumi
Info:  Created a project, hello-pluto

编写业务代码

使用你习惯的编辑器,在 <project_root>/src/index.ts 编写如下代码:

typescript 复制代码
import { Router, Queue, KVStore, CloudEvent, HttpRequest, HttpResponse } from "@plutolang/pluto";

const router = new Router("router");
const queue = new Queue("queue");
const kvstore = new KVStore("kvstore");

// Publish the access time to the queue, and respond with the last access time.
router.get("/access", async (req: HttpRequest): Promise<HttpResponse> => {
  const name = req.query["name"] ?? "Anonym";
  await queue.push(JSON.stringify({ name, accessAt: `${Date.now()}` }));
  const lastAccess = await kvstore.get(name).catch(() => undefined);
  const respMsg = lastAccess
    ? `Hello, ${name}! The last access was at ${lastAccess}`
    : `Hello, ${name}!`;
  return { statusCode: 200, body: respMsg };
});

// Subscribe to messages in the queue and store them in the KV database.
queue.subscribe(async (evt: CloudEvent): Promise<void> => {
  const data = JSON.parse(evt.data);
  await kvstore.set(data["name"], data["accessAt"]);
  return;
});

这段代码包含 3 个资源变量和 2 个处理过程:

  • 一个 HTTP 服务 router,接受 /access HTTP 请求,请求中将本次的访问时间发布到消息队列 queue,然后从 KV 数据库 kvstore 中获取上一次访问时间,并返回。
  • 一个消息队列 queue,有一个订阅者,将消息队列中的消息保存到 KV 数据库 kvstore 中。
  • 一个 KV 数据库 kvstore,用来保存用户的上一次访问时间。

部署应用

执行下面这条命令就能将应用发布到起初你配置的云平台上:

shell 复制代码
pluto deploy

如果你指定的云平台是 AWS,请保证 AWS_REGION 环境变量被正确配置,例如:

shell 复制代码
export AWS_REGION=us-east-1

Pluto 将会在你指定的云平台上创建 3 个资源组件和 2 个函数对象,以 AWS 为例,将会创建:

  • 1 个命名为 router 的 ApiGateway
  • 1 个命名为 queue 的 SNS
  • 1 个命名为 kvstore 的 DynamoDB
  • 2 个名字以 function 开头的 Lambda 函数

多平台部署

如果你想部署到其他云平台可以通过创建新的 stack,并在部署时指定 stack 的方式进行:

创建新的 stack:

shell 复制代码
pluto stack new 

部署时指定 stack:

shell 复制代码
pluto deploy --stack <new_stack>

更多资源

Pluto 的主要思路是使用静态程序分析和 IaC 等技术让开发者定义一个变量就自动创建一个云平台上的资源组件。 Pluto 目标是帮助个人开发者更轻松地构建云原生应用程序,降低云能力的上手难度。

Pluto 还处于非常早期的阶段,欢迎感兴趣的大佬们参与共建,如果你在使用 AWS 或者 K8s,可以给我们提需求了。同时有任何想法或者建议,都非常欢迎,说出来,你的想法就会在后续版本实现。欢迎加入我们的 Slack 和 钉钉群: 40015003990。

相关推荐
Wect3 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
Dilettante2583 小时前
这一招让 Node 后端服务启动速度提升 75%!
typescript·node.js
jonjia19 小时前
模块、脚本与声明文件
typescript
jonjia19 小时前
配置 TypeScript
typescript
jonjia20 小时前
TypeScript 工具函数开发
typescript
jonjia20 小时前
注解与断言
typescript
jonjia20 小时前
IDE 超能力
typescript
jonjia20 小时前
对象类型
typescript
jonjia20 小时前
快速搭建 TypeScript 开发环境
typescript
jonjia20 小时前
TypeScript 的奇怪之处
typescript