golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布
本章节阐述micro消息订阅和发布相关内容阅读本文前你可能需要进行如下知识储备golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境,golang微服务框架go-micro 入门笔记2.1 micro工具之micro apigolang微服务框架go-micro 入门笔记2.2 micro工具之micro webbroker代理微服务之间需要通过broker来传递消息,go-micro支持http/nats/memory三种broker,其中http是默认的broker。同时,go-micro以强大的插件形式,提供如下几种常见的broker。$ls gocloud/ googlepubsub/ grpc/ kafka/ mqtt/ nats/ nsq/ proxy/ rabbitmq/ redis/ snssqs/ sqs/ stan/ stomp/httpHTTP Broker 是基于HTTP的异步broker,源代码在github.commicrogo-microv1.9.1brokerbroker.go中,默认DefaultBroker为httpvar ( DefaultBroker Broker newHttpBroker() )httpbroker实际上就是一个结构体type httpBroker struct { id string //微服务ID address string //主机地址 opts Options //一些配置 mux *http.ServeMux //通过这个监听其他端发送的http请求 c *http.Client //通过这个发送请求到其他端 r registry.Registry sync.RWMutex subscribers map[string][]*httpSubscriber //订阅 running bool exit chan chan error // offline message inbox mtx sync.RWMutex inbox map[string][][]byte //数据缓存 }通过http.Client发送请求,通过http.ServeMux实现请求监听,通过inbox存储数据redisredis初始化代码如下//main.go //初始化URL格式redis://密码主机:端口/ b : redis.NewBroker( broker.Addrs(redis://user:secretlocalhost:6379/), ) //初始化 b.Init() //连接 b.Connect() // 新建service service : grpc.NewService( micro.Name(go.micro.web.config), micro.Version(latest), micro.Broker(b), ) //初始化service service.Init() //启动,运行,监听 service.Run()启动应用程序需要指定broker为redisgo run main.go --brokerredisgrpc 初始化初始化过程如下//main.go import ( github.com/micro/go-plugins/broker/grpc ) // 建立连接 b : grpc.NewBroker() b.Init() b.Connect() // 订阅事件 sub, _ : b.Subscribe(events) defer sub.Unsubscribe() // 发布事件 b.Publish(events, broker.Message{ Headers: map[string]string{type: event}, Body: []byte(an event), })启动应用程序需要指定broker为grpcgo run main.go --brokergrpcrabbitmq 初始化初始化过程如下//main.go import ( github.com/micro/go-plugins/broker/grpc ) b : rabbitmq.NewBroker( broker.Addrs(amqp://用户名:密码主机host:端口port), ) b.Init() b.Connect()启动应用程序需要指定broker为rabbitmqgo run main.go plugin.go --brokerrabbitmqmqtt初始化过程如下//main.go import ( github.com/micro/go-micro github.com/micro/go-plugins/broker/mqtt ) func main() { service : micro.NewService( micro.Name(my.service), micro.Broker(mqtt.NewBroker()), ) //... }启动应用程序需要指定broker为mqttgo run main.go plugin.go --brokermqtt其他其他可以阅读代码$GOPATH/src/github.com/micro/go-plugins/broker消息订阅和发布通过micro.RegisterSubscriber实现消息订阅消息订阅主要API接口如下,第一个参数标识消息主题,第二个参数表示服务实例。// Register Struct as Subscriber micro.RegisterSubscriber(go.micro.srv.testsrv, service.Server(), new(subscriber.Testsrv)) // Register Function as Subscriber micro.RegisterSubscriber(go.micro.srv.testsrv, service.Server(), subscriber.Handler)重点注意第三个参数,第三个参数是处理函数,可以是函数,也可以是实现了func Handler(ctx context.Context, msg *testsrv.Message) error方法的结构体,micro内部会根据参数类型自动适配。结构体中可以实现多个func Handler(ctx context.Context, msg *testsrv.Message) error类型方法通过broker.Subscribe实现订阅Broker提供如下接口type Broker interface { Init(...Option) error Options() Options Address() string Connect() error Disconnect() error Publish(topic string, m *Message, opts ...PublishOption) error Subscribe(topic string, h Handler, opts ...SubscribeOption) (Subscriber, error) String() string }Subscribe 订阅事件,topic代表主题,h事件处理函数Publish 发布事件消息处理函数Handler 定义在上述涉及到处理函数handler,具体含义如下type Handler func(Event) error // Event is given to a subscription handler for processing type Event interface { Topic() string Message() *Message Ack() error } type Message struct { Header map[string]string Body []byte }通过broker.Publish实现发布举例如下// 建立连接 b : grpc.NewBroker() b.Init() b.Connect() // 订阅事件 sub, _ : b.Subscribe(events) defer sub.Unsubscribe() // 发布事件 b.Publish(events, broker.Message{ Headers: map[string]string{type: event}, Body: []byte(an event), })通过micro publish实现发布举例如下micro publish go.micro.web.config hello实战和代码效果下载代码broker.zip解压到techidea8.com/microapp/broker下运行,效果图忑发布消息需要注意json格式字符串micro publish go.micro.srv.broker {\say\:\这是测试消息\}获得代码关注公众号回复micro-broker即可获得

相关新闻

云计算概念及发展历程

云计算概念及发展历程

云计算概念云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算机资源共享池(资源包括网络、服务器、存储、应用软件和服务),这些资源能够被快速提供,只需投入很…

2026/11/4 3:44:39 阅读更多 →
常用的激活函数总结

常用的激活函数总结

激活函数名表达式导数表达式sigmoidf(x)11e−x\frac{1}{1e^-x}1e−x1​f’(x)f(x)(1-f(x))Tanhf(x) tanh(x) ex−e−xexe−x\frac{e^x-e^-x}{e^xe^-x}exe−xex−e−x​f’(x)1-((fx))2((fx))^2((fx))2Reluf(x)max(0,x){0x≤0xx>0f(x)max(0,x) \begin{cases}0&\te…

2026/11/4 9:56:30 阅读更多 →
Java面向对象设计模式

Java面向对象设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠…

2026/11/1 4:34:59 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻