Go是一款非常强大的软件开发语言,具有简单,并发,一流的功能和工具。
在Go中,通常,包只能由一件事负责。应用程序随着几个包有自己的职责而增长。当项目中的包数和项目的职责增加时,可能会在其他包之间进行通信时搞乱。(在这里,通信意味着在流上的不同包/模块上调用函数,有/无等待结果。就像在接收/完全填充订单时递增计数器度量一样)
解密通信的已知方法之一是事件驱动的软件设计。通常,使用外部事件/消息总线服务器是将责任分配给内部/外部服务的方式。但这也为您的堆栈带来了另一个外部组件。每个堆栈都有自己的问题。
对于小型服务,可能不需要添加外部总线的软件包/库和嵌入式系统。要解决此问题,可以在包中添加内部消息总线包。当事情变得越来越大时,可以将这种内部消息总线与外部消息总线服务进行通信。
假设一个项目需要在用户注册上做几件事; 递增计数器,发送电子邮件,记录和/或将webhook发送到外部服务; 而不是直接直接调用每个功能,消息总线可以帮助在不知道调用者的情况下异步执行多个功能。
解耦 包帮助我们编写更清晰的代码,一次只关注一件事。使用总线 Go包,可以获得真正的消息总线系统,并轻松编写解耦包。该bus包允许任何处理程序监听任何事件,而不知道谁生成事件。因此,包可以在不依赖于彼此的情况下进行通信。而且,很容易替代消费者功能。只要新函数理解Event正在发送和接收的结构,其他函数将永远不会知道。
通过Bus4个步骤开始使用Go Package
配置
该bus程序包需要一个唯一的id生成器来为事件分配ID。您可以编写自己的函数来生成唯一ID,或使用提供唯一ID生成功能的包。以下是使用单调id生成器的示例配置:
import ( " github .com/mustafaturan/bus" "github.com/mustafaturan/monoton" "github.com/mustafaturan/monoton/sequencer" ) func init() { // configure id generator (it doesn't have to be monoton) node := uint(1) initialTime := uint(0) monoton.Configure(sequencer.NewMillisecond(), node, initialTime) // configure bus if err := bus.Configure(bus.Config{Next: monoton.Next}); err != nil { panic("whoops") } // ... }
注册活动主题
要向主题发出事件,需要首先注册主题名称:
func init() { // ... // register topics bus.RegisterTopics("order.received", "order.fulfilled") // ... }
注册事件处理程序
要接收主题事件,您需要注册处理程序; 处理程序基本上需要两个值,即 Handle 函数和主题Matcher 正则表达式 模式 。
handler := bus.Handler{ Handle: func(e *Event){ // fmt.Printf("Event: %+v %+v\n", e, e.Topic) // do something // NOTE: Highly recommended to process the event in an async way }), Matcher: ".*", // regex pattern that matches all topics } bus.RegisterHandler("a unique key for the handler", &handler)
发出事件
该bus包提供了一个通用事件结构,用于标准化所有处理程序的事件。在发布活动之前,最好知道bus包装的事件是什么。如果这是您与库的关键时刻,强烈建议您检查结构的数据结构Event。
txID := "some-transaction-id-if-exists" // if it is blank, bus will generate one topic := "order.received" // event topic name (must be registered before) order := make(map[string]string) // interface{} data for event order["orderID"] = "123456" order["orderAmount"] = "112.20" order["currency"] = "USD" bus.Emit(topic, order, txID) // emit the event for the topic
恭喜!您使用bus包发出了第一个事件。现在,所有匹配的处理程序将收到相同的事件。请尝试自己并分享您的评论经验。
bus的开源地址