一分钟在 Serverless 上部署现代化 Deno Web 应用

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 利用 Serverless 的水平扩展与按量付费, 结合自定义运行时, 实现 Web 应用的快速迁移. 而 Deno 运行时是新一代的 JS 运行时, 使用阿里云 Serverless + Deno 的组合, 我们可以快速开发现代化 Web 应用. Deno 配合 Serverless Devs 工具, 可以快速实现代码部署工作. 至此, 阿里云函数计算 + Serverless Devs + Deno + TypeScript 的组合实现了软件的快速开发, 快速迭代, 快速部署, 快速伸缩. 最终利用云端优势, 快速解决业务问题.

(为) 什么是 Serverless

在 Web 开发领域, Serverless 相比传统方式, 最大的优势在于
可以在低运维前提下实现水平扩展. 这样开发者得以将主要精力放在业务上,
而不是为了支持可能的高并发而过多关注繁杂的技术细节, 因为专注于业务,
大大提升了开发效率, 降低了开发成本.
同时弹性的水平扩展可以支持任何访问频次的业务需求, 而无需担心成本收益不符问题.
从日 1 PV 到日 1,000,000 PV 的应用都可以支持, 而无需进行额外配置,
不需要自己做集群管理, 也无需承担固定的费用, 按使用量付费即可.

我们可以把 Serverless 理解为无需自己管理的按需扩缩的容器集群.
在 Web 应用的开发上, 无论从技术角度, 还是成本角度, Serverless 都更有优势.

如何实现传统 Web 应用到 Serverless 的迁移呢?

理论上, 任何编程语言语言都可以在 Serverless 上进行使用.
不过在具体实现上, Serverless 提供了如下几种方法:

  1. 直接运行脚本语言. (Serverless 容器已经携带目标语言运行时, 仅上传代码即可)
  2. 运行时 + 语言脚本. (全部上传到 Serverless)
  3. 可执行文件. (在本地编译为可执行文件, 然后上传到 Serverless)
  4. 自定义容器. (目前阿里云 Serverless 支持 Docker 镜像以生成容器)

以上几种方法, 在阿里云 Serverless 上均支持.

对比以上几种方法的优缺点.
直接运行脚本语言是冷启动时间 (即代码执行前 Serverless 容器准备的时间) 最短的.
自定义容器是兼容性最好的. 而我们此处用到的是一个平衡做法: 自定义运行时.

之所以选择自定义运行时, 是因为我们采用的运行时是 Deno, 一款现代化 JS/TS 运行时.

一方面, 虽然 JS 是脚本语言, 但阿里云目前还不支持 Deno 运行时, 所以无法通过
直接运行脚本语言 的方式在 Serverless 上运行应用.
另一方面, Deno 提供类似 Go 语言的打包为可执行文件功能,
无需使用容器即可实现代码的跨平台运行.

(为) 什么是 Deno

Deno, 是一款 JS/TS 运行时, 与 Node.js 一样使用 V8 作为 JS 解释器, 保证了速度,
与 Node.js 不同的是, 使用 Rust 而非 C++ 作为开发语言, 与操作系统进行沟通.
(二者相同的另一点是发起人和最初的主要开发者均为 Ry, Ryan Dahl)

Node.js 作为后端 JS 运行时, 无疑是影响巨大且成功的. 但 Node.js 诞生在多年前,
随着 ECMAScript 的发展, JavaScript(JS) 已经今非昔比, 而为了保证生态兼容性,
Node.js 又难以进行大刀阔斧的改革. 这就是 Deno 诞生的大背景.

而对于开发者而言, Deno 除了更好的 ECMAScript 兼容性,
还提供开箱即用的 TypeScript (TS) 支持,
提供更健壮类型约束的同时大大降低了开发环境配置等不必要的消耗.

目前, 随着 Deno 版本的不断迭代, 在 Web 开发场景下,
Deno 已经可以实现大部分 Node.js 可以实现的功能.
使用 Deno 作为运行时对 JS 开发者来说可以快速上手, 不会有过大负担.

相比 Node.js, Deno 的最大优势有两个:

  1. 支持 Web API. (比如 fetch, crypto 等)
  2. 支持文件引用, 而不需要使用 npm 这样的包管理器.

支持 Web API 可以打通前后端技术栈, 而 npm 苦开发者久矣.

简单的 Deno Web 应用例子

使用 Deno 开发 Web 应用非常简单,
下面我们来快速创建一个简单的 Web 应用实现 UA 显示.

import { serve } from "https://deno.land/std@0.148.0/http/server.ts";

function handler(req: Request): Response {
  return new Response(
    ["Hello, World!", req.method, req.url, req.headers.get("user-agent")].join(
      "\n"
    )
  );
}

serve(handler, { port: 9000 });

现在我们将以上代码保存在 /User/zsqk/web/main.ts 地址中.

创建 Serverless 函数

有了代码, 我们还需要部署地址. 这里我们以阿里云函数计算为例.

首先是创建自定义运行时函数.

  1. 进入阿里云函数计算 Web 控制台.
  2. 点击左侧导航栏 "服务与函数".
  3. 点击 "创建服务" 进行服务的创建.
  4. 点击服务名称进入服务界面.
  5. 点击 "创建函数".
  6. 在创建函数时, 选择 "使用自定义运行时平滑迁移 Web Server", 然后进行函数创建.

然后需要绑定域名.

  1. 回到函数计算首页后, 点击左侧导航栏 "域名管理".
  2. 点击 "添加自定义域名".
  3. 在添加自定义域名时, 选择刚才我们创建的服务及函数.

此时我们就完成所有基础配置, 拿到了需要的参数:

  1. 服务名.
  2. 函数名.
  3. 访问域名.

在 Serverless 上一键部署 Deno Web 应用

在 Serverless 上部署 Deno Web 应用是很方便的. 我们可以实现一键部署.

利用阿里云 Serverless 的自定义运行时, 在本地构建出一个可执行文件,
然后通过 [Serverless Devs] 工具将代码部署到函数计算, 在 Serverless 上执行即可.

这里我们假定已经在本地环境安装好了 Deno 与 s 工具.

现在创建如下配置文件并放到 /User/zsqk/web/s.yaml 中.

edition: 1.0.0
name: zsqk-fc
access: default
services:
  fc-z1-deno:
    component: devsapp/fc
    props:
      region: ${地区}
      service:
        name: ${服务名}
      function:
        name: ${函数名}
        instanceConcurrency: 5
        instanceType: e1
        memorySize: 128
        runtime: custom
        timeout: 3
        codeUri: "./dist"

代码和部署配置文件都已经准备好, 下面只需要构建并上传代码即可.

首先进入 /User/zsqk/web/ 目录中, 使用以下为使用 Deno 运行构建及上传命令的例子:

// 构建 deno 文件
const r = Deno.run({
  cmd: [
    `deno`,
    "compile",
    "--output",
    "dist/bin/zsqk",
    "--target",
    "x86_64-unknown-linux-gnu",
    "--allow-all",
    "/User/zsqk/web/main.ts",
  ],
});
await r.status();
r.close();
Deno.writeTextFileSync(
  `/User/zsqk/web/dist/bootstrap`,
  "#!/bin/bash\n./bin/zsqk --allow-all"
);
// 准备上传
const r = Deno.run({
  cmd: ["s", "deploy", "function", "--use-local"],
});
await r.status();
r.close();

当以上命令执行成功,
我们就完成了一键部署 Deno Web 应用到 Aliyun Serverless 的全部流程.

接写来我们可以使用上一章配置的访问域名来查看我们的 UA Web 是否正常工作.

至此, 我们就完成了整个工作. 之后, 如果每次需要应用代码变动,
只需要重新执行构建及部署命令即可.

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
2月前
|
前端开发 JavaScript
构建你的第一个Web应用:从零到部署
【8月更文挑战第33天】 在这篇文章中,我们将一起踏上构建一个基本Web应用的旅程。不同于传统的“安装这个、运行那个”教程,我们的目标是通过理解每一步的意义和目的来深化你的技术理解。我们将探索HTML、CSS、JavaScript的基础,并学习如何将它们结合起来创建一个简单的个人网站。接着,我们会介绍如何使用GitHub Pages进行免费部署,让你的应用上线。准备好了吗?让我们开始吧!
|
2月前
|
负载均衡 网络协议 应用服务中间件
web群集--rocky9.2源码部署nginx1.24的详细过程
Nginx 是一款由 Igor Sysoev 开发的开源高性能 HTTP 服务器和反向代理服务器,自 2004 年发布以来,以其高效、稳定和灵活的特点迅速成为许多网站和应用的首选。本文详细介绍了 Nginx 的核心概念、工作原理及常见使用场景,涵盖高并发处理、反向代理、负载均衡、低内存占用等特点,并提供了安装配置教程,适合开发者参考学习。
|
3月前
|
Java UED 自然语言处理
Struts 2 国际化竟有如此神奇魔力?快来揭开多语言支持的 Web 应用神秘面纱
【8月更文挑战第31天】在全球化背景下,Web应用需适应多种语言环境。Struts 2凭借其强大的国际化(i18n)支持,简化了多语言应用开发。通过不同语言的资源文件,它能自动匹配用户语言偏好,优化用户体验并扩展用户群。下面是一个示例:创建`messages.properties`(英语)与`messages_zh_CN.properties`(中文),并在Struts 2的Action类及JSP页面中调用`getText()`方法及Struts标签展示相应语言内容。此外,在struts.xml中指定资源文件,以确保框架正确加载对应语言包。通过这些步骤,开发者可以轻松实现应用的多语言支持。
65 0
|
3月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
55 0
|
3月前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
64 0
|
2月前
|
人工智能 自然语言处理 Serverless
阿里云函数计算 x NVIDIA 加速企业 AI 应用落地
阿里云函数计算与 NVIDIA TensorRT/TensorRT-LLM 展开合作,通过结合阿里云的无缝计算体验和 NVIDIA 的高性能推理库,开发者能够以更低的成本、更高的效率完成复杂的 AI 任务,加速技术落地和应用创新。
149 13
|
3月前
|
Serverless API 异构计算
函数计算产品使用问题之修改SD模版应用的运行环境
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
运维 Serverless 网络安全
函数计算产品使用问题之通过仓库导入应用时无法配置域名外网访问,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
16天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
51 1
|
20天前
|
运维 监控 Serverless
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
30 1

热门文章

最新文章

相关产品

  • 函数计算