OpenFaaS实战之二:函数入门
欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
OpenFaaS实战系列文章链接
- 部署
- 函数入门
- Java函数
- 模板操作(template)
- 大话watchdog
- of-watchdog(为性能而生)
- java11模板解析
- OpenFaaS实战之八:自制模板(maven+jdk8)
- OpenFaaS实战之九:终篇,自制模板(springboot+maven+jdk8)
本篇概览
- 本文是《OpenFaaS实战》系列的第二篇,在Kubernetes环境把OpenFaaS在搭建好之后,终于可以开始开发函数了;
- 本篇的主题是熟悉OpenFaaS的函数操作,包括:开发、部署、使用,demo函数使用的语言是python,因为简单;
- demo函数本身并不复杂:一个加法程序,接收1,2,3这样的字符串,分割成三个数字1、2、3,将它们相加的结果返回;
- 提前把函数操作的流程捋捋,如下所示,后面会按照这个流程去执行:
下载模板 --> 创建函数 --> 调整描述文件,非必须 --> 函数功能编写 --> 构建镜像 --> 推送到仓库 --> 部署函数 --> 使用函数
- 接下来,开始操作吧;
提醒
本文中的操作会用到工具faas-cli,前文已提到过此工具可以部署在任意电脑上,远程连接OpenFaaS,请确保faas-cli所在机器上有docker服务,因为构建镜像时会用到。
下载模板
- OpenFaaS官方提供了编程语言模板,执行命令faas-cli template pull,可以将最新模板下载到本地:
[root@node1 faas-template]# faas-cli template pull
Fetch templates from repository: https://github.com/openfaas/templates.git at master
2020/11/19 16:34:31 Attempting to expand templates from https://github.com/openfaas/templates.git
2020/11/19 16:34:45 Fetched 12 template(s) : [csharp dockerfile go java11 java11-vert-x node node12 php7 python python3 python3-debian ruby] from https://github.com/openfaas/templates.git
- 执行命令faas-cli new --list,得到模板列表如下,可见语言类型还是很丰富的:
[root@node1 faas-template]# faas-cli new --list
Languages available as templates:
- csharp
- dockerfile
- go
- java11
- java11-vert-x
- node
- node12
- php7
- python
- python3
- python3-debian
- ruby
- 执行以下命令即可创建函数,add是函数名,python是语言类型,bolingcavalry是docker镜像名字的前缀:
faas-cli new add --lang python -p bolingcavalry
- 控制台提示如下:
[root@node1 faas-template]# faas-cli new add --lang python -p bolingcavalry
Folder: add created.
___ _____ ____
/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
|_|
Function created in folder: add
Stack file written: add.yml
- 当前目录下,产生名为add的文件夹,以及名为add.yml的文件;
- 先看add.yml,这是函数的描述文件,本文中已经够用了,无需修改:
version: 1.0
provider:
name: openfaas
gateway: http://192.168.133.187:31112
functions:
add:
lang: python
handler: ./add
image: bolingcavalry/add:latest
- 进入add文件夹,看到faas-cli帮我们生成的源码文件handler.py,默认代码:
def handle(req):
"""handle a request to the function
Args:
req (str): request body
"""
return req
- 上述代码不符合咱们的需求,完全替换为以下内容:
def handle(req):
array = req.replace('\n', '').split(',')
rlt = 0
for i in array:
rlt += int(i)
return rlt
- 回到add.yml所在目录,执行以下命令开始构建函数:
faas-cli build -f ./add.yml
- 如下所示,开始在本地构建docker镜像,正常情况下可以构建成功:
Step 29/29 : CMD ["fwatchdog"]
---> Running in 94b3e80d0df2
Removing intermediate container 94b3e80d0df2
---> 5e6c22fa838d
Successfully built 5e6c22fa838d
Successfully tagged bolingcavalry/add:latest
Image: bolingcavalry/add:latest built.
[0] < Building add done in 62.81s.
[0] Worker done.
Total build time: 62.81s
- 查看本地镜像,确定是刚刚构建的:
[root@node1 faas-template]# docker images|grep add
bolingcavalry/add latest 5e6c22fa838d 4 minutes ago 88.4MB
关于OpenFaaS访问镜像
- 此时要关注的是K8S环境如何能访问到此镜像;
- 要注意的是OpenFaaS默认的镜像拉取策略是Always,即每次都远程拉取,所以镜像必须放入仓库,例如hub.docker.com、habor、registry等;(这个策略可以修改,不过本文中先不动它)
- 关于镜像仓库的知识就不在此展开,我这里用的是hub.docker.com,因为我的ID是bolingcavalry,因此登录后执行docker push bolingcavalry/add:latest即可推送到远程仓库;
部署函数
- 执行部署命令faas-cli deploy -f add.yml,控制台会提示部署成功,还会给出URL:
[root@node1 faas-template]# faas-cli deploy -f add.yml
Deploying: add.
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.
Deployed. 202 Accepted.
URL: http://192.168.133.187:31112/function/add.openfaas-fn
- 如果K8S可以顺利拉取到镜像,就可以看到openfaas-fn这个namespace下新增了名为add-xxx的pod,且状态正常:
[root@node1 faas-template]# kubectl get pods -n openfaas-fn
NAME READY STATUS RESTARTS AGE
add-5679bcd94c-vc9rw 1/1 Running 0 32m
nodeinfo-57fb768fb8-955tf 1/1 Running 0 104m
- 此时登录管理页面,http://192.168.133.187:31112,可以看到新增的函数,也可以在页面上验证功能调用是否正常,如下图:

- 也可以在其他电脑上发起请求测试,如下所示,函数可以正常服务:
[root@node1 ~]# curl http://192.168.133.187:31112/function/add -X POST -d '1,2,3,4,5,6'
21
至此,OpenFaaS环境下的函数基本操作的实战就完成了,接下来的文章会继续深入OpenFaaS,了解它更多强大的能力;
你不孤单,欣宸原创一路相伴
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
OpenFaaS实战之二:函数入门的更多相关文章
- shiro实战系列(二)之入门实战续
下面讲解基于实战系列一,所以相关的java文件获取pom.xml及其log4j文件同样适用于本次讲解. 一.Using Shiro Using Shiro 现在我们的 SecurityManager ...
- OpenFaaS实战之三:Java函数
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- apollo入门demo实战(二)
1. apollo入门demo实战(二) 1.1. 下载demo 从下列地址下载官方脚本和官方代码 https://github.com/nobodyiam/apollo-build-scripts ...
- 10-Python3从入门到实战—基础之函数
Python从入门到实战系列--目录 函数的定义 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数的语法 def 函数名(参数列表): 函数体 函数代码块以 def 关键词开头 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门
文章目录 1. 声明式缓存 2. Spring Boot默认集成CacheManager 3. 默认的 ConcurrenMapCacheManager 4. 实战演练5. 扩展阅读 4.1. Mav ...
- Docker从入门到实战(二)
Docker从入门到实战(二) 一:什么是docker Docker是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到主流的Linux.MacOS.Windo ...
- OpenFaaS实战之一:部署
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- OpenFaaS实战之四:模板操作(template)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- OpenFaaS实战之五:大话watchdog
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- 06:JS(02)
对象 一切皆对象 数组(类似于python里面的列表) [] var l = [11,22,33,44,55] typeof l "object" var l1 = [11,'sd ...
- guavacache源码阅读笔记
guavacache源码阅读笔记 官方文档: https://github.com/google/guava/wiki/CachesExplained 中文版: https://www.jianshu ...
- 使用 Docker 部署 Node 应用
容器将应用与环境打包整合,解决了应用外部依赖的痛点,打包后通过窗口可方便地部署到任意环境,用过就知道很香. 创建示例应用 以 NestJS 为例,先创建一个示例应用. $ npm i -g @nest ...
- 树上染色+可怜与超市(树状DP)
这两道题是学长精心准备的,想了很长时间,比较经典. 第一题 树上染色 有一棵点数为 N的树,树边有边权.给你一个在 0∼N之内的正整数 K,你要在这棵树中选择 K 个点,将其染成黑色,并将其他的 N− ...
- DOS命令行(4)——Windows系统的配置与管理(上)
sfc --运行系统文件检查器(需要以管理员身份运行命令提示符) 命令格式:SFC [/SCANNOW] [/VERIFYONLY] [/SCANFILE=<file>] [/VERIFY ...
- Golang通过反射拼接一个结构体所有字段
golang通过反射拼接一个结构体所有字段 需求 将一个结构体所有字段以"|"连接拼接成字符串 golang 不同类型拼接成string使用Sprintf比较麻烦,如果一个结构体有 ...
- Vue(9)购物车练习
购物车案例 经过一系列的学习,我们这里来练习一个购物车的案例 需求:使用vue写一个表单页面,页面上有购买的数量,点击按钮+或者-,可以增加或减少购物车的数量,数量最少不得少于0,点击移除按钮,会 ...
- 【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集
问题描述 近日好消息,如果是一个Java Spring Cloud的项目,想使用Azure Applicaiton Insights来收集日志及一些应用程序见解.但是有不愿意集成SDK来修改代码或者配 ...
- gRPC 拦截器能做些什么?
什么是拦截器? 拦截器是一种横切维度的功能延展. 具象说明一下,高速收费站就是一种拦截器.它可以做什么?收费,查证,交通控制等等,面向所有穿行过往的车辆. gRPC 拦截器主要分为两种:客户端拦截器( ...
- PHP经典算法之背包问题
问题:假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: 1 栗子 4KG $4500 2 苹果 5KG $5700 3 ...