作者 | 连喆人(掌上乾坤公司)

本文选自 “Serverless 函数计算征集令" 征文

利用 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 函数

有了代码, 我们还需要部署地址。这里我们以阿里云函数计算 FC 为例,首先是创建自定义运行时函数:

  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"
);

当以上命令执行成功,我们就完成了一键部署 Deno Web 应用到 Aliyun Serverless 的全部流程。接写来我们可以使用上文配置的访问域名来查看我们的 UA Web 是否正常工作。

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

阅读原文:

https://developer.aliyun.com/article/986503

更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。

1 分钟在 Serverless 上部署现代化 Deno Web 应用的更多相关文章

  1. 10分钟在 Rainbond 上部署 mall 电商项目

    很多小伙伴在学习 mall 电商项目时,都会在部署上折腾许久,虽然目前已经提供了很多种部署方式,比如 在 Linux 上部署 mall .使用 Docker 或 DockerCompose 部署 ma ...

  2. 一个tomcat服务器上部署多个Web项目,不同域名访问

    [参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...

  3. 服务器上部署Struts2的web项目报struts-default.xml:131:154的解决方法

    背景: 用学生特价买了阿里云的服务器一年,为了练手,开始把毕业设计项目部署到该服务器上去. 项目使用的技术:Struts2 服务器上用tomcat启动该项目. 问题: 在楼主本地启动tomcat成功, ...

  4. 在IIS上部署基于django WEB框架的python网站应用

    django是一款基于python语言的WEB开源框架,本文给出了如何将基于django写的python网站部署到window的IIS上. 笔者的运行环境: Window xp sp3 IIS 5.1 ...

  5. 一个tomcat上部署多个项目,并通过不同端口号访问不同的项目

    原文:http://www.cnblogs.com/kismetv/p/7228274.html#title3-1 现在以部署两个项目为例: 第一步:修改tomcat下的server.xml文件 配置 ...

  6. 几种部署Goku API Gateway的方式,最快一分钟可使用上网关

    本文将介绍几种部署Goku API Gateway的方式,最快一分钟可使用上为网关,详情请看全文. 什么是Goku API Gateway? Goku API Gateway (中文名:悟空 API ...

  7. 虚拟机评估——如何确定一个CPU核上部署的虚拟机数量?

    最近研究虚拟化技术,不可避免遇到一个问题:如何评估物理主机上虚拟主机的容量?下面这篇文章的思路有一定的启发性,转发一下. 如何确定一个CPU核上部署的虚拟机数量? 摘要:本文说明一个CPU核上部署虚拟 ...

  8. [原创]在HP DL380 G7服务器上部署基于Ubuntu Server 16.04 和 VirtualBox的云平台

    对于一线开发人员来说,一提到虚拟机平台,往往会让人联想到在价格昂贵的服务器上部署VMware vSphere之类软件来实现. 笔者作为一个资深码农,也是一直梦寐着在自己家中打造一个真正的家庭私有云,秒 ...

  9. 15分钟在笔记本上搭建 Kubernetes + Istio开发环境

    11月13~15日,KubeCon 上海大会召开,云原生是这个秋天最火热的技术.很多同学来问如何上手 Kubernetes和Istio 服务网格开发.本文将帮助你利用Docker CE桌面版,15分钟 ...

  10. Just 5分钟!使用k3s部署轻量Kubernetes集群快速教程

    大小仅有40MB的k3s为想要节省开销进行开发和测试的企业提供了一个很好的选择.本文将用一种极为简洁的方式,教你在5分钟之内使用k3s部署轻量Kubernetes集群. Kubernetes已经改变了 ...

随机推荐

  1. 基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI

    前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布.定时更新某一个业务状态.定时删除一些冗余数据等等.今天给大家推荐一个基于.NET Core + Quartz.NET + ...

  2. Ascii字符画 在线生成工具

    英文 http://patorjk.com/software/taag/ 点击 Test All 一键测试所有样式 目前有317种可选 个人常用格式 3D-ASCII ANSI Shadow Bulb ...

  3. 使用dtd定义属性

  4. 学习JVM---入门

    1.JVM体系结构 JVM的位置 JVM体系结构 2.类加载器 双亲委派机制 package java.lang; /** * 测试自定义java.lang.String类能否运行成功 * 体会双亲委 ...

  5. ElasticSearch之Index stats API

    获取指定索引的统计数据. 获取指定索引的全部统计数据,命令样例如下: curl -X GET "https://localhost:9200/testindex_001/_stats?pre ...

  6. export详解

    linux下export命令详解 export:将自定义变量设定为系统环境变量(当前shell中有效) 功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] ...

  7. 为什么OpenAPI是未来企业数字化转型的决定性因素?

    本文分享自华为云开发者联盟公众号<为什么OpenAPI是未来企业数字化转型的决定性因素?>. 随着数字经济不断发展升级,数据互通.万物互联正在逐步成为IT产业发展的主旋律,企业数字化转型也 ...

  8. 数仓集群管理:单节点故障RTO机制分析

    摘要:大规模分布式系统中的故障无法避免.发生单点故障时,集群状态和业务是如何恢复的? 本文分享自华为云社区<GaussDB (DWS) 集群管理系列:单节点故障RTO机制分析(集群状态恢复篇)& ...

  9. 鸿蒙轻内核M核源码分析:中断Hwi

    摘要:本文带领大家一起剖析了鸿蒙轻内核的中断模块的源代码,掌握中断相关的概念,中断初始化操作,中断创建.删除,开关中断操作等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列五 中断Hwi&g ...

  10. 让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!

    摘要:在华为全联接2021期间,华为云GaussDB(for openGauss)正式推出重大内核新特性--同城双集群高可用方案,提供金融级高可用服务,支持RPO=0 .RTO<60s的同城双集 ...