结论

micro.RegisterSubscriber 和 micro.NewPublisher 配对使用, pub.Publish 第二参数传递对应 proto的 struct broker.Subscribe 和 broker.Publish配对使用, broker.Publish 第二参数传递broker.Message

micro 封装实例

创建go.micro.hello.micro.srv.log srv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import (
	"context"

	logProto "github.com/cnbattle/hello-micro/proto/log"
	"github.com/micro/go-micro"
	"github.com/micro/go-micro/util/log"
)

type Sub struct {}

func (s Sub) Process(ctx context.Context, evt *logProto.LogEvt) error {
	// 业务逻辑
	log.Logf("[sub] 收到日志: %v", evt.Msg)
	return nil
}

func main() {
	service := micro.NewService(
		micro.Name("go.micro.hello.micro.srv.log"),
	)
	service.Init()
	_ = micro.RegisterSubscriber("go.micro.hello.micro.topic.log", service.Server(), &Sub{})
	if err := service.Run(); err != nil {
		panic(err)
	}
}

调用

1
2
3
4
pub := micro.NewPublisher("go.micro.hello.micro.topic.log", cli)
			_ = pub.Publish(ctx, &logProto.LogEvt{
				Msg: "Hello Friends",
			})

broker 封装实例

创建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import (
	"github.com/micro/go-micro"
	"github.com/micro/go-micro/broker"
	"github.com/micro/go-micro/util/log"
)

func Handler(event broker.Event) error {
	log.Logf("[sub] 收到消息,请查收: %v, %v, %v", event.Message().Header, event.Message().Header["serviceName"], string(event.Message().Body))
	return nil
}

func main() {
	// New Service
	service := micro.NewService(
		micro.Name("go.micro.hello.micro.srv.log2"),
		micro.Version("latest"),
	)

	// Initialise service
	service.Init()

	broker := service.Server().Options().Broker

	if err := broker.Init(); err != nil {
		log.Fatalf("Broker Init error: %v", err)
	}
	if err := broker.Connect(); err != nil {
		log.Fatalf("Broker Connect error: %v", err)
	}

	if _, err := broker.Subscribe("go.micro.hello.micro.topic.event", Handler); err != nil {
		log.Fatalf("broker.Subscribe error: %v", err)
	}

	// Run service
	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
event := log2.Event{
				Id:        uuid.New().String(),
				Timestamp: time.Now().Unix(),
				Message:   fmt.Sprintf("如果你看到了消息 %s, '那是因为我一直爱着你", "hello"),
			}
			body, _ := json.Marshal(event)
			_ = broker.Publish("go.micro.hello.micro.topic.event", &broker.Message{
				Header: map[string]string{
					"serviceName": "hello-srv",
				},
				Body: body,
			})