无服务器 Kotlin with OpenFaaS

无服务器 Kotlin on OpenFaaS

通过本文,我的目标是通过向您介绍最酷的无服务器平台之一来演示无服务器Kotlin的外观: OpenFaaS 。 OpenFaaS是一个社区拥有的开源项目,您可以使用它在任何公共或私有云上运行功能和微服务。您可以在OpenFaaS上运行Docker映像,该映像将为您运行和扩展。因此,您可以自由选择任何编程语言,只要可以将其打包到Docker映像中即可。在本文中,我们希望了解无服务器和功能即服务(FaaS)背后的概念,以及如何将无服务器Kotlin功能部署到OpenFaaS。

无服务器 and 服务功能

无服务器 Computing

无服务器 Computing,我们描述了一种云模型,在这种模型中,开发人员不必解决服务器管理和基础架构的决策,而由云提供商自己来照顾。期限"Serverless"描述了一个事实,我们不必太在乎基础架构的设置,扩展和维护,而我们可以专注于开发可以轻松部署到生产中的代码。无服务器的机会似乎是无止境的,由Cloud Native Computing Foundation(CNCF)发布的景观图也是如此,您可以找到它 这里 .

无服务器景观

无服务器 architecture is said to be the next big thing and somewhat the advancement of microservices: Monolith -> Microservices -> Serverless architecture

服务功能

最重要的无服务器产品之一就是所谓的 计算运行时 ,也称为功能即服务(FaaS)平台。许多供应商提供了这些平台,其中最著名的是AWS Lambda,Google Cloud Functions和Microsoft Azure Functions。也有开源替代品,例如 Apache OpenWhisk 或者 甲骨文的Fn项目。存在更多工具和平台,它们也是上面显示的景观图的一部分。
FaaS的基本思想是提供一个平台,该平台可用于执行某些事件触发的代码。可以在不维护基础结构的情况下部署代码,而只需将功能上载到云即可部署代码,这将负责执行和扩展功能。"Functions"就FaaS而言,它们是相当小的单位,通常应该是无状态的,因此可以轻松地水平缩放。 FaaS平台不仅会在代码负载沉重的情况下扩展您的代码,而且还会在一段时间内未多次调用该函数时照顾删除实例。对于初学者来说,这项技术有助于优化成本,但也需要了解 冷启动 情况。无服务器整体具有相关的积极特征,应该成为我们讨论可靠体系结构替代方案的一部分。如果您想了解更多有关概念以及无服务器体系结构的内容,我建议您观看 "无服务器:软件架构的未来" 彼得·巴尔斯基(Peter Sbarski)。需要明确的是,我个人不认为您无论如何都应该转向无服务器,而是将其视为可以解决部分问题的有效概念。

OpenFaaS -容器作为功能

OpenFaaS ,如其网站上所述,"使转弯变得简单 任何事物 通过Docker Swarm或Kubernetes进入可在Linux或Windows上运行的无服务器功能"。他们保证它可以让我们运行 任何规模,任何地方的任何代码。您可以将OpenFaaS描述为"容器功能"平台,因为其抽象功能的形式是Docker映像。该特性是一个出色的特性,因为它允许我们将任何代码打包到Docker映像中,并且OpenFaaS运行它,对其进行缩放并为我们提供指标。老实说,值得一提的是,需要将特定工具添加到您的容器中,这称为 功能看门狗,一个微型Golang HTTP服务器,可将您的功能与外界联系起来。 OpenFaaS本身可以在例如Kubernetes上运行,或者Docker Swarm是MIT许可下的开源软件,并且使用Go编写。您可以找到GitHub项目 这里 .

没有供应商锁定

OpenFaaS 依赖于用于打包代码的Docker映像,该工具本身可在Kubernetes等平台上运行。社区已经采用了所有这些技术,并且知道如何使用它们。因此,您可以将OpenFaaS实例在任何公共或私有云之间来回移动而不会出现问题。 OpenFaaS不会使您依赖特定的供应商,这与依赖AWS Lambda之类的技术时所得到的相反。依赖于特定供应商的事实称为 供应商锁定 .

其他类似项目

将独立容器部署到计算引擎的想法可以在其他几个项目中找到。您可以找到多个类似工具的比较 这里 .

无服务器 Kotlin deployed on OpenFaaS

现在,我们已经了解了Serverless,FaaS和OpenFaaS背后的一般思想,我们希望通过设置OpenFaaS Kubernetes集群并学习如何向其部署功能来使自己更加肮脏。

使用Kubernetes的OpenFaaS部署

以下基于官方 指导 。阅读以获取更多信息并了解替代方法。

第一步,您需要确保设置了Kubernetes集群。如果您想在本地机器上运行Kubernetes,各种工具可以帮助您设置集群(例如 k3s 或者 迷你库 )。在Mac和Windows上,您还可以使用Docker的桌面版在本地运行Kubernetes集群。
设置Kubernetes之后,我们可以开始将OpenFaaS部署到集群。使用起来非常简单 k3sup

# Install k3sup
curl -sLS //get.k3sup.dev | sh
sudo install k3sup /usr/local/bin/ # <- this step might not be necessary
chmod +x k3sup
# applies openfaas namespaces, create user, applies helm chart
k3sup app install openfaas

之后,检查您的群集,您会发现几个正在运行的OpenFaaS Pod。

您应该能够通过以下方式查看网关用户界面 http://127.0.0.1:31112/ui/ 使用k3sup生成的凭据登录。您可以通过kubectl获取密码:

PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)

To allow faas-cli (needs to be installed) to access your newly deployed services, make sure to
1) set OPENFAAS_URL via export OPENFAAS_URL=http://127.0.0.1:31112
2)通过登录 faas-cli login --password {YOUR_PASSWORD_HERE}

以下脚本将自动登录:

PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
echo -n $PASSWORD | faas-cli login --username admin --password-stdin

就是这样-我们都准备就绪,可以开始部署无服务器功能。🎉

创建和部署OpenFaaS功能

OpenFaaS 提供了用于将功能部署到平台的不同方法和界面。我们可能会使用CLI,网关UI或提供的REST API,这些文档通过 这个Swagger Yaml.

范本

The most straightforward way for getting started is via OpenFaaS' template engine. With the faas-cli, we can create new functions based on available templates existing for various programming languages and tools. To get a list of all existing templates, you should run faas-cli template pull first. Running faas-cli new --list now, you should see a list of templates similar to the following:

csharp csharp-armhf dockerfile dockerfile-armhf go go-armhf java12 java8 node node-arm64 node-armhf node12 php7 python python-armhf python3 python3-armhf ruby

可通过OpenFaaS获得更多模板 店铺 , which you can examine by running faas-cli template store list. Neither of both sources currently contains a Kotlin template, which I would love to change. Therefore, a 改变请求 正在等待反馈,并希望将一些官方Kotlin添加到OpenFaaS中。
On the bright side, it is quite easy to add my Kotlin templates to the cli by executing faas-cli template pull //github.com/s1monw1/openfaas-kotlin. You should find two additional Kotlin variants now via faas-cli new --list. Let's create a classic Kotlin function using the kotlin template:

faas-cli new hello-readers --lang=kotlin
# function can be found in ./hello-readers

按照惯例,OpenFaaS仅向用户公开每个模板的特定部分。如果您想进一步研究,请查看 Kotlin模板 and see how it is structured. The function is the one we have to deal with after running the faas-cli new command mentioned above.

修改模板

In the newly generated function hello-readers, we can find a source file Handler.kt, which is the spot where we can implement the HTTP handling for our function. It's a simple request-response mapper, and to demo it, we simply change the default body to "您好kotlinexpertise读者".

class Handler : IHandler {
    override fun handle(request: IRequest): IResponse {
        return Response(body = "您好kotlinexpertise读者")
    }
}

构建和部署

建立功能

Next to the hello-readers folder, OpenFaaS should have generated a YAML file called hello-readers.yml. It contains the information the cli needs to build and deploy our function. You can learn more about the relevant YAML structure and how you may want to modify it 这里 。让我们来构建它。

# by default, OpenFaaS looks for a stack.yml file which can be adjusted using the -f flag
faas-cli build -f hello-readers.yml 

OpenFaaS now runs the Dockerfile contained in the template (not visible to the user) to build the image which we can then deploy. There's also a faas-cli up command available that wraps the build, push and deploy commands for our convenience. Either way, whether you use faas-cli up 或者 faas-cli deploy, the result looks similar to the following output.

成功部署

> faas-cli deploy -f hello-readers.yml
Deploying: hello-readers.
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.

Deployed. 202 Accepted.
URL: http://127.0.0.1:31112/function/hello-readers

单击该URL将显示我们先前配置的消息:"您好kotlinexpertise读者"。您还可以通过网关UI检查已部署的功能。

为什么我要使用Kotlin开发无服务器?

在上一节中,我们看到我们可以从多种编程语言中进行选择,以为OpenFaaS编写无服务器功能。哪种语言最适合您并且最有意义,取决于用例和您要实现的目标。常见的无服务器语言是例如Node,Python和Go,但是您还会发现C#,Java以及更多正在使用的语言。
公司中有限的编程语言集可能会导致更好的内部工具,也减轻了由于语言障碍而无法轻松切换团队的问题。我不喜欢用不同的语言编写成百上千的服务,这在某些时候会成为问题。大多数大型科技公司都会限制其语言产品组合,并且仅在情况需要时才添加新的语言组合。
我个人已经使用Kotlin已有近四年了,很显然,我还将使用它来探索无服务器领域。我们在 布赖特 不久前就开始使用Kotlin Serverless功能,并且到目前为止效果很好。我们大多数的后端服务都运行Kotlin,这是我们经验最丰富的语言。不过,我们知道,出于性能原因,可能有必要添加更多语言。 JVM的占用空间不可忽略,并且可能会影响本地和本地的性能,例如,在冷启动时。稍微调整一下,Graal VM可能是一个不错的选择。
在上一篇文章中,我写了关于 服务器即功能工具箱http4k,这是一个出色的库,可在Kotlin中启用无服务器功能。 Http4k支持我们在bryter上使用的功能,我还提出了一个相应的建议 模板 适用于OpenFaaS商店。

无服务器 tooling for Kotlin

一个相当新的框架,名为 t (Kotlin Serverless)目前由Jetbrains开发,目的是使将Kotlin应用程序轻松转换为可立即部署的功能,甚至处理当前仅适用于AWS Lambda的部署。该框架具有一些非常有趣的功能,我很期待看到kotless的发展方向。

摘要和监视

无服务器方法和相关的体系结构含义是相关的,在考虑采用现代软件体系结构的方法时应注意一些事项。作为无服务器相关主题的服务即功能已经存在了一段时间。亚马逊,谷歌和微软等大型云计算提供商提供了最杰出的工具。不过,我们还可以选择选择更多独立的平台来规避供应商锁定,例如我在本文中向您介绍的平台:OpenFaaS。我们看到,设置OpenFaaS并不是火箭科学,它可以在您的本地计算机上运行,​​这是入门的绝佳方法。您可以从大量的编程语言中进行选择,只需要确保您的代码可以打包为Docker映像即可将其部署到OpenFaaS。模板可以帮助快速设置功能,并且在必要时编写自己的功能模板也不太困难。我已经展示了Kotlin模板的示例,以及所产生的HTTP处理程序(表示函数)的外观。除了其他功能外,Kotlin是一个有效的替代方案,您应根据具体情况决定哪种编程语言最适合您的功能需求。正如我所提到的,我已经使用了一段时间的展示技术,目前正在研究一个真实的用例,以利用这些东西来建立一个动态的,高度可扩展的和可扩展的平台,我将在以后的文章中进一步讨论。文章。

2 thoughts on “无服务器 Kotlin with OpenFaaS

  • ken

    仅供参考,如果您确实要使用类似graalvm的工具’除非您拥有自己的服务器,否则请将任何JVM语言用于无服务器。它’成本是脚本语言成本的4倍,否则,请执行Go’t由于JVM启动时间…
    我在去年的Kotlin服务器框架KotlinConf会话中提到了这一点….

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *