当前位置: 首页 > news >正文

go语言,yaml实现简单的workflow工作流

目录

1.创建一个yaml文件,名字可以是student.yaml

2.创建go文件测试

3.执行结果


本文章内容,只是一个简单的案例,但足够映射到一个大的项目中。

工作流作用:工作流的作用就是通过yaml配置文件,将关于本工作流的一个个task任务串联起来形成一个大的功能体。通过加载yaml,将任务执行的顺序固定化。

说白了就是对任务进行编排,当大流量来的时候,可以让线程排队执行。

比如:用户注册,需要验证哪些参数,比如验证邮件地址,验证手机号,可以把这些小功能放到一个小任务中,也就是task。然后将这些任务串起来,形成一个大功能,也就是工作流。

现在举个具体的案例,来实现一个简易的工作流,更加通俗易懂。

这里举了一个用户注册的功能。

1.创建一个yaml文件,名字可以是student.yaml

yaml都是key:value结构。- 代表的是一个数组,数组中的元素是key:value结构,这个value还可以是数组类型等等。

# 工作流名字
workflow: "user"# 具体执行的任务
tasks:# 邮件地址的有效性# 单斜杠后面 - 后面是一个列表# name:task的名字# action:具体task对应的方法# params:相关参数,这个参数可能是前端传来的,需要取出,也可能是上一个task的结果。# requires:这个任务是否有依赖,也就是这个任务执行的时候需要执行的另一个任务。- name: "validate_email"action: "validate_email_action"params:email: "user@example.com"requires: []- name: "create_user"action: "create_user_action"params:"username": "yaml""password": "123456"# 这儿创建用户的时候需要验证邮件地址是否有效requires:- "validate_email"- name: "send_welcome_email"action: "send_welcome_email_action"params:"recipient": "user@example.com""subject": "Welcome to our platform!""body":"Dear John Doe,Welcome to our platform! We are excited to have you on board.Best regards,The Team"# 发送这个welcome消息的时候,代表创建成功。"requires":- "create_user"
2.创建go文件测试

创建一个main.go

package mainimport ("fmt""gopkg.in/yaml.v3""io/ioutil"
)
// Workflow 结构体
type Workflow struct {Name  string `yaml:"workflow"`Tasks []Task `yaml:"tasks"`
}// Task 结构体
type Task struct {Name     string         `yaml:"name"`Action   string         `yaml:"action"`Params   map[string]any `yaml:"params"`Requires []string       `yaml:"requires"`
}func main() {data, err := ioutil.ReadFile("workflow/student.yml")if err != nil {fmt.Println("读取配置文件失败:", err)return}var workflow Workflow// yaml反序列化,将字节类型的数据反序列化到结构体中err = yaml.Unmarshal(data, &workflow)if err != nil {fmt.Println("data反序列化错误:", err)return}// 执行工作流的任务// 获取工作流for _, task := range workflow.Tasks {if checkDependecies(task.Requires) {fmt.Println("执行任务", task.Name)result, err := executeTask(task.Action, task.Params)if err != nil {fmt.Println("任务执行失败!", err)return}fmt.Println("执行的结果为:", result)fmt.Println("---")} else {fmt.Println("跳过任务:", task.Name)}fmt.Println("task.Params:", task.Params)fmt.Println("task.Action:", task.Action)fmt.Println("task.Requires:", task.Requires)fmt.Println("task.Name:", task.Name)if task.Params["username"] != "" {fmt.Println("task.Params username:", task.Params["username"])}}fmt.Println("用户执行成功!~")}// 检查任务的依赖是否满足
func checkDependecies(requires []string) bool {// todo 验证参数return true
}
// 执行任务
func executeTask(action string, params map[string]any) (string, error) {switch action {case "validate_email_action":// todo 验证邮件地址的有效性return "ok", nilcase "create_user_action"://todo 创建用户return "user_id", nilcase "send_welcome_email_action":// 发送消息return "ok", nildefault:return "", fmt.Errorf("未知的任务:%s", action)}
}
3.执行结果

我把参数信息都打印出来了

执行任务 validate_email
执行的结果为: ok
---
task.Params: map[email:user@example.com]
task.Action: validate_email_action
task.Requires: []
task.Name: validate_email
task.Params username: <nil>
执行任务 create_user
执行的结果为: user_id
---
task.Params: map[password:123456 username:yaml]
task.Action: create_user_action
task.Requires: [validate_email]
task.Name: create_user
task.Params username: yaml
执行任务 send_welcome_email
执行的结果为: ok
---
task.Params: map[body:Dear John Doe, Welcome to our platform! We are excited to 
have you on board. Best regards, The Team recipient:user@example.com subject:Wel
come to our platform!]
task.Action: send_welcome_email_action
task.Requires: [create_user]
task.Name: send_welcome_email
task.Params username: <nil>
用户执行成功!~

相关文章:

go语言,yaml实现简单的workflow工作流

目录 1.创建一个yaml文件&#xff0c;名字可以是student.yaml 2.创建go文件测试 3.执行结果 本文章内容&#xff0c;只是一个简单的案例&#xff0c;但足够映射到一个大的项目中。 工作流作用&#xff1a;工作流的作用就是通过yaml配置文件&#xff0c;将关于本工作流的一个…...

BaiduMallServcie

说明 本文档指导业务开发步骤 BaiduMallServcie 说明一. 登录业务1.1 数据库设计1.1.1 管理员表1.1.2 角色表1.1.3 关联表 管理员表与角色表关联1.1.4 权限表1.1.5 关联表 角色表与权限表关联1.1.6 管理员登录日志表1.1.7 查询权限示例1.2 添加用户一. 登录业务 1.1 数据库设…...

vue3+jsx+antd的插槽写法之一

如果在jsx里面直接这样按照官方的写法是会报错的 正确写法是&#xff1a;...

Shell 学习之 if 命令

1. 执行流程 在 Shell 脚本中&#xff0c;if 是一个 控制流语句&#xff0c;用于进行条件判断&#xff0c;根据条件的结果执行相应的操作。 # 首先&#xff0c;Shell 会检查表达式 condition 返回的 boolean 值。 # 如果 condition 的值为真&#xff0c;则执行 then 代码块&a…...

android 同步 服务器 时间

要将 Android 设备与服务器同步时间&#xff0c;可以通过以下两种方式实现&#xff1a; NTP 协议同步时间 NTP&#xff08;Network Time Protocol&#xff09;是一种网络协议&#xff0c;用于同步计算机的时间。Android 设备可以使用 NTP 协议来同步服务器时间。 Android 应…...

10、电路综合-基于简化实频的宽带匹配电路设计方法

10、电路综合-基于简化实频的宽带匹配电路设计方法 网络综合和简化实频理论学习概述中的1-9介绍了SRFT的一些基本概念和实验方法&#xff0c;终于走到了SRFT的另一个究极用途&#xff0c;宽带匹配电路的设计。 1、之前的一些回顾与总结 之前也给出了一些电路综合的案例&…...

N-130基于springboot,vue校园社团管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本系…...

Syntax Error: TypeError: this.getOptions is not a function的解决(Vue)

报错信息&#xff1a; TypeError: this.getOptions is not a function 这个是在运行项目是遇到的问题 这个报错是类型错误&#xff0c;this.getOptions 不是一个函数 。这个错误一般就是less-loader库里的错误。 主要是less-loader版本太高&#xff0c;不兼容this.getOptions…...

使用 kube-downscaler 降低Kubernetes集群成本

新钛云服已累计为您分享772篇技术干货 介绍 Kube-downscaler 是一款开源工具&#xff0c;允许用户定义 Kubernetes 中 pod 资源自动缩减的时间。这有助于通过减少非高峰时段的资源使用量来降低基础设施成本。 在本文中&#xff0c;我们将详细介绍 kube-downscaler 的功能、安装…...

LeetCode热题100——哈希表

哈希表 1.两数之和2.字母异位词分组3.最长连续序列 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。可以按任意顺序返回答案。 // 题解思路&#xff1a;使用哈…...

Kubeadm

目录 绪论&#xff1a;实验步骤 1、环境准备 2、所有节点安装docker 3、所有节点安装kubeadm&#xff0c;kubelet和kubectl 4、部署K8S集群 5、部署 Dashboard 6、安装Harbor私有仓库 master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&#xff09; 192.168.…...

【Overload游戏引擎细节分析】PBR材质Shader---完结篇

PBR基于物理的渲染可以实现更加真实的效果&#xff0c;其Shader值得分析一下。但PBR需要较多的基础知识&#xff0c;不适合不会OpenGL的朋友。 一、PBR理论 PBR指基于物理的渲染&#xff0c;其理论较多&#xff0c;需要的基础知识也较多&#xff0c;我在这就不再写一遍了&…...

C++设计模式_18_State 状态模式

State和Memento被归为“状态变化”模式。 文章目录 1. “状态变化”模式1.1 典型模式 2. 动机 (Motivation)3. 代码演示State 状态模式3.1 常规方式3.2 State 状态模式 4. 模式定义5. 结构( Structure )6. 要点总结7. 其他参考 1. “状态变化”模式 在组件构建过程中&#xf…...

详解final, abstract, interface关键字

一.final关键字 1.final关键字介绍 ——final关键字可以去修饰类、方法、属性和局部变量 2.final关键字的作用 1&#xff09;final修饰类&#xff0c;这个类不能被其他类继承 2&#xff09;final修饰方法&#xff0c;方法不能被重写 3&#xff09;final修饰属性&#xff0c;属…...

统计特殊四元组

题记&#xff1a; 给你一个 下标从 0 开始 的整数数组 nums &#xff0c;返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 &#xff1a; nums[a] nums[b] nums[c] nums[d] &#xff0c;且a < b < c < d 示例 1&#xff1a; 输入&#xff1a; nums [1,2,3…...

腾讯云轻量应用服务器“镜像”怎么选择合适?

腾讯云轻量应用服务器镜像怎么选择&#xff1f;如果是用来搭建网站可以选择宝塔Linux面板腾讯云专享版&#xff0c;镜像系统根据实际使用来选择&#xff0c;腾讯云百科txybk.com来详细说下腾讯云轻量应用服务器镜像的选择方法&#xff1a; 腾讯云轻量应用服务器镜像选择 轻量…...

Ruby模块和程序组织

和类一样&#xff0c;模块是一组方法和常量的集合。 和类不同&#xff0c;模块没有实例&#xff0c;取而代之的是可以将特殊模块的功能添加到一个类或者指定对象之中。 Class类是Module类的一个子类&#xff0c;因此每一个类对象也是一个模块对象 一、模块创建和基础应用 编写…...

14、SpringCloud -- WebSocket 实时通知用户

目录 实时通知用户需求:代码:前端:后端:WebSocket创建 websocket-server 服务添加依赖:配置 yml 和 启动类:前端:后端代码:注意:测试:总结:实时通知用户 需求: 用户订单秒杀成功之后,对用户进行秒杀成功通知。 弹出个提示框来提示。 代码: 前端:...

智能井盖传感器推荐,万宾科技助力城市信息化建设

随着科技产品更新换代进程加快&#xff0c;人工智能在人们日常生活之中逐渐普及开来&#xff0c;深入人们生活的方方面面&#xff0c;影响城市基础设施建设工程。例如在大街小巷之中的井盖作为城市基础建设的一个重要部分&#xff0c;一旦出现松动倾斜或凸起等异常问题&#xf…...

3D模型格式转换工具HOOPS Exchange对工业级3D产品HOOPS的支持与应用

一、概述 HOOPS Exchange是一套高性能模型转换软件库&#xff0c;可以给软件提供强大的模型的导入和导出功能&#xff0c;我们可以将其单独作为转换工具使用&#xff0c;也可以将其集成到自己的软件中。 同样&#xff0c;HOOPS 的其它产品&#xff0c;也离不开HOOPS Exchange…...

TikTok 短视频生成工具哪家好?TikTok 爆款视频复刻,有什么工具推荐

在 TikTok 流量竞争愈发激烈的 2026 年&#xff0c;想要快速起号、稳定爆单&#xff0c;离不开优质短视频量产和爆款视频复刻。不用从零原创创作&#xff0c;借助成熟 AI 工具复刻平台热门爆款&#xff0c;已经成为跨境卖家和内容创作者的主流玩法。 不少人都在纠结两大问题&a…...

【亲测免费】 DXF轨迹图转G代码工具:高效、精准的数控编程利器

DXF轨迹图转G代码工具&#xff1a;高效、精准的数控编程利器 【下载地址】DXF轨迹图转G代码工具介绍 DXF轨迹图转G代码工具介绍本仓库提供了一个资源文件&#xff0c;用于将DXF格式的轨迹图转换为G代码 项目地址: https://gitcode.com/open-source-toolkit/528cd 项目介…...

Redis Sorted Set(有序集合)详解

Redis 里面有一种非常强大的数据结构&#xff1a; Sorted Set&#xff08;有序集合&#xff09;简称&#xff1a; ZSet这是 Redis 面试和项目里非常高频的东西。一、什么是 Sorted Set 先记住一句话&#xff1a; Sorted Set 自动排序的 Set它具备&#xff1a; Set 的去重自动排…...

STM32 ADC采样不准?别急着调代码,先检查VDDA和VREF+的供电(附实测波形)

STM32 ADC采样精度优化&#xff1a;从硬件设计到实测验证的完整指南 在嵌入式系统开发中&#xff0c;ADC采样精度问题往往让工程师陷入软件调试的泥潭。当发现采样值波动大、线性度差时&#xff0c;多数人的第一反应是检查代码配置——采样周期够不够&#xff1f;校准是否正确…...

STM32F407移植EasyFlash:嵌入式Flash键值存储与磨损均衡实战

1. 项目概述&#xff1a;为什么要在STM32F407上折腾EasyFlash&#xff1f;最近在做一个基于STM32F407的物联网终端设备&#xff0c;功能上需要记录一些运行参数、用户配置&#xff0c;还得在意外断电后能恢复现场。最开始想着用片内Flash模拟EEPROM&#xff0c;自己写读写擦除逻…...

别再复制粘贴了!深度优化你的TM1640驱动代码:效率与可维护性实战

TM1640驱动代码重构实战&#xff1a;从能用走向工业级 在嵌入式开发中&#xff0c;我们常常会遇到这样的场景&#xff1a;项目初期为了快速验证功能&#xff0c;直接从网上复制一段"能用就行"的驱动代码。但随着项目规模扩大&#xff0c;这些代码逐渐暴露出可维护性差…...

技能图谱:构建结构化知识体系,实现高效学习与成长

1. 项目概述&#xff1a;一个技能图谱的诞生与价值在技术社区里&#xff0c;我们经常看到各种“Awesome List”——那些按领域整理的工具、库和资源清单。它们很有用&#xff0c;但总感觉缺了点什么。直到我偶然在 GitHub 上看到了tenequm/skills这个仓库&#xff0c;它给我带来…...

CLI工具集claw:模块化设计与插件化架构深度解析

1. 项目概述&#xff1a;一个面向开发者的现代化CLI工具集最近在GitHub上看到一个名为opsyhq/claw的项目&#xff0c;第一眼就被它简洁的名字吸引了。claw&#xff0c;中文意思是“爪子”&#xff0c;听起来就很有力量感和抓取感。点进去一看&#xff0c;果然&#xff0c;这是一…...

因果推理第四层盲区:为什么关联≠因果

因果推理第四层盲区&#xff1a;为什么关联≠因果 副标题: 从Pearl因果阶梯到知识库因果链&#xff0c;AI如何跨越观测vs建模的鸿沟痛点&#xff1a;为什么你的AI只能"描述"不能"规划"&#xff1f; 你有没有遇到过这样的情况&#xff1a; AI能告诉你"…...

基于Adafruit FunHouse与MQTT构建响应式智能家居传感节点

1. 项目概述&#xff1a;从零构建一个响应灵敏的智能家居传感节点如果你手头有一块像Adafruit FunHouse这样的开发板&#xff0c;上面集成了温湿度、气压传感器&#xff0c;还有几个物理按钮和滑块&#xff0c;你可能会想&#xff0c;怎么才能让它真正“活”起来&#xff0c;成…...