X.d 笔记

小Web,大世界

0%

ServerLess 实践日志2:基础

说明1:正在 TX云 上实践 Serverless, 在此做点记录,使用到的技术,名词都是TX云的,可能各厂都差不多。
说明2:不管是什么云,目前性能最好的是 NodeJS,除NodeJS外,其它语言仅推荐Python。

微服务

谈 ServerLess 之前,先了解一下微服务。

本文并不会对微服务详细解释,现在是2022年,微服务可以算一种常识了,几十年前的一体化项目构造,现在只能算玩具。时间一长,加功能改需求经常会遇到束手束脚,一个看似非常简单的修改都会让人抓狂。

一个项目如果想要搞成微服务,可能需要好几个后端开发及好几个服务运维人员,再花上很多钱买主机,建集群,部署K8S一系列的功能,如服务发现、网关、监控、日志、消息、CI 等等等等。再由开发人员编写业务代码,发布完成,只要规划的好,部署后面的每个环节都可以轻松愉快。

总之,需要很多成本。但是我相信,如果能把微服务用好,这此成本非常值!

能不能既享受微服务的诸多好处,又不用花这么多钱,这么多人力呢? Serverless !

ServerLess

Serverless 就是当你没有技术能力或运维能力去自建一套微服务系统时,云厂商帮你搞定了这个系统,大部分微服务里面用到的特性基本上在Serverless里面都能享受到,这一切都是厂商自研的成熟平台完成,可能用起来比自己搭的用起来都爽。

当然,如果只是单体项目,没有那么多服务,照样可以用 ServerLess ,比什么云主机,清量什么都要都舒适。

例如我这个博客: 没用 Serverless 前,编辑好了文章要发,需要手动执行的操作:

  1. git push
  2. ssh 连接到服务器
  3. git pull & hexo
  4. 登录到 TX 云
  5. 进入 CDN 域名,刷新预热
  6. 输入地址,刷新

用了 Serverless 后, 就一个命令 sls deploy 搞定(需要 COS )。

废话说完,今天介绍几个基础概览(再次说明:TX云术语):

CLI 命令行
SCF 云函数
    - 函数代码
    - 触发器
    - 层
    - 应用
API 网关

CLI 命令行

cn.serverless.com

不得不说, TX抢到了个好名字 : https://cn.serverless.com/ ,我用Node, 所以支接安装了 , 非 Node 子可以下载二进制包安装。

npm install -g serverless

安装成功后,可以使用 slsserverless 全局CLI,最好在函数所在目录运行,会自动检测当前目录下的 serverless.yml 文件。

## 非常常用的命令
sls deploy  # 部署应用到云端 
sls info  # 获取应用详情
sls logs # 查看应用云端日志 , 可指定时间或实时
sls remove  # 删除应用

## 不怎么常用的命令
sls init # 创建 ,通过模板创建新应用
sls dev # 远程开发模式,用于快速看远程环境的效果,减少 deploy 次数
sls credentials # 全局身份授权
sls registry # 组件注册中心,用于存模块,基于模板初始化应用使用。
sls invoke # 调用指定的函数,很常用的功能,但一般很少通过命令行去调。

SCF 云函数

云函数会提供代码的运行环境,经过厂商优化后,启动速度特别快,以致于几乎感觉不到,感觉上认为自己的应用像常驻的一样。

当然了,不同的语言效果不同,目前 NodeJS 最快 ,Php / Java 比较慢。

函数代码

创建函数后,在 函数管理 -> 函数代码 里面,有一个像 VS Code 的编辑器,可以在线编辑函数代码。

个人并不习惯,还是喜欢本地开发,但这个编辑器在调试时还是很有用的,必竟带一个云端环境的终端。

本地写好函数后,可以通过 sls deploy 命令一键把函数代码从本地部署到云端,而且会自动部署到这个函数的 $LASTET 版本。

部署日志 里面,可以看到部署的情况。

触发器

触发管理 管理里面,可以看到函数的触发方式:大概有以下几类。

  1. 定时出发 : Crontab
  2. API网关 触发
  3. COS 对象存储 触发
  4. CMQ / Kafka 等消息触发
  5. CLS 日志触发
  6. MPS/CLB 等服务触发
  7. API函数调用 手动触发(不需要配置)

根据业务不同,这个触发方式可以很灵活的配置。Web 函数通用用 API网关触发即可。

其实 Serverless 本来并非给 Web 应用使用,而是给一些大型应用做任务编排的,这样更符合 用时创建,用后即毁 的观念 ,而 Web 应用一般都会常驻,并不太符合 Serverless 的理念,一般有个一段时间不访问就销毁的机制,做到按量。

在 Node 界有个笑话,关于 node_modules 的:

node_modules

笑话归笑话,但不管是什么语言,写应用肯定是有不少依赖的,如果每次 deploy 都要同时上传代码和依赖,就有些浪费时间和空间了。

云函数的 层管理 功能,就是用来放依赖的。操作如下:

  1. 本地安装一下依赖 npm install --production 通过 --production 可以过滤掉 devDependencies 里面的依赖。
  2. 压缩 node_modules 目录的文件为 zip 格式,如 node_modules.zip ,目前不能超过50M
  3. - 新建 , 写名字描述后,上传zip , 环境选 Nodejs
  4. 函数服务 - 点函数进入 - 函数管理 - 层管理 - 绑定 选择刚才的层
  5. 编辑代码 serverless.yml 配置 src 过滤:
src:
    src: "./"
    exclude:
      - node_modules

应用

应用是腾讯云里面的一个概念,可以将多个函数组合成一个应用,以便于管理。

一个应用关系到的也可能不只是函数,还包括很多资源,如COS,云硬盘,媒体服务等等,如果包装成一个应用,注销的时候会自动关联注销使用到的资源,不用一个一个去释放,比较方便。

其它

其它还有很多,比如版本/别名的功能后面会专门说到。

Serverless 和普通开发有一点点区别,今天说两点:

  1. 没有硬盘! Serverless 自动分配了一个 /tmp 的临时区域,没有持久功能,重启就会丢,所以如果是文件服务,可以考虑挂载云硬盘或对象存储。
  2. Web函数端口号固定是 9000
  3. 系统的一些功能受限

API 网关

Web 函数会自动创建一个可以访问到的N级域名,也可以升级成API网关。

目前腾讯云里面的这个API网关的功能,几乎可以秒杀任何微服务系统的网关。除了强大的路由服务,还提供了一系列的系统插件,而且支持自定义插件!

最简单的方法,就是创建一个网关后, 在 管理API 新建 选择刚才的函数,发布,就可以了。创建好后,可以配置到 serverless.yml 里面

events:
- apigw:
    parameters:
      endpoints:
        - apiId: api-xxxx
          enableCORS: false
          function:
            functionQualifier: $LATEST
            isIntegratedResponse: false
          isBase64Encoded: false
          method: ANY
          path: /
          serviceTimeout: 15
      environment: test
      protocols:
        - http
      serviceId: serviceId
      serviceName: xxx

这段可以去函数代码里面,右键-》生成 Serverless.yml 里面 Copy 出来

小结

今天只是一个小的介绍,Serverless 太灵活,每个人使用习惯,使用目的也不一样,真使用起来也会有很大的区别,还是需要根据情况自行斟酌。

即便如此,对于小企业或个人来说,也是优于自己整一套微服务来的划算的。