前言
我的 nsq 使用 docker-compose 部署在云服务器上,但是我的程序在本地机器想连通云服务器上的nsq。
云服务器上的 docker-compose.yml 文件如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
version: '3' services: nsqlookupd: image: nsqio/nsq command: /nsqlookupd ports: - "4160:4160" - "4161:4161" nsqd: image: nsqio/nsq command: /nsqd -data-path=/data --lookupd-tcp-address=nsqlookupd:4160 --broadcast-address=nsqd depends_on: - nsqlookupd volumes: - /nsqd-1-data:/data ports: - "4150:4150" - "4151:4151" nsqadmin: image: nsqio/nsq command: /nsqadmin --lookupd-http-address=nsqlookupd:4161 depends_on: - nsqlookupd ports: - "4171:4171" |
本地的 Golang 代码如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package main import ( "fmt" "time" "github.com/xhyonline/xutil/mq" ) func main() { c := mq.New(0, mq.Config{ PubHost: "121.5.62.93", // nsqd PubTCP: "4150", PubHTTP: "4151", SubHost: "121.5.62.93", // nsqlookupd SubTCP: "4160", // 订阅会走 nsqlookupd 去订阅消息 SubHTTP: "4161", }) // 创建主题 err := c.CreateTopic("my-topic") if err != nil { panic(err) } // 将主题内容拷贝三份,分别给三个消费者 c.Sub("my-topic", "first", func(c mq.Context) error { fmt.Println(c.String()) return nil }) c.Sub("my-topic", "second", func(c mq.Context) error { fmt.Println(c.String()) return nil }) c.Sub("my-topic", "third", func(c mq.Context) error { fmt.Println(c.String()) return nil }) // 推送数据 err = c.Pub("my-topic", "你好世界") if err != nil { panic(err) } time.Sleep(time.Second * 100) } |
当我运行Go程序时,好巧不巧,在订阅数据处直接报了一个网络连接错误
从上面的报错中,我很明显的看到了创建主题是成功的,但是订阅主题失败了。
原因分析
我们创建主题时,直连的是我云服务器的公网 IP ,也就是 nsqd 节点所在的机器。因此有公网 IP 的存在,创建主题是成功的。
但是订阅数据时,其内部逻辑是先访问 nsqlookupd 询问 nsqd 所在节点的主机地址 ,再而通过 nsqllookupd 注册中心把 nsqd 节点所在的 host 返回给我的本地主机。
最后我本地主机二次通过该 host 去获取订阅数据。
请注意重点来了!!!!
由于我用的是 dokcer-compose 部署,因此返回的 nsqd 所在的 host 直接就是 nsqd 。然而我的本地又没有 DNS 解析,所以就造成了这个戏剧性的场面。如下图所示:
最终解决方案有三种:
一、本地调试,修改自己的 hosts ,把 nsqd 指向所在服务的 IP 地址。
二、或者修改docker-compose.yml文件,将广播地址直接改成真实的公网地址。(推荐用这种)
三、或者将应用程序直添加进docker-compose所在的服务集群中,这样就不会再因为dns无法解析而导致无法连接服务的问题。如下图所示
© 著作权归作者所有
文章评论(0)