关于docker-composer安装nsq的问题

Docker/容器
399
0
0
2022-09-23

最近涉及到nsq的项目,之前没有接触过。于是找了下docker-composer的配置文件,一键安装,十分酸爽。一分钟搞定。但是后面的问题让我整了一下午…

贴上docker-composer的配置文件

原文地址:www.jianshu.com/p/a26f4b8c9542

services: 
  nsqlookupd: 
    image: nsqio/nsq 
    command: /nsqlookupd 
    networks: 
      - nsq-network 
    hostname: nsqlookupd 
    ports: 
      - "4161:4161" 
      - "4160:4160" 
  nsqd: 
    image: nsqio/nsq 
    command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 
    depends_on: 
      - nsqlookupd 
    hostname: nsqd 
    networks: 
      - nsq-network 
    ports: 
      - "4151:4151" 
      - "4150:4150" 
  nsqadmin: 
    image: nsqio/nsq 
    command: /nsqadmin --lookupd-http-address=nsqlookupd:4161 
    depends_on: 
      - nsqlookupd 
    hostname: nsqadmin 
    ports: 
      - "4171:4171" 
    networks: 
      - nsq-network

networks: 
  nsq-network: 
    driver: bridge

新建producer.go,comsumer.go文件,操作消息发送与接收

producer.go (原文地址:blog.csdn.net/qq_38871968/article/...)

//生产者
package main

import (
    "bufio" 
    "fmt" 
    "os" 
    "strings"

    "github.com/nsqio/go-nsq"
)

// NSQ Producer Demo

var producer *nsq.Producer

// 初始化生产者
func initProducer(str string) (err error) {
    config := nsq.NewConfig()
    producer, err = nsq.NewProducer(str, config)
    if err != nil {
        fmt.Printf("create producer failed, err:%v\n", err)
        return err
    }
    return nil
}

func main() {
    nsqAddress := "127.0.0.1:4150"
    err := initProducer(nsqAddress)
    if err != nil {
        fmt.Printf("init producer failed, err:%v\n", err)
        return
    }

    reader := bufio.NewReader(os.Stdin) // 从标准输入读取 
    for {
        data, err := reader.ReadString('\n')
        if err != nil {
            fmt.Printf("read string from stdin failed, err:%v\n", err)
            continue
        }
        data = strings.TrimSpace(data)
        if strings.ToUpper(data) == "Q" { // 输入Q退出 
            break
        }
        // 向 'topic_demo' publish 数据
        err = producer.Publish("topic_demo", []byte(data))
        if err != nil {
            fmt.Printf("publish msg to nsq failed, err:%v\n", err)
            continue
        }
    }
}
原文链接:https://blog.csdn.net/qq_38871968/article/details/105430698

comsumer.go

//消费者
package main

import (
    "fmt" 
    "os" 
    "os/signal" 
    "syscall" 
    "time"

    "github.com/nsqio/go-nsq"
)

// NSQ Consumer Demo

// MyHandler 是一个消费者类型
type MyHandler struct {
    Title string
}

// HandleMessage 是需要实现的处理消息的方法
func (m *MyHandler) HandleMessage(msg *nsq.Message) (err error) {
    fmt.Printf("%s recv from %v, msg:%v\n", m.Title, msg.NSQDAddress, string(msg.Body))
    return
}

// 初始化消费者
func initConsumer(topic string, channel string, address string) (err error) {
    config := nsq.NewConfig()
    config.LookupdPollInterval = 15 * time.Second
    c, err := nsq.NewConsumer(topic, channel, config)
    if err != nil {
        fmt.Printf("create consumer failed, err:%v\n", err)
        return
    }
    consumer := &MyHandler{
        Title: "沙河1号",
    }
    c.AddHandler(consumer)

    // if err := c.ConnectToNSQD(address); err != nil { // 直接连NSQD 
    if err := c.ConnectToNSQLookupd(address); err != nil { // 通过lookupd查询 
        return err
    }
    return nil

}

func main() {
    err := initConsumer("topic_demo", "first", "127.0.0.1:4161")
    if err != nil {
        fmt.Printf("init consumer failed, err:%v\n", err)
        return
    }
    c := make(chan os.Signal)        // 定义一个信号的通道
    signal.Notify(c, syscall.SIGINT) // 转发键盘中断信号到c
    <-c                              // 阻塞
}
————————————————
原文链接:https://blog.csdn.net/qq_38871968/article/details/105430698

结果生产者可以正常运行,消费者却报错了。

关于docker-composer安装nsq的问题

解决方案:修改host映射nsqd即可

关于docker-composer安装nsq的问题

问题:求解答下yaml文件的配置怎样修改才能避免这个错误,网上看了下博主的yaml文件,虽然可以保证执行成功,但是管理端会出现这个问题。有点无解….

关于docker-composer安装nsq的问题