创建nsq镜像
两种方法:1自己创建镜像,2使用公共镜像。本文使用公共镜像,省事省心。
手动创建
这里不啰嗦了,下载nsq
https://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
}
在云服务器上测试记得设置安全规则
以阿里云为例:
授权策略 协议类型 端口范围 授权类型(全部) 授权对象 描述 允许 自定义 TCP 41500/41611 IPv4地址段访问 0.0.0.0/0 NSQ消息队列(测试)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。