简介
nsq为go语言实现的一个消息队列框架,主要包括四个部分:
- nsqd 消息处理服务
- nsqlookupd 拓扑信息服务
- nsqadmin web查看状态服务
- utilities 测试工具
对于golang的官方客户端,用的是go-nsq
go-nsq
生产者官方示例
很简单,就是用的默认配置,然后使用的nsqd监听的tcp端口4150
// Instantiate a producer.
config := nsq.NewConfig()
producer, err := nsq.NewProducer("127.0.0.1:4150", config)
if err != nil {
log.Fatal(err)
}
messageBody := []byte("hello")
topicName := "topic"
// Synchronously publish a single message to the specified topic.
// Messages can also be sent asynchronously and/or in batches.
err = producer.Publish(topicName, messageBody)
if err != nil {
log.Fatal(err)
}
// Gracefully stop the producer when appropriate (e.g. before shutting down the service)
producer.Stop()
tls适配
服务端
- 生成证书
openssl req -x509 -newkey rsa:2048 -keyout nsq_key.pem -out nsq_cert.pem -days 365 -nodes
- 启动命令增加证书参数
-tls-key ./nsq_key.pem -tls-cert ./nsq_cert.pem
- --tls-required这个可以不设置,这样tcp、http、https都可以用;否则tcp和http都用不了
客户端
- curl方式(此时端口是4152)
[root@MANAGER ~]# curl -k 'https://192.168.11.116:4152/info'
{"version":"1.2.1","broadcast_address":"MANAGER","hostname":"MANAGER","http_port":4151,"tcp_port":4150,"start_time":1720684979}
- go-nsq方式(此时端口端是4150)
package main
import (
"crypto/tls"
"log"
"github.com/nsqio/go-nsq"
)
func main() {
// 配置TLS
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
}
config := nsq.NewConfig()
config.TlsV1 = true
config.TlsConfig = tlsConfig
producer, err := nsq.NewProducer("192.168.11.116:4150", config)
if err != nil {
log.Fatalf("无法创建NSQ生产者: %v", err)
}
// 发布消息
message := []byte("这是一个测试消息")
topic := "ZguardDevInterfaceLogtopic"
err = producer.Publish(topic, message)
if err != nil {
log.Fatalf("无法发布消息: %v", err)
}
log.Println("消息已发布到NSQ")
producer.Stop()
}
一开始把端口设置成了https的端口4152,结果就是失败,直接发送的数据包,nsqd直接reset了,不会触发tls过程,坑就在这里。
把端口设置成4150,同时把config.TlsV1 = true和InsecureSkipVerify: true,这样才能成功触发tls过程,真的是非人类的设计。相当于复用了tcp端口4150,先尝试tcp格式交互,不行了再触发tls交互,可能是有历史包袱的原因吧。