简单介绍
- lookupd
- nsqd
- nsqadmin
docker 部署
- 拉取 NSQ 镜像
> docker pull nsqio/nsq #拉取nsq镜像
> docker images #查看nsq镜像
- 运行lookupd
> sudo docker run --name lookupd -p 4160:4160 -p 4161:4161 -d nsqio/nsq /nsqlookupd
- 节点部署 nsqd
> sudo docker run --name nsqd -p 4150:4150 -p 4151:4151 -d nsqio/nsq /nsqd --broadcast-address=192.168.0.101 --lookupd-tcp-address=192.168.0.101:4160
192.168.0.101 为服务器ip地址
可以通过 ifconfig 查看
- 运行nsqadmin
> sudo docker run --name nsqadmin -p 4171:4171 -d nsqio/nsq /nsqadmin --lookupd-http-address=192.168.0.101:4161
将 nsqadmin 绑定到 nsqd 中
- 访问 nsqadmin
浏览器打开:192.168.0.101
- 测试
> curl -d 't1' 'http://192.168.0.101:4151/pub?topic=p1'
port 4151 为 nsqd
go 代码
- producer
package main
import (
"log"
"github.com/nsqio/go-nsq"
"io/ioutil"
"strconv"
)
var nullLogger = log.New(ioutil.Discard, "", log.LstdFlags)
func sendMsg(message string){
//init default config
config := nsq.NewConfig()
w, _ := nsq.NewProducer("192.168.0.101:4150", config)
err := w.Ping()
if err != nil {
//192.168.2.117:4150,192.168.2.68:4150
log.Fatalln("error ping 192.168.0.101:4150", err)
// switch the second nsq. You can use nginx or HAProxy for HA.
w, _ = nsq.NewProducer("192.168.0.101:4150", config)
}
w.SetLogger(nullLogger, nsq.LogLevelInfo)
err2 := w.Publish("a-test", []byte(message))
if err2 != nil {
log.Panic("Could not connect nsq")
}
w.Stop()
}
func main() {
for i := 0; i < 2; i ++ {
sendMsg("msg index "+ strconv.Itoa(i + 10000))
}
}
- consumer
package main
import (
"log"
"github.com/nsqio/go-nsq"
"fmt"
)
func doSimpleConsumerTask(){
config := nsq.NewConfig()
q, _ := nsq.NewConsumer("a-test", "ch", config)
q.AddHandler(nsq.HandlerFunc(func(message *nsq.Message) error {
log.Printf("message: %v", string(message.Body))
fmt.Printf(" 业务处理 ")
message.Finish()
return nil
}))
// lookupAddr := []string {
// "192.168.0.101:4161",
// "192.168.234.36:4161",
// "192.168.234.39:4161",
// }
err := q.ConnectToNSQLookupd("192.168.0.101:4161")
if err != nil {
log.Panic("Could not connect")
}
<-q.StopChan
stats := q.Stats()
fmt.Sprintf("message received %d, finished %d", stats.MessagesReceived, stats.MessagesFinished)
}
func main(){
doSimpleConsumerTask()
}