GoからDocker NSQへ接続する

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

現在、"Go言語によるWebアプリケーション開発"を手を動かしながら読んでいます。

chapter5.3まで完了したんだけど、書籍と違ってて少しハマったところをメモしておきます。


MongoDBの接続について

mgo.Dial("localhost")

書籍ではID/PASS指定なしで接続しているんだけど、現在のMongoDBはデフォルトではID/PASSを指定しないとコレクションの読み書きが出来ない(接続は出来るんだけど、読み書きしようとするとダメ)ようなので、認証を渡して接続する必要があります。

mongoInfo := &mgo.DialInfo{
  Addrs:    []string{"localhost"},
  Username: "root",
  Password: "example",
}
db, err = mgo.DialWithInfo(mongoInfo)


Goから使用するNSQドライバについて

書籍では

$ go get github.com/bitly/go-nsq
go: github.com/bitly/go-nsq@v1.0.8: parsing go.mod: unexpected module path "github.com/nsqio/go-nsq"
go: error loading module requirements

を利用するよう案内があるんだけど、インストールしようとするとlatest v1.0.8のfindはできるんだけど、何故か有効なモジュールパスではないと叱られます。

多分、GitHubでのリポジトリがbitlyからnsqioに変更されてるらしくてnsqioからgo getしてきた。

$ go get github.com/nsqio/go-nsq
go: finding github.com/nsqio/go-nsq v1.0.8
go: finding github.com/golang/snappy v0.0.1
go: downloading github.com/nsqio/go-nsq v1.0.8
go: downloading github.com/golang/snappy v0.0.1

何気に結構ハマった(^_^;)


NSQのdocker-compose.yaml

これは書籍の間違いではなく、僕がDockerでNSQを構築してハマったことです。

pub, err := nsq.NewProducer("localhost:4150", nsq.NewConfig())
pub.Publish("topicname", []byte("topicdata"))

このようにgo-nsqから接続しようとすると、以下のエラーが出て接続できなかった。

2020/07/06 15:59:13 INF    1 (localhost:4150) connecting to nsqd
2020/07/06 15:59:13 ERR    1 (localhost:4150) error connecting to nsqd - dial tcp [::1]:4150: connect: connection refused

うーん。ファイアーウォールで弾いてるっぽいようなメッセージなんだよねー。

docker-compose.yamlは NSQ Docs 1.2.0 - Docker のページから拝借してきた。


しばらく悩んでて、何気にdocker ps打ったら解決した(笑)

    ports:
      - "4150"
      - "4151"

フォワードポートの記述がされてないから、ローカルポートは適当なの使ってるだけだった笑

出来上がりのdocker-compose.yaml mongodb含む これで無事接続できました(^_^)

version: '3'
services:
  nsqlookupd:
    image: nsqio/nsq
    command: /nsqlookupd
    ports:
      - "4160:4160"
      - "4161:4161"
  nsqd:
    image: nsqio/nsq
    command: sh -c "/nsqd --lookupd-tcp-address=nsqlookupd:4160 && --broadcast-address=nsqlookupd"
    depends_on:
      - nsqlookupd
    ports:
      - "4150:4150"
      - "4151:4151"
  nsqadmin:
    image: nsqio/nsq
    command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
    depends_on:
      - nsqlookupd  
    ports:
      - "4171:4171"
  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - 27017:27017

ちゃんちゃん