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


    目录

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

    2.创建go文件测试

    3.执行结果


    欢迎关注公众号:天天说编程

    你的关注是我最大的动力!

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

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

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

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

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

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

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

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

    1. # 工作流名字
    2. workflow: "user"
    3. # 具体执行的任务
    4. tasks:
    5. # 邮件地址的有效性
    6. # 单斜杠后面 - 后面是一个列表
    7. # name:task的名字
    8. # action:具体task对应的方法
    9. # params:相关参数,这个参数可能是前端传来的,需要取出,也可能是上一个task的结果。
    10. # requires:这个任务是否有依赖,也就是这个任务执行的时候需要执行的另一个任务。
    11. - name: "validate_email"
    12. action: "validate_email_action"
    13. params:
    14. email: "user@example.com"
    15. requires: []
    16. - name: "create_user"
    17. action: "create_user_action"
    18. params:
    19. "username": "yaml"
    20. "password": "123456"
    21. # 这儿创建用户的时候需要验证邮件地址是否有效
    22. requires:
    23. - "validate_email"
    24. - name: "send_welcome_email"
    25. action: "send_welcome_email_action"
    26. params:
    27. "recipient": "user@example.com"
    28. "subject": "Welcome to our platform!"
    29. "body":
    30. "Dear John Doe,
    31. Welcome to our platform! We are excited to have you on board.
    32. Best regards,
    33. The Team"
    34. # 发送这个welcome消息的时候,代表创建成功。
    35. "requires":
    36. - "create_user"
    2.创建go文件测试

    创建一个main.go

    1. package main
    2. import (
    3. "fmt"
    4. "gopkg.in/yaml.v3"
    5. "io/ioutil"
    6. )
    7. // Workflow 结构体
    8. type Workflow struct {
    9. Name string `yaml:"workflow"`
    10. Tasks []Task `yaml:"tasks"`
    11. }
    12. // Task 结构体
    13. type Task struct {
    14. Name string `yaml:"name"`
    15. Action string `yaml:"action"`
    16. Params map[string]any `yaml:"params"`
    17. Requires []string `yaml:"requires"`
    18. }
    19. func main() {
    20. data, err := ioutil.ReadFile("workflow/student.yml")
    21. if err != nil {
    22. fmt.Println("读取配置文件失败:", err)
    23. return
    24. }
    25. var workflow Workflow
    26. // yaml反序列化,将字节类型的数据反序列化到结构体中
    27. err = yaml.Unmarshal(data, &workflow)
    28. if err != nil {
    29. fmt.Println("data反序列化错误:", err)
    30. return
    31. }
    32. // 执行工作流的任务
    33. // 获取工作流
    34. for _, task := range workflow.Tasks {
    35. if checkDependecies(task.Requires) {
    36. fmt.Println("执行任务", task.Name)
    37. result, err := executeTask(task.Action, task.Params)
    38. if err != nil {
    39. fmt.Println("任务执行失败!", err)
    40. return
    41. }
    42. fmt.Println("执行的结果为:", result)
    43. fmt.Println("---")
    44. } else {
    45. fmt.Println("跳过任务:", task.Name)
    46. }
    47. fmt.Println("task.Params:", task.Params)
    48. fmt.Println("task.Action:", task.Action)
    49. fmt.Println("task.Requires:", task.Requires)
    50. fmt.Println("task.Name:", task.Name)
    51. if task.Params["username"] != "" {
    52. fmt.Println("task.Params username:", task.Params["username"])
    53. }
    54. }
    55. fmt.Println("用户执行成功!~")
    56. }
    57. // 检查任务的依赖是否满足
    58. func checkDependecies(requires []string) bool {
    59. // todo 验证参数
    60. return true
    61. }
    62. // 执行任务
    63. func executeTask(action string, params map[string]any) (string, error) {
    64. switch action {
    65. case "validate_email_action":
    66. // todo 验证邮件地址的有效性
    67. return "ok", nil
    68. case "create_user_action":
    69. //todo 创建用户
    70. return "user_id", nil
    71. case "send_welcome_email_action":
    72. // 发送消息
    73. return "ok", nil
    74. default:
    75. return "", fmt.Errorf("未知的任务:%s", action)
    76. }
    77. }
    3.执行结果

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

    1. 执行任务 validate_email
    2. 执行的结果为: ok
    3. ---
    4. task.Params: map[email:user@example.com]
    5. task.Action: validate_email_action
    6. task.Requires: []
    7. task.Name: validate_email
    8. task.Params username: <nil>
    9. 执行任务 create_user
    10. 执行的结果为: user_id
    11. ---
    12. task.Params: map[password:123456 username:yaml]
    13. task.Action: create_user_action
    14. task.Requires: [validate_email]
    15. task.Name: create_user
    16. task.Params username: yaml
    17. 执行任务 send_welcome_email
    18. 执行的结果为: ok
    19. ---
    20. task.Params: map[body:Dear John Doe, Welcome to our platform! We are excited to
    21. have you on board. Best regards, The Team recipient:user@example.com subject:Wel
    22. come to our platform!]
    23. task.Action: send_welcome_email_action
    24. task.Requires: [create_user]
    25. task.Name: send_welcome_email
    26. task.Params username: <nil>
    27. 用户执行成功!~

    欢迎关注公众号:天天说编程

    你的关注是我最大的动力!

  • 相关阅读:
    数组篇 第一题:删除排序数组中的重复项
    Mybatis中重要对象的生命周期
    《计算机视觉中的多视图几何》笔记(2)
    服务老是被攻击,如何设计一套比较安全的接口访问策略?
    数组在TypeScript中是如何工作的
    最优化:建模、算法与理论(优化建模——2)
    Docker 安装部署 Gitlab 存储路径迁移
    四十九、Hadoop HA部署(MINI版)
    Prompt Playground 7月开发记录(2): Avalonia 应用开发
    夜神模拟器+Fiddler抓包测试App
  • 原文地址:https://blog.csdn.net/Sunshineoe/article/details/134095752