专栏首页YINUXY【玩转腾讯云】使用 serverless 在腾讯云部署第一个函数
原创

【玩转腾讯云】使用 serverless 在腾讯云部署第一个函数

serverless 是各大云服务商提供出来的一种无服务的计算资源。为什么叫无服务呢,因为如果你使用 serverless,你只需要关注应用层,而无需关心底层基础设施,无需运维。简而言之,serverless 并不是真的无服务,而是关于有服务的不归你管,云服务商帮你搞定,比如 googleaws 或者 aliyun

关注点分离,好呀好,有了 serverless 以后只需要也只能关心业务了,这也不知是喜是忧。但你也无需过于担心,这是对已有并且成熟的开发模式的挑战,解决痛点有限,因此很多团队对于替换为 serverless 也动力不足。

但是我仍然建议你学习 serverless,毕竟各大云厂商对于 serverless 有很多免费额度可以让你薅羊毛,对于个人开发者利好。

serverless framework

serverless 是基于各大云服务商的产品,每一个云厂商对于 serverless 都有一套自己的 API。为了能够兼容这些 API,为了让你的代码 Write Once, Run Everywhere,于是 serverless framework 诞生了。

通常认为 serverless = faas + baas,然而 serverless framework 只兼容到了 faas,对于 baas,如各家提供的数据存储服务,要做到兼容还是很难。

快速开始

serverless framework 与腾讯云的函数计算来开始一个 hello, world

$ npm install -g serverless
$ mkdir hello

$ cd hello

$ serverless create --template tencent-nodejs --name hello

Serverless: Generating boilerplate...
_______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.67.0
-------'

Serverless: Successfully generated boilerplate for template: "tencent-nodejs"

此时在 hello 目录自动生成了关于 serverless 在腾讯云的 hello, world 版。由于缺少关于腾讯云的 plugin 需要首先装包

$ npm i

简述

serverless.yaml

serverless.yamlserverless framework 的核心,是一个 sls 服务的资源配置文件。如果把 sls 等同于 faas + baas,那么 faasbaas 的配置都在这里。

service: hello

# 云厂商的信息,如 aws/google/aliyun/tencent
provider:
  name: tencent
  runtime: Nodejs8.9    # Nodejs 版本号
  credentials: ~/credentials

plugins:
  - serverless-tencent-scf  # 腾讯云对 sls 的适配

functions:
  hello_world:          # 函数名
    handler: index.main_handler # 该函数所调用的函数

index.js

exports.main_handler = (event, context, callback) => {
  callback(null, 'Hello World');
};

index.js 中是 faas 中的核心,function。在 callback 中来回调你所需的数据。

部署

使用 sls deploy 打包资源并部署到腾讯云,此时需要你在腾讯云的凭证信息。你可以通过与腾讯云绑定的微信扫码授权,相比其他厂商需要手动维护凭证信息,还是很方便的。

# 其中 sls 是 serverless 的简写
$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading service package to cos[sls-cloudfunction-ap-guangzhou]. hello-dev-KamjFZ-2020-04-15-21-47-11.zip
Serverless: Uploaded package successful /Users/xiange/Documents/hello/.serverless/hello.zip
Serverless: Creating function hello-dev-hello_world
Serverless: Updating code...
Serverless: Updating configure...
Serverless: Created function hello-dev-hello_world
Serverless: Setting tags for function hello-dev-hello_world
Serverless: Creating trigger for function hello-dev-hello_world
Serverless: Deployed function hello-dev-hello_world successful
Serverless: Service Information

service: hello
stage: dev
region: ap-guangzhou
stack: hello-dev
resources: 1
functions:   hello_world: hello-dev-hello_world

# 如果需要部署到生产环境
$ sls deploy --stage  production

稍等一分钟,就可以看到部署成功的信息。

函数调用

本地函数可以很简单地通过调用函数名来执行,serverless 也可以通过 sls invoke 来调用函数。

$ sls invoke --function hello_world

Serverless:

"Hello World"

----------
Log:
START RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac
Event RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac

END RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac
Report RequestId: 69ffc57f-0afb-471b-865d-c7289e16f2ac Duration:64ms Memory:128MB MemUsage:21.8125MB

日志与监控

serverless 号称 noops,很大程度上是由于少了 logmetrics 的基础设施搭建。使用 sls logssls metrics 可以获取相关信息,但是丰富度及可定制化就完全不如 kubernetes 运维了。

$ sls logs
Serverless: {
  "FunctionName": "hello-dev-hello_world",
  "RetMsg": "\"Hello World\"",
  "RequestId": "fc72271f-eede-4dbb-8315-f24045597db7",
  "StartTime": "2020-04-15 21:48:55",
  "RetCode": 0,
  "InvokeFinished": 1,
  "Duration": 1,
  "BillDuration": 1,
  "MemUsage": 74870780,
  "Log": "START RequestId: fc72271f-eede-4dbb-8315-f24045597db7\nEvent RequestId: fc72271f-eede-4dbb-8315-f24045597db7\n2020-04-15T13:48:55.344Z\tfc72271f-eede-4dbb-8315-f24045597db7\t{}\n \nEND RequestId: fc72271f-eede-4dbb-8315-f24045597db7\nReport RequestId: fc72271f-eede-4dbb-8315-f24045597db7 Duration:1ms Memory:128MB MemUsage:71.402344MB",
  "Level": "",
  "Source": ""
}
Serverless: {
  "FunctionName": "hello-dev-hello_world",
  "RetMsg": "\"Hello World\"",
  "RequestId": "62b5760e-5545-4316-bef6-423d4b568396",
  "StartTime": "2020-04-15 21:48:45",
  "RetCode": 0,
  "InvokeFinished": 1,
  "Duration": 2,
  "BillDuration": 2,
  "MemUsage": 74870780,
  "Log": "START RequestId: 62b5760e-5545-4316-bef6-423d4b568396\nEvent RequestId: 62b5760e-5545-4316-bef6-423d4b568396\n2020-04-15T13:48:47.995Z\t62b5760e-5545-4316-bef6-423d4b568396\t{}\n \nEND RequestId: 62b5760e-5545-4316-bef6-423d4b568396\nReport RequestId: 62b5760e-5545-4316-bef6-423d4b568396 Duration:2ms Memory:128MB MemUsage:71.402344MB",
  "Level": "",
  "Source": ""
}

$ sls metrics
Serverless: Service wide metrics
2020-04-14 22:09:45 - 2020-04-15 22:09:45

Service:
  Invocations: 5
  Outflows: 0
  Errors: 0
  Duration(avg.): 7.3 ms

Functions:
  hello-dev-hello_world:
    Invocations: 5
    Outflows: 0
    Errors: 0
    Duration(avg.): 7.3 ms

下一步

从本篇文章,可以大概知道如何在腾讯云初建一个 serverless 函数,并且知道了如何执行并且调用它,但好像仅仅如此。在日常的技术讨论中,它往往与业务开发结合在一起,在接下来的篇章中,我将介绍

  1. 如何使用 serverless 部署前端应用,如 react/vue
  2. 如何使用 serverless 部署 API Server,如 koapythongo
  3. 如何使用 serverless 跑定时任务及爬虫

原理

以上都是基于 sls 的应用,而关于 sls 的原理,如服务编排以及容器化,可以在极客时间继续深入。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

相关文章

  • SQL学习日记(一)

    1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 3、SQL:结构化查询语言,用于和D...

    YINUXY
  • Docker常用命令

    YINUXY
  • SQL学习日记(二)

    例如:按照 department_id 查询 employees(员工表)和 departments(部门表)的信息。

    YINUXY
  • ESP8266刷AT固件与nodemcu固件NodeMCU初探

    这回是使用的这一款 ? ? ? 因为这款默认的是支持AT指令的固件,,所以我们就刷nodemcu的 先看接线 ? GPIO0 默认是工作模式(不接线)。如果接了...

    杨奉武
  • FAIR 这五年!

    作者:Yann Lecun、Jerome Pesenti、Mike Schroepfer

    机器之心
  • 珍惜数据,远离钓鱼

    再选择8,输入网址 然后二维码已经生成,保存在/root/.set/reports/

    宸寰客
  • 使用python实现数组、链表、队列、栈

      数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。

    不会飞的小鸟
  • 了解App测试—App自动化测试与框架实战(1)

      传统软件都部署和安装在计算机(台式机和笔记本电脑)上,而App的载体是手机等智能移动终端,因此我们可以将手机这个概念扩充为"智能移动终端"或者"智能终端"。

    小老鼠
  • Python3 系列之 面向对象篇

    封装、继承和多态是面向对象中的重要思想,对于 Python 这种高级语言,虽然很多地方从语法上可以不用面向对象的思想,但是对于项目构建来说,面向对象是基本要求,...

    py3study
  • 过时但仍值得学习的选项卡TabHost

    今天来了解一个过时的组件,了解的目的不是学会用起来开发,而是了解这种界面的设计和其特点,后期可以用其他方式来替代。 一、TabHost概述 T...

    分享达人秀

扫码关注云+社区

领取腾讯云代金券