#! https://zhuanlan.zhihu.com/p/397000004
很多人对 Serverless
感兴趣,但是却不知道怎么入门
本篇文章,不提任何概念,简单粗暴的告诉大家使用和迁移的方法,
以期快速享受到 Web 函数 带来的诸多好处。
一句话,无论我们使用什么框架,只要它提供 http 监听服务,我们就可以快速部署到 Web 函数 上。
首先安装 nodejs
,然后安装 @serverless/components
yarn global add @serverless/components
# or
npm i -g @serverless/components
在命令行中,执行 components -v
出现版本号,即安装成功。
接着我们要配置腾讯云的 secretId
, secretKey
登录腾讯云控制台
-> 访问管理
-> 访问秘钥
-> API密钥管理
创建并复制这 2 个之后
直接在命令行执行 components credentials -i ${secretId} -k ${secretKey}
,把${}
占位符的换成你自己的 id 和 key
这个命令是在你的机器上创建部署的全局凭证,省的每个项目都要放个包含secretId
,secretKey
环境变量的 .env
文件。
可以在你的用户根目录下的
.serverless/tencent/credentials
里面看到全局配置
这里以 nodejs
为例,我们不需要关心,到底使用的是哪个框架 express
/ koa
/ nestjs
/ nextjs
/ nuxtjs
/ fastify
... 还是原生 http
。
找到 nodejs
项目的入口文件,让这个应用去监听 9000
端口,代码部分就 ok 了。
然后在项目中创建 scf_bootstrap
(没有后缀,换行用LF
),写入
#!/bin/bash
export PORT=9000 # 告诉它你的应用提供http服务的端口
/var/lang/node12/bin/node path/to/your/listener.js # 告诉它你的应用的启动方法 `listener.js` 是一个路径
这个文件是 Web函数
的入口文件,用来告诉 Web函数
,请求透传到哪个端口,以及怎么启动。
然后再在 scf_bootstrap
同级目录创建一个 serverless.yml
写入:
app: hello-web-function
stage: dev
component: scf # 注意这一行
name: hello-web-function-node12-app
inputs:
name: ${name}
region: ap-shanghai
runtime: Nodejs12.16
src:
src: ./
type: web # 注意这一行
handler: scf_bootstrap # 注意这一行
events:
- apigw:
parameters:
protocols:
- http
- https
environment: release
endpoints:
- path: /
method: ANY
function:
type: web # 注意这一行
然后,执行 components deploy
就部署成功了
可以在命令行中看到分配的网关地址,直接访问,就进入我们刚刚部署的项目里。
Web 函数 不限框架和语言,只要你告诉它一个监听端口,就可以直接上 serverless
去运行。
语言版本 | 绝对路径 |
---|---|
Nodejs 10 | /var/lang/node10/bin/node |
Nodejs 12 | /var/lang/node12/bin/node |
Python 2 | /var/lang/python2/bin/python |
Python 3 | /var/lang/python3/bin/python3 |
PHP 5.6 | /var/lang/php5/bin/php |
PHP 7.2 | /var/lang/php7/bin/php |
Go 1 | /var/lang/go1/bin/go |
JAVA 8 | /var/lang/java8/bin/java |
这是目前 scf
默认提供的标准语言环境
不同语言编写的应用,我们只需要在 scf_bootstrap
, 找到对应的语言版本后,把绝对路径替换一下就行。
比如:
#!/bin/bash
export PORT=9000
/var/lang/node12/bin/node path/to/your/listener.js # nodejs12
#!/bin/bash
export PORT=9000
/var/lang/python3/bin/python3 path/to/your/entry.py # python3
#!/bin/bash
/var/lang/php7/bin/php -c /var/runtime/php7 -S 0.0.0.0:9000 hello.php # php7
当然,假如你没有找到,你想使用的语言 (.Net Core
,Rust
), 或者是对标准环境下的版本感到不是很满意 (Nodejs14,16
)
我们也可以自定义我们的一个运行时环境。
出于篇幅限制,想了解一些更加进阶的知识,可以看之前写的一篇文章
之前 Web 函数 没有出现的时候,我们往往使用 Event函数
+ Http proxy
来实现相同的效果,现在就有了更优的解决方案。
之前我们会在yml
文件里显式声明我们的组件,如:
component: django
component: egg
component: nextjs
component: express
component: flask
component: koa
component: laravel
component: nestjs
component: thinkphp
component: nuxtjs
...
# instead
component: scf
在 Web 函数的时代,所有提供 Web 服务的组件都被统一了!
迁移第一步就是把组件更换成 component: scf
它使用 tencent-scf 这个组件,这意味着所有的 配置项 也被统一了!
原先 nodejs
组件,我们需要暴露一个 sls.js
并在里面导出一个app
实例,Web函数
也不需要了,变为告诉它 我们的启动监听的入口文件。
同时配置文件也做了一些更改:
例如:
之前部署一个 koa
scf函数
+ api网关
app: appDemo
stage: dev
component: koa # 注意这一行
name: koaDemo
inputs:
region: ap-shanghai
runtime: Nodejs12.16
src:
src: ./
exclude:
- .env
functionConf:
name: ${name}
apigatewayConf:
protocols:
- http
- https
现在,同样的效果:
app: appDemo
stage: dev
component: scf # 注意这一行
name: koaDemo
inputs:
name: ${name}
region: ap-shanghai
runtime: Nodejs12.16
src:
src: ./
exclude:
- .env
type: web # 注意这一行
handler: scf_bootstrap # 注意这一行
events:
- apigw:
parameters:
protocols:
- http
- https
environment: release
endpoints:
- path: /
method: ANY
function:
type: web
可见 tencent-scf
组件和之前的组件的配置项,略有不同
它取消了 functionConf
的配置项,把它放入了 inputs
的第一级里。
原先我们的 apigatewayConf
配置项,现在也被转化成了 events
下的一个触发器。
# before:
apigatewayConf:
protocols:
- http
- https
# after:
events:
- apigw:
parameters:
protocols:
- http
- https
environment: release
endpoints:
- path: /
method: ANY
function:
type: web
当然配置项参数还是一致的。
总的来说,我们部署 web 应用的成本更低了。