将应用程序分解为由AWS Lambda、谷歌函数和Azure函数推广的小工作单元的概念是现代软件体系架构中最流行的趋势之一。Serverless的主要好处是,您不必管理底层应用程序基础架构,开发人员可以集中精力在交付业务价值方面。

虽然Serverless的开发人员工作流可能非常有吸引力,但是有一些原因说明这种方法可能不适合您的组织:

  1. 您有不允许在共享环境中运行的监管或公司限制。
  2. 您已经为现有的微服务提供了一个调度器集群和CI/CD工作流。
  3. Serverless仍然需要提供和部署函数、数据存储和消息队列等连接器的操作开销。
  4. 您希望对操作系统和运行时平台有更多的控制。

OpenFaaS(或FaaS)是一个框架,用于构建没有服务器的函数,但是使用了容器。有了OpenFaaS,您可以将任何进程或容器作为Linux或Windows的无服务器函数进行打包—只需使用Nomad集群即可。这个项目通过它的UI和CLI来关注易用性,这两个UI和CLI可以用于测试和监视函数,同Prometheus配合提供了自动缩放功能。

架构

OpenFaaS围绕Docker进行构建;所有功能都打包到Docker镜像中,这是微服务常用的工作流。由gateway、provider和monitoring element这三个核心组件组成。

Gateway是允许管理和执行函数的外部API。它不直接与Nomad交互,而是将此责任委托给一个管理函数生命周期的Provider:部署、扩展和认证管理。Gateway和Provider都发出调用计数和计时数据等指标(metrics),这些数据是使用Prometheus收集的。

Prometheus还能够根据存储的指标来广播警报。该功能允许Gateway侦听警报并对其作出反应。一个典型的例子是根据负载或其他因素自动触发函数缩放。

让我们看看在Nomad上使用OpenFaaS创建和部署函数是多么容易。

在Nomad上运行OpenFaaS

要在Nomad集群上运行OpenFaaS,可以使用Nomad提供者Github存储库中的示例作业文件: https://raw.githubusercontent.com/hashicorp/faas-nomad/master/nomad_job_files/faas.hcl

$ wget https://raw.githubusercontent.com/hashicorp/faas-nomad/master/nomad_job_files/faas.hcl faas.hcl
$ nomad run faas.hcl

或者为什么不从这篇文章开始启动交互式终端呢,交互式终端已经预先安装了Nomad、Consul和OpenFaaS。

启动交互式演示

创建一个新函数

要创建一个新函数,我们可以利用OpenFaaS CLI faas-cli,这对于大多数平台(如Windows、Linux和MacOS)都是可用的。它还支持许多编程语言,如Node、Python和Go。

Languages available as templates:
- csharp
- go
- go-armhf
- node
- node-arm64
- node-armhf
- python
- python-armhf
- python3
- ruby

除了官方模板之外,您还可以使用社区提交的模板。我们将使用绑定的Go模板并创建一个名为bcrypt的函数。

$ faas-cli new -lang go bcrypt
Folder: bcrypt created.___                   _____           ____/ _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |\___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/|_|Function created in folder: bcrypt
Stack file written: bcrypt.yml

新命令为bcrypt/handler.go函数和当前文件夹里的函数定义文件 bcrypt.yml创建了入口点。

$ tree -L 2
.
├── bcrypt
│   └── handler.go
├── bcrypt.yml
└── template├── csharp├── go├── go-armhf├── node├── node-arm64├── node-armhf├── python├── python-armhf├── python3└── ruby

看看handler.go中包含了我们的示例函数代码,我们可以看到它只包含一个带有简单接口的函数。参数以字节码的形式传给函数,输出是一个简单的字符串。

package functionimport ("fmt"
)// Handle a serverless request
func Handle(req []byte) string {return fmt.Sprintf("Hello, Go. You said: %s", string(req))
}

让我们将这个函数替换为允许使用bcrypt对字符串进行哈希的东西。编辑文件bcrypt/handler.go并用以下函数替换内容:

$ vim bcrypt/handler.go
package functionimport ("golang.org/x/crypto/bcrypt"
)// Handle a serverless request
func Handle(req []byte) string {hash, err := bcrypt.GenerateFromPassword(req, bcrypt.DefaultCost)if err != nil {return ""}return string(hash)
}

一旦你保存了你的文件,让我们运行gofmt命令来检查有没有语法错误:

gofmt -s -w bcrypt/handler.go

我们使用的是位于golang实验包的bcrypt库,因此我们需要向vendor提供依赖项,我们可以使用dep这个go的依赖管理工具来做到这一点。

$ cd bcrypt
$ dep initUsing master as constraint for direct dep golang.org/x/cryptoLocking in master (b3c9a1d) for direct dep golang.org/x/crypto
$ cd -

下一步是构建我们的函数,并将其部署到Nomad,在此之前,我们需要编辑bcrypt.yml文件,更改image字段来设置一个Docker仓库。

provider:name: faasgateway: https://my.gateway.comfunctions:bcrypt:lang: gohandler: ./bcryptimage: my.docker.registry.com/bcrypt

我们还更改了gateway字段并指向Nomad集群上运行的网关。

如果使用交互式终端,那么环境变量FAAS_GATEWAYDOCKER_REGISTRY将包含要添加到bcrypt.yml文件中的正确值。

$ sed -i "s#^\(\s*image\s*:\s*\).*#\1${DOCKER_REGISTRY}/bcrypt#" bcrypt.yml
$ sed -i "s#^\(\s*gateway\s*:\s*\).*#\1${FAAS_GATEWAY}#" bcrypt.yml

现在我们来构建我们的函数:

$ faas-cli build --yaml bcrypt.yml
[0] > Building: bcrypt.
Clearing temporary build folder: ./build/bcrypt/
#...
Removing intermediate container a5e0be2bfdc9
Successfully built 74cbd7f5e103
Successfully tagged bcrypt:latest
Image: bcrypt built.
[0] < Builder done.

构建过程在Docker容器中执行,而不是Docker,并且faas-cli中不需要任何其他依赖项。在部署函数前需要将函数推到Docker仓库,我们可以使用faas-cli push命令来完成此任务。

$ faas-cli push --yaml bcrypt.yml
[0] > Pushing: bcrypt.
The push refers to a repository [2886795314-5000-ollie01.environments.katacoda.com/bcrypt]
974e4f38d961: Layer already exists
8af4da1e470e: Layer already exists
f6a874b4e2c7: Layer already exists
ec8a829eb761: Layer already exists
60273f4e6fd4: Pushed
2aebd096e0e2: Layer already exists
latest: digest: sha256:b253f51abbcc53b69c84eed015cc244871de6049e4410200230c2612408a4075 size: 1574
[0] < Pushing done.

现在将该函数部署到Nomad集群上的OpenFaaS。

$ faas-cli deploy --yaml bcrypt.yml
Deploying: bcrypt.
Removing old function.
Deployed.
URL: https://2886795314-8080-ollie01.environments.katacoda.com/function/bcrypt200 OK

当我们部署一个函数时,OpenFaaS网关将委托给在集群上创建作业的Nomad provider。您可以使用nomad status命令检查函数是否正在运行。

$ nomad status
ID               Type     Priority  Status   Submit Date
OpenFaaS-bcrypt  service  1         running  01/10/18 17:37:16 UTC
faas-nomadd      system   50        running  01/10/18 17:14:08 UTC

为了测试我们的函数,我们可以使用faas-cli,或者使用它的HTTP接口调用函数。首先,让我们使用faas-cli命令:

$ echo "password" | faas-cli invoke --yaml bcrypt.yml bcrypt
$2a$10$zFYttFRKZorR3zHsoquQ5.qypL0/4vTbzjzM2bWdzOBtMq8XhXSZG

我们还可以使用curl或使用网关URL的其他HTTP客户端调用它:

$ curl -d 'Nic' $FAAS_GATEWAY/function/bcrypt
$2a$10$FddcGwse0z0PlX6o3tr.SuGgUK9poanZLvqdGHAjz.L9Jp.J5qGI6

这就是创建和部署最基本的函数所需的全部内容,以查看更全面的示例,包括如何使用测试驱动的方法创建函数,为什么不查看我的发送tweet的示例:https://github.com/nicholasjackson/openfaas -functions/tree/master/tweet​​​​​​​

总结

我们希望你喜欢这篇文章,我们期待听到你用Nomad和OpenFaaS创建的奇妙的东西。

如果您想深入了解,请查看OpenFaaS文档:https://github.com/openfaas/faas/blob/master/guide/README.md

有关Nomad提供程序的更多信息,包括如何使用Prometheus配置监控,请参阅我们的GitHub repo文档:https://github.com/hashicorp/faas-nomad

最后,如果你想从OpenFaaS中获得一些灵感,请关注OpenFaaS的创始人Alex Ellis的博客:https://blog.alexellis.io​​​​​​​

使用Nomad和OpenFaaS提供FaaS服务相关推荐

  1. 一文讲透推荐系统提供web服务的2种方式

    作者丨gongyouliu 编辑丨zandy 来源 | 大数据与人工智能(ID: ai-big-data) 推荐系统是一种信息过滤技术,通过从用户行为中挖掘用户兴趣偏好,为用户提供个性化的信息,减少用 ...

  2. (2) 第二章 WCF服务与数据契约 服务契约详解(二)- 如何引用WCF提供的服务

    本章节主要目的:掌握如何引用WCF提供的服务 下面来讲解一下如何引用WCF的服务,主要讲解2种方式: 1.Service References 操作步骤:1.在项目中右键鼠标->2.点击添加引用 ...

  3. [置顶] OAuth工作原理随想——让你的系统提供的服务更加安全

    最近这段时间,一直都在和web服务打交道.自己项目组的系统需要别的项目组提供服务接口:别的平台(手机)平台又需要我们这边给它们提供接口.实现.调用.接口文档都有所涉及.从中我发现一个非常重要的问题-- ...

  4. 【计算机网络】数据链路层 : 概述 ( 基本概念 | 功能 | 为 “网络层“ 提供的服务 )

    文章目录 一. 数据链路层 概述 二. "数据链路层" 基本概念 三. "数据链路层" 功能 四. "数据链路层" 为 网络层 提供的服务 ...

  5. 用springmvc 开发为 app 提供后台服务遇到跨域请求的问题

    浏览器使用的chrome,安装了cors插件(开启允许跨域请求) 然后访问远程服务器提供的服务的时候,浏览器console 输出如下形式的错误信息: 问题1.OPTION: xxxxxx url地址 ...

  6. 【客户下单】后台提供webservice服务接收数据

    [客户下单]后台提供webservice服务接收数据 在bos_fore系统中,添加OrderAction封装订单数据. 接下来调用webservice,将数据传递给bos_management系统. ...

  7. 5.1 计算机网络之传输层(传输层提供的服务及功能概述、端口、套接字--Socket、无连接UDP和面向连接TCP服务)

    文章目录 1.传输层提供的服务及功能概述 2.传输层的寻址与端口 (1)端口的作用 (2)端口号的分类 (3)套接字 3.无连接UDP和面向连接TCP服务 1.传输层提供的服务及功能概述 传输层的功能 ...

  8. 微软为NBA提供云计算服务、Google公布Fuchsia OS细节、Zoom用户可选择数据库等|Decode the Week...

    Decode the Week≠音视频技术周刊  01 苹果正在研发可替换零部件的入耳式无线耳机 并发布了Apple Music Web版 彭博社消息,苹果试图通过高端音频产品扩大AirPods业务, ...

  9. go vs python 对接外部web api_python--web--让python提供api服务--aiohttp-Go语言中文社区

    aiohttp介绍 官网上有这样一句话介绍:Async HTTP client/server for asyncio and Python 翻译过来就是 基于asyncio和Python实现的异步HT ...

最新文章

  1. 通过Spring集成从Hibernate 3迁移到4
  2. 红米note3支持html,【小米红米Note3评测】外观变化不小 金色版略显俗套_小米 红米Note3_手机评测-中关村在线...
  3. python爬虫网页pdf_爬虫实战【3】Python-如何将html转化为pdf(PdfKit)
  4. 第2节 storm实时看板案例:12、实时看板综合案例代码完善;13、今日课程总结...
  5. 100-days: thirty-five
  6. 《工作型PPT设计之道》培训心得
  7. LDD3 第15章 内存映射和DMA
  8. Tween动画TranslateAnimation细节介绍
  9. oracle 11.2.0.3.0 client下载,oracle64位客户端 Instant Client
  10. iptv错误代码2003什么意思_IPTV部分错误代码和原因解释
  11. Java DES 加密解密工具类实现
  12. 页面在微信端禁止缩放
  13. 使用Machin公式计算
  14. 阿里云安全组已经开放端口但是服务器端口还是不能访问
  15. Excel十个让你事半功倍的函数
  16. 柔性电子综述2012 ---在医疗,汽车行业,人机界面,移动设备以及其他场景下的可能应用
  17. MATLAB二元隐函数绘图命令fimplicit3详解
  18. yota3墨水屏设置_YOTA3墨水屏“直通”技术取代旧“投射”功能,体验全面升级...
  19. 类似高佣联盟怎么赚的?
  20. VS2005的数据断点功能

热门文章

  1. 我为NET狂-----大前端专帖
  2. JS 得到时间的各个部分
  3. 2017-8-22 训练日记
  4. 嵌入式工程师必读100本专业书籍
  5. ASP 高亮显示不区分大小写的关键字
  6. SDL介绍和简单实用
  7. python ctypes库5_如何传递一个字符串数组
  8. LINUX ulimit命令
  9. Oracle起步——Oracle 11g安装配置
  10. Android:图片加载库Glide VS Picasso