printfcoder/stack-rpc-tutorials

go夜读 log-srv相关问题

cnbattle opened this issue · 8 comments

  1. 遇到如视频教材中, msg信息没传递过去,对比目前最新github的代码一样, 使用的go-micro版本为1.18.0 ,请问最后是哪里的问题

  2. 在构建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.RegisterSubscribermicro.NewPublisher 配对使用, pub.Publish 第二参数传递对应 proto的 struct
  • broker.Subscribebroker.Publish配对使用, broker.Publish 第二参数传递broker.Message

示例代码跑不通,是因为 log.srv使用的 micro.RegisterSubscribermicro.NewPublisher ,但Publish第二参数传参用的是broker.Message 而不是对应 proto的 struct


如果推测有误,请一笑而过.. 2333

如果推测对了, 这两种方式有啥区别

你的猜测太长了,我没看懂。

micro.RegisterSubscriber底层调用的仍然是broker.的sub/pub能力。只是封装到micro包中。

推测结论

  1. micro.NewPublisher , micro.RegisterSubscriber 是基于broker底层sub/pub能力的封装,而这个的 底层能力 并不是 我们使用的broker.Subscribe, broker.Publish
  2. broker.Subscribe, broker.Publish 也是基于上述 更底层能力的封装,
  3. 各自封装的不一样,传递 接收参数的方式不一样 , 不能混用,传参不能混淆

使用时 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)

推测结论

  1. micro.NewPublisher , micro.RegisterSubscriber 是基于broker底层sub/pub能力的封装,而这个的 底层能力 并不是 我们使用的broker.Subscribe, broker.Publish
  2. broker.Subscribe, broker.Publish 也是基于上述 更底层能力的封装,
  3. 各自封装的不一样,传递 接收参数的方式不一样 , 不能混用,传参不能混淆

使用时 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,最新代码已经传上了,你说的参数配对方式是对的。