Golang 中使用「Event - Listener」解耦逻辑,让你的应用更简单!

当一个订单完成时,老板说:发个短信给用户,再发个邮件吧,同时更新下统计数据,巴拉巴拉(真事多)。

我们当然可以用 goroutine 处理这些耗时的任务,但优雅的一种方式是使用「事件系统(Event - Listener 模式)」来进行代码的解耦,让代码逻辑更简单!

跟 Laravel 的使用方法完全一致,Phper 请安心服用。

第一步:生成任务类

go run . artisan make:event PodcastProcessed
go run . artisan make:listener SendPodcastNotification

第二步:注册事件和监听器

package providers

import (
  "github.com/goravel/framework/contracts/events"
  "github.com/goravel/framework/support/facades"
)

type EventServiceProvider struct {
}

...

func (receiver *EventServiceProvider) listen() map[events.Event][]events.Listener {
  return map[events.Event][]events.Listener{
    &events.OrderShipped{}: {
      &listeners.SendShipmentNotification{},
    },
  }
}

第三步:实现 Listener 逻辑

巴拉巴拉

第四步:调度事件

err := facades.Event.Job(&events.OrderShipped{}, []events.Arg{
    {Type: "string", Value: "abcc"},
    {Type: "int", Value: 1234},
  }).Dispatch()

Over, 更多功能详见文档,小伙伴们开始愉快的搞事情吧!

关于 Goravel

Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。 作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。

项目地址:github.com/goravel/goravel

文档地址:www.goravel.dev

0DkNTwOZmj.png!large

本作品采用《CC 协议》,转载必须注明作者和本文链接
唯有所执,方有所成。
讨论数量: 25

其实我还曾经想过一种方式: 1,我观察你,和你无关。

type Word  {}

// @Event
type EventStruct {
    Word
}

func (EventStruct) Handel (int, out interrface{}){}

这样子Word 所有函数都被EventStruct观察到,启动前解析@Event,生成真实观察的代码。

1年前 评论
Mericustar 1年前
AB (作者) 1年前
AB (作者) 1年前
Mericustar

看你没有说异步,那就是同步 dispatch,那问一下,如何解决循环引用的问题? 以及在实际业务中可能遇到 event - dispath 调用栈过长而导致上下文数据相互影响的问题,有什么好的办法处理吗?

1年前 评论
AB 1年前
Mericustar (作者) 1年前
Mericustar (作者) 1年前
Mericustar (作者) 1年前
AB 1年前
AB 1年前
Mericustar (作者) 1年前
Bowens (楼主) 1年前
Mericustar (作者) 1年前
Mericustar (作者) 1年前
Bowens (楼主) 1年前
Mericustar (作者) 1年前
Bowens (楼主) 1年前
Mericustar (作者) 1年前
AB 1年前
Mericustar (作者) 1年前
pangxianfei

我想知道压力测试报告及并发时的。

1年前 评论
Bowens (楼主) 1年前

这artisan味太重了,哈哈哈

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!