golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布
本章节阐述micro消息订阅和发布相关内容
阅读本文前你可能需要进行如下知识储备
- golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境,
- golang微服务框架go-micro 入门笔记2.1 micro工具之micro api
- golang微服务框架go-micro 入门笔记2.2 micro工具之micro web
broker代理
微服务之间需要通过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/
http
HTTP Broker 是基于HTTP的异步broker,源代码在github.com\micro\go-micro@v1.9.1\broker\broker.go
中,默认DefaultBroker为http
var (
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
存储数据
redis
redis初始化代码如下
//main.go
//初始化URL格式redis://密码@主机:端口/
b := redis.NewBroker(
broker.Addrs("redis://user:secret@localhost: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为redis
go run main.go --broker=redis
grpc 初始化
初始化过程如下
//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为grpc
go run main.go --broker=grpc
rabbitmq 初始化
初始化过程如下
//main.go
import (
"github.com/micro/go-plugins/broker/grpc"
)
b := rabbitmq.NewBroker(
broker.Addrs("amqp://用户名:密码@主机host:端口port"),
)
b.Init()
b.Connect()
启动应用程序需要指定broker为rabbitmq
go run main.go plugin.go --broker=rabbitmq
mqtt
初始化过程如下
//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为mqtt
go run main.go plugin.go --broker=mqtt
其他
其他可以阅读代码
$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
即可获得
推荐阅读
开源项目golang go语言后台管理框架restgo-admin
golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布的更多相关文章
- golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang微服务框架go-micro 入门笔记2.4 go-micro service解读
本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- 【GoLang】golang 微服务框架 go-kit
golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ...
- golang微服务框架go-micro 入门笔记2.1 micro工具之micro api
micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...
- [goa]golang微服务框架学习--安装使用
当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码, ...
- golang微服务框架go-micro 入门笔记1.搭建 go-micro环境
微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...
- 【GoLang】golang 微服务框架 介绍
原文如下: rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架,基于Golang net/rpc实现. 谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括 ...
- [goa]golang微服务框架学习(二)-- 代码自动生成
之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...
- [goa]golang微服务框架学习(三)-- 使用swagger-ui展示API
既然goa框架自动生成啦swagger-json文件,那么如何用swagger-ui展示出来呢? 这里分三步: 1.下载swagger-ui的web代码 2.添加swagger.json 和 swag ...
随机推荐
- 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)
query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...
- socket数据传输
目录 subprocess模块 struct模块: 粘包问题: QQ聊天的实现: 文件的传输: 大文件的传输: 传输层协议: TCP : UDP: FTP: socketServer模块: subpr ...
- GoCN每日新闻(2019-11-07)
GoCN每日新闻(2019-11-07) GoCN每日新闻(2019-11-07) 1. [译] 排序运行时间能否做到 O(n)?让 Go 语言来告诉你 https://mp.weixin.qq.co ...
- SSH登录慢解方案 - 关闭UseDNS加速
每次登录SSH时总是要停顿等待一会儿才能连接上,,这是因为OpenSSH服务器有一个DNS查找选项UseDNS默认情况下是打开的. UseDNS 选项打开状态下,当通过终端登录SSH服务器时,服务器端 ...
- 新款戴尔笔记本win10系统改win7 安装教程
下载U盘启动制作工具 及戴尔DELL ghost win7 旗舰版GHO 文件 下载地址:http://pan.baidu.com/s/1c17JqpU 插入制作好的U盘启动盘,开机按F2进入BIO ...
- JS 根据不同年份,获取不同月份的天数
在做日期方面的需求时,需要考虑到大小月的问题 ##格式:new Date(year,month,0).getDate() new Date(2019,12,0).getDate() 可以在控制台打印 ...
- cBioPortal 数据库
http://www.cbioportal.org/ 参考连接 http://www.geneseed.com.cn/page464?article_id=413
- 原生js实现元素类名的判存、添加和移除
1.addClass:为指定的dom元素添加样式. 2.removeClass:删除指定dom元素的样式. 3.toggleClass:如果存在(不存在),就删除(添加)一个样式. 4.hasClas ...
- jenkins使用--安装文档
添加Jenkins的源(repository): #sudo wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/je ...
- XMLHttpRequest用法介绍
前言: 传统的Web应用请求服务器返回的一般是是完整的HTML页面,这样往往就需要页面进行刷新操作,不仅耗时而且用户体验度也不好.最典型的代表就是form表单登录操作了.如果登录失败往往是跳转到原网页 ...