当前位置: 首页 > 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…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...