Go语言——goflow工作流使用

[复制链接]
发表于 2025-5-11 11:29:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、引入依赖

这个很坑,他不答应连接带暗码的redis,只能使用不带暗码的redis,要带暗码的话得自己改一下源代码,无语
  1. go get github.com/s8sg/goflow
复制代码
二、画出我们的工作流程


三、编写代码

  1. package main
  2. import (
  3.         "encoding/json"
  4.         "fmt"
  5.         flow "github.com/s8sg/goflow/flow/v1"
  6.         goflow "github.com/s8sg/goflow/v1"
  7.         "log"
  8.         "math/rand"
  9.         "strconv"
  10. )
  11. // Input 输入一个数字
  12. func Input(data []byte, option map[string][]string) ([]byte, error) {
  13.         var input map[string]int
  14.         // 获取输入的数
  15.         if err := json.Unmarshal(data, &input); err != nil {
  16.                 return nil, err
  17.         }
  18.         outputInt := input["input"]
  19.         // 将数据交给工作流处理
  20.         return []byte(strconv.Itoa(outputInt)), nil
  21. }
  22. // AddOne 加上10以内的一个随机整数
  23. func AddOne(data []byte, option map[string][]string) ([]byte, error) {
  24.         // 获取上一个工作流的数据
  25.         num, _ := strconv.Atoi(string(data))
  26.         outputInt := num + rand.Intn(10) + 1
  27.         fmt.Println("AddOne = ", outputInt)
  28.         // 交给下一个工作流处理
  29.         return []byte(strconv.Itoa(outputInt)), nil
  30. }
  31. // AddTwo 加上10以内的一个随机整数
  32. func AddTwo(data []byte, option map[string][]string) ([]byte, error) {
  33.         num, _ := strconv.Atoi(string(data))
  34.         outputInt := num + rand.Intn(10) + 1
  35.         fmt.Println("AddTwo = ", outputInt)
  36.         return []byte(strconv.Itoa(outputInt)), nil
  37. }
  38. // Aggregator 聚合节点
  39. func Aggregator(data []byte, option map[string][]string) ([]byte, error) {
  40.         fmt.Println("Aggregator = ", string(data))
  41.         return data, nil
  42. }
  43. // Expand10 扩大10倍
  44. func Expand10(data []byte, option map[string][]string) ([]byte, error) {
  45.         num, _ := strconv.Atoi(string(data))
  46.         outputInt := num * 10
  47.         fmt.Println("Expand10 = ", outputInt)
  48.         return []byte(strconv.Itoa(outputInt)), nil
  49. }
  50. // Expand100 扩大100倍
  51. func Expand100(data []byte, option map[string][]string) ([]byte, error) {
  52.         num, _ := strconv.Atoi(string(data))
  53.         outputInt := num * 100
  54.         fmt.Println("Expand100 = ", outputInt)
  55.         return []byte(strconv.Itoa(outputInt)), nil
  56. }
  57. // Output 输出节点
  58. func Output(data []byte, option map[string][]string) ([]byte, error) {
  59.         fmt.Println("Output = ", string(data))
  60.         return data, nil
  61. }
  62. // 定义我们自己的一个流程
  63. func MyFlow(workflow *flow.Workflow, context *flow.Context) error {
  64.         // 创建DAG
  65.         dag := workflow.Dag()
  66.         // 创建节点
  67.         dag.Node("input", Input)
  68.         dag.Node("add-one", AddOne)
  69.         dag.Node("add-two", AddTwo)
  70.         // 这个聚合节点,就需要拿到add-one和add-two的结果
  71.         dag.Node("aggregator", Aggregator, flow.Aggregator(func(m map[string][]byte) ([]byte, error) {
  72.                 addOneResult, _ := strconv.Atoi(string(m["add-one"]))
  73.                 addTwoResult, _ := strconv.Atoi(string(m["add-two"]))
  74.                 num := addOneResult + addTwoResult
  75.                 fmt.Println("aggregator = ", num)
  76.                 return []byte(strconv.Itoa(num)), nil
  77.         }))
  78.         // 这个方式是获取到节点的数据进行判断,然后返回一个字符串数组
  79.         f1 := func(bytes []byte) []string {
  80.                 num, _ := strconv.Atoi(string(bytes))
  81.                 fmt.Println("ConditionalBranch = ", num)
  82.                 if num > 10 {
  83.                         return []string{"moreThan"}
  84.                 }
  85.                 return []string{"lessThan"}
  86.         }
  87.         // 这个方法就是将分支的数据返回给output
  88.         f2 := func(m map[string][]byte) ([]byte, error) {
  89.                 if v, ok := m["moreThan"]; ok {
  90.                         i, _ := strconv.Atoi(string(v))
  91.                         fmt.Println("f2 moreThan = ", i)
  92.                         return v, nil
  93.                 }
  94.                 if v, ok := m["lessThan"]; ok {
  95.                         i, _ := strconv.Atoi(string(v))
  96.                         fmt.Println("f2 lessThan = ", i)
  97.                         return v, nil
  98.                 }
  99.                 return nil, nil
  100.         }
  101.         // 创建一个条件分支节点
  102.         branches := dag.ConditionalBranch("judge", []string{"moreThan", "lessThan"}, f1, flow.Aggregator(f2))
  103.         branches["moreThan"].Node("expand-10", Expand10)
  104.         branches["lessThan"].Node("expand-100", Expand100)
  105.         dag.Node("output", Output)
  106.         // 构建关系
  107.         dag.Edge("input", "add-one")
  108.         dag.Edge("input", "add-two")
  109.         dag.Edge("add-one", "aggregator")
  110.         dag.Edge("add-two", "aggregator")
  111.         dag.Edge("aggregator", "judge")
  112.         dag.Edge("judge", "output")
  113.         return nil
  114. }
  115. func main() {
  116.         fs := goflow.FlowService{
  117.                 Port:              10001,
  118.                 RedisURL:          "127.0.0.1:6379",
  119.                 RedisPwd:          "p@ssw0rd",
  120.                 WorkerConcurrency: 5,
  121.                 RetryCount:        0,
  122.         }
  123.         if err := fs.Register("myFlow", MyFlow); err != nil {
  124.                 log.Printf("goflow register err: %v\n", err)
  125.                 return
  126.         }
  127.         if err := fs.Start(); err != nil {
  128.                 panic(err)
  129.         }
  130. }
复制代码
四、Postman测试



回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表