go夜读 log-srv相关问题
cnbattle opened this issue · 8 comments
-
遇到如视频教材中, msg信息没传递过去,对比目前最新github的代码一样, 使用的
go-micro版本为1.18.0,请问最后是哪里的问题 -
在构建
NewPublisher,broker.Message设置的Header数据, 在log-srv里是如何调用的
谢谢
tutorials\examples\basic-practices\micro-broker 里有各种用法,参考下
最新代码我已经上传到 tutorials\others\share\learning-go\second-part 下面,可以参考下。
经测试,在不改变log-srv的情况下,这样是可以的
// 日志Wrapper
func regLogger(cli client.Client) server.HandlerWrapper {
//初始化操作
pub := micro.NewPublisher("go.micro.hello.micro.topic.log", cli)
return func(handlerFunc server.HandlerFunc) server.HandlerFunc {
// 中间操作
return func(ctx context.Context, req server.Request, rsp interface{}) error {
_ = pub.Publish(ctx, &logProto.LogEvt{
Msg: "hello",
})
return handlerFunc(ctx, req, rsp)
}
}
}
否则就需要把 log-srv 的实现改成 https://github.com/micro-in-cn/tutorials/blob/master/examples/basic-practices/micro-broker/nats/srv/main.go 这样的类似实现
个人推测: (不知道对不对,0.0 )
micro.RegisterSubscriber和micro.NewPublisher配对使用,pub.Publish第二参数传递对应 proto的structbroker.Subscribe和broker.Publish配对使用,broker.Publish第二参数传递broker.Message
示例代码跑不通,是因为 log.srv使用的 micro.RegisterSubscriber 和 micro.NewPublisher ,但Publish第二参数传参用的是broker.Message 而不是对应 proto的 struct
如果推测有误,请一笑而过.. 2333
如果推测对了, 这两种方式有啥区别
你的猜测太长了,我没看懂。
micro.RegisterSubscriber底层调用的仍然是broker.的sub/pub能力。只是封装到micro包中。
推测结论
micro.NewPublisher,micro.RegisterSubscriber是基于broker底层sub/pub能力的封装,而这个的 底层能力 并不是 我们使用的broker.Subscribe,broker.Publishbroker.Subscribe,broker.Publish也是基于上述 更底层能力的封装,- 各自封装的不一样,传递 接收参数的方式不一样 , 不能混用,传参不能混淆
使用时 micro.RegisterSubscriber 和 micro.NewPublisher 时, Publish 第二参数传递必须是 创建micro.RegisterSubscriber时传递 proto的 struct, 这里传递broker包的Message struct 将解析不出来内容
使用 broker.Subscribe 和 broker.Publish时, broker包的Publish 第二参数才是broker包的Message struct
您这里代码改成下面那样,消息传递才正常, 使用 broker.Message不对
[others/share/learning-go/second-part/sum-srv/main.go] https://github.com/micro-in-cn/tutorials/blob/87e340e39e0af3bb9c5662127ff595b25e5089dc/others/share/learning-go/second-part/sum-srv/main.go#L76-L88
log.Log("发送日志")
evt := logProto.LogEvt{
Msg: "Hello",
}
pub.Publish(context.TODO(),&evt)
推测结论
micro.NewPublisher,micro.RegisterSubscriber是基于broker底层sub/pub能力的封装,而这个的 底层能力 并不是 我们使用的broker.Subscribe,broker.Publishbroker.Subscribe,broker.Publish也是基于上述 更底层能力的封装,- 各自封装的不一样,传递 接收参数的方式不一样 , 不能混用,传参不能混淆
使用时 micro.RegisterSubscriber 和 micro.NewPublisher 时, Publish 第二参数传递必须是 创建
micro.RegisterSubscriber时传递proto的 struct, 这里传递broker包的Message struct将解析不出来内容使用 broker.Subscribe 和 broker.Publish时, broker包的Publish 第二参数才是broker包的Message struct
并不是,micro.Sub只是挂载需要侦听的Topic,在注册时会把这个Topic调用broker.Sub来处理。Broker是消息收发的唯一组件。可以在各种Server的Reigster()方法中看到相关逻辑。
至于参数问题,不同的层使用的方式不一样,自然结构也是不一样的。最终都是包装成Broker.Message。
可能是我的代码没传完,我回头再看看
Hi,最新代码已经传上了,你说的参数配对方式是对的。