目录

系统中间件与云虚拟化-serverless-基于阿里云函数计算的云工作流CloudFlow设计与体验

系统中间件与云虚拟化-serverless-基于阿里云函数计算的云工作流CloudFlow设计与体验

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

1. 实验系列

·Serverless & DevOps 系列

2. 实验目的

·理解并掌握阿里云CloudFlow的基本概念,及其与函数计算的可视化编排工具,能够按需设计CloudFlow,通
过编排多个函数计算的自动执行工作流,从而构建服务接口

3. 实验要求

本实验将设计并实现一个基于阿里云CloudFlow和FC的温湿度数据监控及告警模拟系统。系统要求在温湿度
数据上报超过预设阀值时,通过调用告警接口发送邮件通知管理员。具体任务如下:
1,构建并部署数据上报接口:实现一个新的FC,作为数据上报接口,通过HTTP接收模拟的温湿度数据。在该函
数中,对温湿度值进行判断:
。如果未超过预设的安全阈值,返回正常状态。
。如果超过预设阈值,则调用实验一中的告警FC,向管理员发送告警邮件。
2.编排云工作流:创建阿里云CloudFlow,并将数据上报FC和实验一中的告警FC进行编排,使它们按顺序执
行,实现自动化的数据监控和告警流程。
3.云工作流测试:
·创建一个HTTP形式的工作流调度,作为对外暴露数据上报入口。
。使用Apifox工具模拟边缘设备向云端上报温湿度数据,通过CloudFlow平台的可视化界面查看工作流的执
行情况,体验CloudFlow在编排FC时的可视化优势。

https://i-blog.csdnimg.cn/direct/242b1f79f60146ee8abc593e9307f33f.png

4. 实验环境

4.1 获取云工作流免费额度

4.2 创建用于执行云工作流的角色

点击创建角色

https://i-blog.csdnimg.cn/direct/b9144c97590c4e74a2b04a77fbc2d0d4.png

因为是给云工作流提供的角色,所以选云服务

https://i-blog.csdnimg.cn/direct/82c79dd9cc0a42e6afcedc4d14848c4b.png

一个是 AliyunFCFullAccess,用于管理函数计算,调用FC

AliyunFnFFullAccess
用于管理函数工作流,用于操作工作流
AliyunEventBridgeFullAccess管理事件总线,用于后续创建工作流调度
https://i-blog.csdnimg.cn/direct/2dc6ccbc779945f1b1becdd6f900fe22.png

4.3 开通事件总线EventBridge

免费开通
然后对EventBridge授权,才可以接收事件

https://i-blog.csdnimg.cn/direct/4bcbba71ff7c4be0801abde04f2d016c.png

5. 核心步骤

5.1 构建并部署数据上传接口

import datetime

from sanic import Sanic
from sanic.response import json

app = Sanic("MyApp")

#温度阈值
t_threshold = (25,28)
#湿度阈值
h_threshold = (30,33)

# if t_out_flag or h_out_flag:
#     "status": 1
# else:
#     "status": 0

@app.route("/upload",methods=["POST"])
async def data_upload(request):
    try:
        data = request.json
        sn = data.get("sn")
        temperature = data.get("temperature")
        humidity = data.get("humidity")
        if not all([sn,temperature,humidity]):
            return json({"error": "Missing sn, temperature, or humidity"}, status=400)
        #判断温湿度是否超过阈值
        #t_out_flag为true就表示超过了阈值
        t_out_flag = not (
            t_threshold[0]<=temperature<=t_threshold[1])
        h_out_flag = not (
            h_threshold[0]<=humidity<=h_threshold[1])
        email_body = generate_email_body(
            sn,
            temperature,
            humidity,t_threshold,h_threshold
        )
        res = {
            "status" : 1 if t_out_flag or h_out_flag else 0,
            "message" : "异常" if t_out_flag or h_out_flag else "正常",
            "data" : {
                #需要自定义收件人邮箱
                "recipient":"zjdsxc12@qq.com",
                "subject":"告知邮箱-温湿度异常",
                "body":email_body
            }if t_out_flag or h_out_flag else True,
        }
        return json(res)
    except Exception as e:
        return json({"error": str(e)}, status=500)
if __name__ == "__main__":
    app.run(host="0.0.0.0",port=9000)

# 作用是允许在字符串中直接嵌入变量或表达式语法是用 {} 包裹变量名或计算式
def generate_email_body(sn,temperature,humidity,t_threshold,h_threshold):
    return (
        f"告警通知:\n\n"
        f"当前设备{sn}的温湿度数据超出正常范围。\n\n"
        f"设备温度:{temperature}°c\n"
        f"温度阈值:{t_threshold[0]}°c-{t_threshold[1]}°c\n\n"
        f"设备湿度:{humidity}%\n"
        f"湿度阈值:{h_threshold[0]}%-{h_threshold[1]}%\n\n"
        f"请尽快检查设备并采取相应措施。\n\n"
        f"时间:{datetime.datetime.now().isoformat()}"
    )

if __name__ == "__main__":
    app.run(host="0.0.0.0",port=9000)

FC函数列表创建函数fun-temperature-and-humidty-data-upload

和以前那个函数是一样的操作,记得关闭授权,记得导入自定义公共层

5.2 创建云工作流


地域要和FC控制台保持一致
点击创建工作流
采用空白画布,快速模式(因为耗时短)
https://i-blog.csdnimg.cn/direct/6ebfbb5a60f24d5bb1b72e6d0c0bb28e.png

5.3 配置执行工作流角色

https://i-blog.csdnimg.cn/direct/4f1898878f094f98aba9bbd536be5bd4.png

点击右上角的工作流配置

https://i-blog.csdnimg.cn/direct/7e4dbd25a07045448940ed51bf377bf7.png

点击保存,配置角色的原因是为了让工作流有角色的权限

5.4 编排数据上报FC

https://i-blog.csdnimg.cn/direct/8aed84a3c89c41ad8896e1bfc02faa0f.png

点这个,画布编辑

删除helloword
然后从左侧拖入InvokeFunction
https://i-blog.csdnimg.cn/direct/97d5a5a70d9744fe93f43170919f02f2.png
然后给InvokeFunction进行配置

https://i-blog.csdnimg.cn/direct/f88bb8bc185d4f68911143f8108ac5fb.png
名字和FC函数名一样,函数调用选择同步调用

点击切换YAML编辑
添加一行或者修改

body.$: $Input.body

https://i-blog.csdnimg.cn/direct/a70ccfce46bd41e4940faa99ffe121f7.png

https://i-blog.csdnimg.cn/direct/b5400e4b2736432992e4e49da0f75b97.png

在点击输出配置
https://i-blog.csdnimg.cn/direct/42a37ad9ca934dcb82b5c9c5113cbde0.png

https://i-blog.csdnimg.cn/direct/372bbd10a1924409858ea79ae476a060.png

5.5 编排告警邮件发送FC

https://i-blog.csdnimg.cn/direct/c018f326da034aafbd20069a2c0300ae.png
https://i-blog.csdnimg.cn/direct/5575242febaa41bcabb39fa4956b2e38.png

https://i-blog.csdnimg.cn/direct/0eea4161d8c542b1bc39470a2eb4acf6.png
https://i-blog.csdnimg.cn/direct/42ad3c2eba234ba9bdd87b2a17f00962.png

5.6 编排选择步骤

https://i-blog.csdnimg.cn/direct/c860b7844df34450a66dea1502a28cba.png
https://i-blog.csdnimg.cn/direct/29ecfc70028d4d6482bcd2e2c4acb6b9.png
https://i-blog.csdnimg.cn/direct/227a2b89b19a4c12b5b04c57334ad559.png

https://i-blog.csdnimg.cn/direct/c9f54c457b964dd6bec0ca726c03b91c.png
https://i-blog.csdnimg.cn/direct/42e2b7998131421ba4f519d058ab65a8.png
这样工作流就完成了

5.7 修改现有FC路由以适配云工作流调用

https://i-blog.csdnimg.cn/direct/fe6542ee834748238f267c27b76eb593.png

5.8 云工作流测试

https://i-blog.csdnimg.cn/direct/1a1ff169314e4b14bc66c190c71d75ae.png

返回工作流详情,点击创建

https://i-blog.csdnimg.cn/direct/cabc1f2b6ed340208c22c27d564657c3.png

https://i-blog.csdnimg.cn/direct/da3350dc9d7f4dda81735efd2efab61b.png

这里点击详情可以获取公网ip

5.9 模拟温湿度数据上报

https://i-blog.csdnimg.cn/direct/44f473985b804e3d837ba64304e3e95a.png
注意url就是工作流详情里面的公网ip地址,不用+upload

https://i-blog.csdnimg.cn/direct/e498df7440dc4b31997191d8bb17c3e2.png
https://i-blog.csdnimg.cn/direct/d1c389aa329042ddbdebc3542e15f954.png

这里显示这个就成功了

点击详情

https://i-blog.csdnimg.cn/direct/08ee9c73ad6747199e29ebf29f82ec79.png
绿色是实际运行步骤

注意有个错误点
https://i-blog.csdnimg.cn/direct/9d820d3d07744c0cab508538ad3b1acf.png

这里应该改为int

https://i-blog.csdnimg.cn/direct/9ed1562faae849fe93ffe8da95fa13d5.png

我们再来观摩

https://i-blog.csdnimg.cn/direct/b444c44acd94490583277936f683832e.png
上一个流的输出就是下一个流的输入

https://i-blog.csdnimg.cn/direct/c1dac72b8f8e40248af68e85ace6a0f9.png

https://i-blog.csdnimg.cn/direct/ea85d4da637544199cd6827ea1bbbeb6.png
再次发送请求40度的了

https://i-blog.csdnimg.cn/direct/135c65feb3114751aaeb9333d48f353a.png

邮件也来了

总结