本章节阐述micro消息订阅和发布相关内容

阅读本文前你可能需要进行如下知识储备

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

支持手势触摸,可左右滑动的日历插件

你必须知道的18个互联网业务模型

golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布的更多相关文章

  1. golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

    micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  2. golang微服务框架go-micro 入门笔记2.4 go-micro service解读

    本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  3. 【GoLang】golang 微服务框架 go-kit

    golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ...

  4. golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

    micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...

  5. [goa]golang微服务框架学习--安装使用

      当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码, ...

  6. golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...

  7. 【GoLang】golang 微服务框架 介绍

    原文如下: rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架,基于Golang net/rpc实现. 谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括 ...

  8. [goa]golang微服务框架学习(二)-- 代码自动生成

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  9. [goa]golang微服务框架学习(三)-- 使用swagger-ui展示API

    既然goa框架自动生成啦swagger-json文件,那么如何用swagger-ui展示出来呢? 这里分三步: 1.下载swagger-ui的web代码 2.添加swagger.json 和 swag ...

随机推荐

  1. javaScript 判断为false

    JavaScript把null.undefined.0.NaN和空字符串''视为false,其他值一概视为true

  2. windows自动修复失败,无法启动

    Windows10操作系统于2015年7月29日正式发布,此后,win10也就成了新上市的笔记本电脑或者台式机电脑的预装操作系统!win10系统给我们带了全新的体验,当然也带来了一定的烦恼!就拿win ...

  3. python 获取文件本身的绝对路径

    tester.py: import os print (os.path.dirname(__file__)) print (os.path.abspath(__file__)) print (os.p ...

  4. Python全栈工程师(Python3 所有基础内容 0-0)

    转发:https://www.cnblogs.com/ParisGabriel/p/9388030.html statements  语句print   输出quit()  退出exit() 退出ct ...

  5. 刷题记录:[HarekazeCTF2019]encode_and_encode

    目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...

  6. 一个半吊子PM的反思

    故事之源 2019年3月,也就是2016级计算机学院的大三时,软件工程这门课程由选修转为专业必修课,而七个葫芦娃共聚罗杰老师的课堂,组成葫芦娃不想写代码小分队.面临着继承往届项目.完成指定项目和自选项 ...

  7. JavaScript初探系列(六)——函数

    一.概述 (一)函数的声明 JavaScript 有三种声明函数的方法. (1)function 命令 function命令声明的代码区块,就是一个函数.function命令后面是函数名,函数名后面是 ...

  8. Spring Cloud 学习--Hystrix应用

    上一篇介绍了Hystrix基本功能和单独使用的方式,今天继续学习如何将Hystrix融入SpringCloud组件中去. 在Ribbon上使用熔断器 在 pom.xml 文件中引入 hystrix 的 ...

  9. MyBatis(十):Mybatis 几种批量操作的对比

    本章主要讲解几种批量处理的用法及对别,批量处理一般用法包含以下几种: 1)普通foreach处理(没循环一次执行一次与mysql服务器交互操作),实际上也是采用的ExecutorType.SIMPLE ...

  10. flutter、rn、uni-app比较

    前言 每当我们评估新技术时要问的第一个问题就是“它会给我们的业务和客户带来哪些价值?”,工程师们很容易对闪闪发光的新事物着迷,却经常会忽略这些新事物其实可能对我们的客户没有任何好处,反而只会让现有的工 ...