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

本文选自 “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. 时间复杂度为 O(n^2) 的排序算法

    对于小规模数据,我们可以选用时间复杂度为 O(n2) 的排序算法.因为时间复杂度并不代表实际代码的执行时间,它省去了低阶.系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n2) 的排序算法 ...

  2. Go笔记(1)-变量的详细用法

    变量 (1)变量的定义 Go语言是静态类型的语言,所有类型都需要明确的定义. var是声明变量的关键字 使用格式:var 变量名 变量类型 变量命名规范:遵循驼峰格式,首个单词小写,每个新单词的首字母 ...

  3. 【scikit-learn基础】--『数据加载』之样本生成器

    除了内置的数据集,scikit-learn还提供了随机样本的生成器.通过这些生成器函数,可以生成具有特定特性和分布的随机数据集,以帮助进行机器学习算法的研究.测试和比较. 目前,scikit-lear ...

  4. xml的语法总结

    xml的语法总结

  5. 基于WebRTC的局域网文件传输

    基于WebRTC的局域网文件传输 WebRTC(Web Real-Time Communications)是一项实时通讯技术,允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点P2P ...

  6. 神经网络优化篇:详解神经网络的权重初始化(Weight Initialization for Deep NetworksVanishing / Exploding gradients)

    神经网络的权重初始化 这是一个神经单元初始化地例子,然后再演变到整个深度网络. 来看看只有一个神经元的情况,然后才是深度网络. 单个神经元可能有4个输入特征,从\(x_{1}\)到\(x_{4}\), ...

  7. proxy代理实现接口调用处理

    proxy代理实现接口调用处理 我们知道,要调用接口必须要实例化才能调用. 那么我们能不能不实例化调用呢?像mybatis.hibernate那样定义一个接口就能注入调用.其实他们的底层实现就是用代理 ...

  8. ubuntu 之 安装mysql8

    安装 1 wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb 2 sudo apt-get update sudo apt ...

  9. 面试官:禁用Cookie后Session还能用吗?

    Cookie 和 Session 是 Web 应用程序中用于保持用户状态的两种常见机制,它们之间既有联系也有区别. Cookie 是由服务器在 HTTP 响应中发送给客户端(通常是浏览器)的一小段数据 ...

  10. LeetCode DFS、BFS篇(102、200、111、752)

    102. 二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点). 示例: 二叉树:[3,9,20,null,null,15,7], 3 / 9 ...