go笔记 (认识与操作NSQ)
之前知乎上在go有关学习经验中看到有人推荐可以通过学习NSQ来学习go语言,并且还能顺道了解消息队列的设计,可谓一举两得。所以去了解了下NSQ,发现截止本文编写时间,NSQ在github上已经累积了17.7K 的star,发现比大家经常用到的kafka,rabbitmq的star还要高。汗,看来自己真是孤陋寡闻了。
就从基本使用开始入手吧
1.克隆源代码,并切换到dev分支
https://github.com/nsqio/nsq.git
这儿使用go mod管理 记得装好依赖
2.应用包app
本文主要介绍安装使用,所以主要看app包中
将会用到这四个包,其中nsqlookupd 个人理解为连接消息生产端与消息服务端的中间程序。nsqd个人理解为接收消息推送的组件,nsq_to_ xx个人理解为消费消息的组件,nsqadmin则顾名思义为管理程序,可以用来查看message,topic,channel等情况。
所以我们依次启动nsqqlookupd,nsqd,nsq_to_http,nsqadmin。
2.1 启动nsqlookupd
可以看到控制打印
通过打印我们可以知道其监听了两个端口,http 4161,tcp 4160 。
2.2启动NSQD
即消息推送组件
由于其依赖nsqlooupd,所以启动参数记得加上 --lookupd-tcp-address=127.0.0.1:4160 即2.1中监听的tcp端口
启动成功后控制台应该打印如上,这儿注意也开启了 http端口 4151,tcp端口 4150
2.3启动消费组件
这儿为了方便就直接用nsq_to_http组件
启动必要参数只有三个,一个是消费topic 我们使用nsq_my ,一个是连接我们的中间组件即nsqlookupd的地址,一个是消费的webapi接口,
--topic nsq_my --lookupd-http-address 127.0.0.1:4161 --get http://localhost:8888/msg?msg=%s
这儿注意--get即代表get请求,也可以使用post请求,即--post 但是使用post请求注意加上 --content-type
http://localhost:8888/msg?msg=%s即自己的api服务,这儿可以建一个web服务
package main import ( "github.com/gin-gonic/gin" "web_application/controller/animal" "web_application/controller/nsq" ) func main() { ctx :=gin.Default() ctx.GET("/msg",nsq.Consumer) ctx.Run(":8888") }
package nsq import ( "github.com/gin-gonic/gin" "log" ) func Consumer(con *gin.Context) { msg := con.Query("msg") log.Printf("成功获取到消息: %s \n",msg) }
内容很简单,就是消费并打印即可,监听端口为8888,拦截/msg 的get请求地址(记得启动web服务)
启动nsq_to_http成功后控制台会打印如下
这儿会报错,提示没有nsq_my这个topic 这是因为我们还没创建
测试
按照官方测试用例我们可以测试消息发送, 像topic 为nsq_my发送一条消息this is the fisrt message 如果这个topic不存在则NSQ会自动创建
curl -d 'this is the fisrt message' 'http://127.0.0.1:4151/pub?topic=nsq_my' 记住这儿的4151即nsqd组件监听的http端口
会发现我们创建的web服务已经成功消费到了数据
到此,NSQ的消息推送与消费就已经成功了
2.4 nsqadmin
之前提到了nsqadmin,这是nsq官方出的web界面管理器,方便我们查看消息消费情况,启动方式也很简单。找到nsqadmin包下的main方法并启动
不过既然是管理器,其肯定也要在启动参数前连接到我们的nsqlookupd中间件才行 --lookupd-http-address=127.0.0.1:4161
启动成功后控制台打印会如下
可以看到其监听了4171的http端口,所以我们直接访问localhost:4171,可以看到我们刚才创建的topic,其他两个是我之前创建的。
点进去后可以看到消息消费情况
到此nsq的基本操作就结束了,可以看到主要的组件有nsqlookupd,nsqd,nsq_to_xx,分别对应中间件,生产组件,消费组件。
原文地址:https://www.cnblogs.com/hetutu-5238/p/12932447.html
- WCF技术剖析之三十一:WCF事务编程[上篇]
- 学习SpringMVC——你们要的REST风格的CRUD来了
- 并发中的同步--WCF并发体系的同步机制实现
- WCF 技术剖析之三十三:你是否了解WCF事务框架体系内部的工作机制?[下篇]
- 学习SpringMVC——从HelloWorld开始
- 小程序年底重磅更新,小游戏上线,最强入口也来了!
- 学习SpringMVC——如何获取请求参数
- 谈谈关于MVP模式中V-P交互问题
- 学习Spring——两个你熟悉的不能再熟悉的场景使用
- 学习Spring——依赖注入
- 机会真的多吗?
- 浅析Hadoop大数据分析与应用
- WCF技术剖析之三十三:你是否了解WCF事务框架体系内部的工作机制?[上篇]
- Java豆瓣电影爬虫——小爬虫成长记(附源码)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php-fpm超时时间设置request_terminate_timeout资源问题分析
- laravel框架添加数据,显示数据,返回成功值的方法
- PHP的静态方法与普通方法用法实例分析
- 解决PHP使用CURL发送GET请求时传递参数的问题
- php弹出提示框的是实例写法
- laravel 时间格式转时间戳的例子
- php新建文件的方法实例
- 解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
- PHP迭代器和生成器用法实例分析
- php中关于换行的实例写法
- laravel 获取当前url的别名方法
- php中文语义分析实现方法示例
- laravel 中某一字段自增、自减的例子
- php统计数组不同元素的个数的实例方法
- PHP实现单条sql执行多个数据的insert语句方法