七叶笔记 » golang编程 » golang中的解耦包通信

golang中的解耦包通信

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的开源地址

相关文章