V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Jianzs
V2EX  ›  分享创造

Pluto 构建云应用:食用指南

  •  
  •   Jianzs ·
    pluto-lang · 2023-11-22 16:31:08 +08:00 · 1870 次点击
    这是一个创建于 400 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    安装

    前置条件

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

    Pluto CLI

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

    npm install -g @plutolang/cli
    

    验证是否安装成功:

    pluto --version
    

    Hello, Pluto

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

    创建 Pluto 项目

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

    pluto new
    

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

    $ 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 编写如下代码:

    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 ,用来保存用户的上一次访问时间。

    部署应用

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

    pluto deploy
    

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

    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:

    pluto stack new 
    

    部署时指定 stack:

    pluto deploy --stack <new_stack>
    

    更多资源

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

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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:20 · PVG 03:20 · LAX 11:20 · JFK 14:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.