创建nsq镜像

两种方法:1自己创建镜像,2使用公共镜像。本文使用公共镜像,省事省心。

手动创建

这里不啰嗦了,下载nsqhttps://nsq.io/deployment/installing.html,然后创建镜像参考https://www.runoob.com/docker...

使用公共镜像nsqio/nsq

docker pull nsqio/nsq

创建容器

题外话

官方文档是这么启动的
服务

nsqlookupd

节点

nsqd --lookupd-tcp-address=127.0.0.1:4160

不了解的同学还以为是一个nsqd对应一个nsqlookupd,其实只要是服务节点类型的东西一般都是一个服务可以有多个节点的,反过来一样。

因此,我这里创建2个nsqlookupd服务和4个nsqd节点。每个节点都监听两个服务。

干活

创建docker-compose.yml文件,内容如下

version: "3.7"

services:
  nsqlookupd0:
    image: nsqio/nsq
    command: /nsqlookupd --broadcast-address=192.168.3.19 --tcp-address=:41600 --http-address=:41610
    ports:
      - "41600:41600"
      - "41610:41610"

  nsqlookupd1:
    image: nsqio/nsq
    command: /nsqlookupd --broadcast-address=192.168.3.19 --tcp-address=:41601 --http-address=:41611
    ports:
      - "41601:41601"
      - "41611:41611"

  nsqd0:
    image: nsqio/nsq
    command: /nsqd --broadcast-address=192.168.3.19 --tcp-address=:41500 --http-address=:41510 --lookupd-tcp-address=192.168.3.19:41600 --lookupd-tcp-address=192.168.3.19:41601
    depends_on:
      - nsqlookupd0
      - nsqlookupd1
    ports:
      - "41500:41500"
      - "41510:41510"
  nsqd1:
    image: nsqio/nsq
    command: /nsqd --broadcast-address=192.168.3.19 --tcp-address=:41501 --http-address=:41511 --lookupd-tcp-address=192.168.3.19:41600 --lookupd-tcp-address=192.168.3.19:41601
    depends_on:
      - nsqlookupd0
      - nsqlookupd1
    ports:
      - "41501:41501"
      - "41511:41511"
  nsqd2:
    image: nsqio/nsq
    command: /nsqd --broadcast-address=192.168.3.19 --tcp-address=:41502 --http-address=:41512 --lookupd-tcp-address=192.168.3.19:41600 --lookupd-tcp-address=192.168.3.19:41601
    depends_on:
      - nsqlookupd0
      - nsqlookupd1
    ports:
      - "41502:41502"
      - "41512:41512"
  nsqd3:
    image: nsqio/nsq
    command: /nsqd --broadcast-address=192.168.3.19 --tcp-address=:41503 --http-address=:41513 --lookupd-tcp-address=192.168.3.19:41600 --lookupd-tcp-address=192.168.3.19:41601
    depends_on:
      - nsqlookupd0
      - nsqlookupd1
    ports:
      - "41503:41503"
      - "41513:41513"
因为我是在一台电脑上跑上面定义的docker,所以改了nsq的默认端口

运行

docker-compose up -d

好了,现在2个服务4个节点都跑起来了,下面来验证一下

验证

在终端里运行nsqadmin

nsqadmin --lookupd-http-address=192.168.3.19:41610 --lookupd-http-address=192.168.3.19:41611
nsqadmin不需要在docker里运行,即使nsq服务运行上服务器上,也可以在本地跑nsqadmin,只要--lookupd-tcp-address指定服务地址就行。

发送些数据看看运行情况(golang)
producer.go

func main() {

    nsqAddress := "192.168.3.19:41501"

    config := nsq.NewConfig()
    
    producer, err := nsq.NewProducer(nsqAddress, config)
    if err != nil{
        fmt.Println(err)
    }

    for {
        err = producer.Publish("queue", []byte("测试的内容"))
        if err != nil {
            fmt.Printf("publish message failed, err:%v\n", err)
            continue
        }
        //每1秒发送一次
        time.Sleep(1*time.Second)
    }

}

consumer.go

// 消费者
type Consumer struct {
}

//处理消息
func (*Consumer) HandleMessage(msg *nsq.Message) error {
    fmt.Println("receive", msg.NSQDAddress, "message:", string(msg.Body))
    return nil
}

//初始化消费者
func initConsumer(topic string, channel string, address string) error {
    cfg := nsq.NewConfig()
    //最大并发数量
    cfg.MaxInFlight = 10
    //设置服务发现的轮询时间
    cfg.LookupdPollInterval = 15 * time.Second
    //新建一个消费者
    c, err := nsq.NewConsumer(topic, channel, cfg)
    if err != nil {
        return err
    }

    consumer := &Consumer{}
    c.AddHandler(consumer) // 添加消费者接口

    //建立NSQLookupd连接
    if err := c.ConnectToNSQLookupd(address); err != nil {
        return err
    }
    return nil
}

func main() {
    err := initConsumer("queue", "channel1", "192.168.3.19:41610")
    if err != nil {
        fmt.Println(err)
        return
    }
    c := make(chan os.Signal)
    signal.Notify(c, syscall.SIGINT)
    <-c
}

2020-03-25 at 5.46 PM.jpeg

在云服务器上测试记得设置安全规则
以阿里云为例:

授权策略 协议类型 端口范围 授权类型(全部) 授权对象 描述
允许 自定义 TCP 41500/41611 IPv4地址段访问 0.0.0.0/0 NSQ消息队列(测试)

Chiu
312 声望5 粉丝