You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
前言
Serverless Devs 一直在以开源代码、开放生态的模式进行建设,所以在社区用户参与 Serverless Devs 的建设过程中,就会有两条途径:
在本文中包括几个部分:
Serverless Devs Package介绍
在说什么是Serverless Devs Packages之前,需要先说一下Serverless Registry,相信很多研发同学都是知道,不同语言/生态都有自己的包管理平台,例如Python语言的Pypi,Node.js的NPM,而所谓的包管理平台,粗暴来说就是管理“包”的,这里的“包”,往往指的是别人已经封装了的某些功能或者能力,我们可以直接使用,而无需我们重复造轮子。
说两个比较形象的例子,如果是搞人工智能,我们不太现实要手动的来写各种算法,往往会通过Sklearn,Tensorflow等对应的包来快速的加载某些模型,然后在这个基础上再进步的开发和完善
而在Serverless领域,我们也希望有一个类似的包管理平台,那就是Serverless Registry:
s.yaml
中直接引用与Python的Pypi,Node.js的NPM不同的是,在Serverless Regsitry中,Package是分成两类的,一类是Component,一类是Application。
针对 Component 和 Application 的通俗来作区分:
在Serverless Devs的规范中,有关于二者的一个区别图:
而关于 Component 和 Application 的关系是:Application是一个应用案例的定义,需要通过Component进行部署上线。
或许上面的表示有些许的抽象,其实可以用一个形象的案例进行解释。例如:
关于更多的 Serverless Registry 和 Serverless Package 的说法,其实可以参考 Serverless Devs 的相关模型规范:
开发 Package
开发者开发Serverless Package的流程相对来说是比较简单的。因为在Serverless Devs开发者工具中,已经提供了相对完整的脚手架能力。开发者只需要执行
s init
,并且选择Dev Template for Serverless Devs
即可:选择完成,不难发现,此时会让我们继续选择是开发Component还是开发Application:
开发 Component
当选择
Component Scaffolding
之后,需要给即将开发的Component起一个名字(例如deployfunction
):此时,可以根据体统提示,进入到Component的项目目录:
此时,可以通过IDE打开当前项目,并通过
npm
进行依赖安装(因为Serverless Devs是基于Typescript的项目,所以组件的开发仅支持Typescript和Node.js语言):此时,可以打开项目中
src/index.ts
文件,不难发现已经存在一个案例:在该文件中,我们不难发现存在一个
test(inputs)
方法,该方法是一个打印inputs
参数,并返回hello world
的案例,但是通过这个简单的案例,我们可以了解到几个事情:公共方法就是用户可以使用的命令
在项目中,我们可以写多个方法对外暴露,目前只有一个
test
,但是我们可以增加任何public
方法,而这些方法将会成为该组件的命令。例如:此时,我们在使用该组件时,组件就具备了两个命令:test命令和deploy命令,为了验证我们的想法,我们可以对项目进行基础的开发态的编译:
npm run watch
:此时,我们可以找到example目录,进行deploy方法的测试,例如:
通过example下面的s.yaml文件,我们不难看出,这个yaml有两个service(分别是component-test和component-test2),并且这两个service,都用了我们同一个组件(我们正在编辑的组件),所以,在执行
s deploy
之后获得到预期的结果:即执行了deploy方法。同样的,我们也可以执行test命令看一下效果:要实现的逻辑可以在方法内自由实现
换句话来说,Serverless Devs工具在加载组件的时候,实际上就是将对应的参数,传递到指定的方法,并且执行该方法。所以,你要实现什么功能都可以写在对应的方法里。以Serverless Registry Component项目为例,我在该项目中,存在一个Login的功能,所以我在Login中实现了以下内容:
在该方法中主要存在几个事情:
inputs
参数解析,获取用户输入的参数内容;-h
或者--help
参数,则输出对应的帮助信息;--token
,则将--token
对应的值存入到某个文件中;--token
输入,则直接打开浏览器,访问Serverless Registry的登陆地址,并进行相关登陆token
的获取;那么同样的方法,如果是一个部署函数的方法或者命令,我们是不是可以在这个里面实现打包压缩代码,然后调用相关创建函数,更新函数的接口进行函数的创建呢?再比如,想要做一个删除函数的方法,是不是可以在里面调用删除函数的接口呢?
所以可以认为,无论想要实现什么功能,都可以在对应的方法中实现。
关于开发过程中的一些规范
在上面我们说到,Serverless Devs会带着某些参数调用该方法,那么参数是什么样子的?格式如何,我们该如何解析呢?
再比如,项目最后的return有什么用处?如何在项目中获取用户的密钥信息?用户在Yaml中写的各种参数如何获取?用户在执行命令时候传递的参数如何获取?
其实这些都可以参考: Serverless Devs Package的开发规范文档的组件模型代码规范,在这里我们不难发现:
入参inputs的结构为:
其中,这些参数的含义:
一个更为具体的例子是,在上面的案例代码中,有一个test方法,该方法就是功能实现的方法。此时当用户使用test命令时,系统就会携带参数调用该方法。以一个真实案例作为举例说明:
该组件名为
hexo
,组件核心代码如上所示,具备一个test方法,此时用户侧的Yaml为:当用户执行
s test mytest -a -b abc
,此时,组件代码中的test
方法,收到的inputs
参数实际上是:此时test方法会打印日志信息等,并返回最终的结果给命令行工具:
{ "hello": "world" }
而关于如何返回帮助文件,如何获取密钥信息,如何解析用户的输入内容,则可以参考Serverless Devs提供的core包:
在该工具包中,我们可以看到诸多的方法助力我们快速的使用:
例如,获取用户使用密钥,就可以直接引入core包,使用对应的
getCredential
方法即可:default
密钥信息最后还需要进行组件的描述
在完成我们的组件功能编写之后,就可以进行组件的描述,所谓的组件的描述,就是要告诉Serverless Registry,这是一个什么组件,有哪些功能。描述内容在
publish.yaml
中:关于该文件的内容以及部分参数的取值,可以参考组件模型元数据
当然,除了publish.yaml之外,在Serverless Package的规范中,目录哪还有其他的文件:
其中:
开发 Application
当选择
Application Scaffolding
之后,需要给即将开发的Application起一个名字(例如helloworld
):Serverless Package中的Application开发相对更为简单,无论是任何编程语言,无论是任何项目,只要可以通过Serverless Devs开发者工具进行部署,就可以把它包装成为一个应用。
或者更为准确的来表述,只要你现在有一个可以通过Serverless Devs直接部署的项目,那么你就可以:
这一部分具体情况,可以参考应用模型文档
发布 Package
在完成 Serverless Package的开发之后,为了给更多人使用,还可以将发布到Registry中。
发布到 Github/Gitee
关于发布到Github或者Gitee中,方法很简单:
此时,在客户端,用户就可以通过
s set registry
进行registry
的切换,来使用相对应的功能了。例如,我在Github的账户为anycodes,我就可以创建一个仓库,名字为demo,此时,我将我的组件/应用上传到这个仓库中,然后发布一个Release。
此时,我在客户端,将registry切换到Github,然后就可以:
发布到 Serverless Registry
若想把Package发布到Serverless Registry,可以考虑使用Serverless Registry Component。
在完成组件或者应用的开发流程之后,需要:
s cli registry login
s cli registry publish
当然,Serverless Registry Component这个项目,除了登陆和发布之外,还有诸多其他的功能,例如:
总结
众所周知,一个完整的技术架构的发展,离不开生态社区对他的赋能,无论是Docker的Dockerhub还是Python的Pypi,再或者是Node.js的NPM,生态的活跃度和我们开发者的幸福感是正相关的,我们也非常希望Serverless Devs可以通过Serverless Regsitry这样一个开放的生态,和更多的人一同玩转Serverless架构,也期待更多优秀的Package,被更为广泛的应用。
Beta Was this translation helpful? Give feedback.
All reactions