go-nsq为啥tls也要用4150端口

149 阅读2分钟

简介

nsq为go语言实现的一个消息队列框架,主要包括四个部分:

  • nsqd 消息处理服务
  • nsqlookupd 拓扑信息服务
  • nsqadmin web查看状态服务
  • utilities 测试工具

image.png

对于golang的官方客户端,用的是go-nsq image.png

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都用不了

image.png

客户端

  • 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过程,坑就在这里。

image.png

把端口设置成4150,同时把config.TlsV1 = true和InsecureSkipVerify: true,这样才能成功触发tls过程,真的是非人类的设计。相当于复用了tcp端口4150,先尝试tcp格式交互,不行了再触发tls交互,可能是有历史包袱的原因吧。

参考