Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用主机上的golang访问docker中安装的kafka_Docker_Go_Apache Kafka - Fatal编程技术网

如何使用主机上的golang访问docker中安装的kafka

如何使用主机上的golang访问docker中安装的kafka,docker,go,apache-kafka,Docker,Go,Apache Kafka,我需要使用golang访问卡夫卡,所以我在docker中安装了一个卡夫卡和Zookeper 1.以下是kafka安装脚本: # pull images docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka # run kafka & zookepper docker run -d --name zookeeper -p 2181 -t wurstmeister/zookeeper docker run

我需要使用golang访问卡夫卡,所以我在docker中安装了一个卡夫卡和Zookeper

1.以下是kafka安装脚本:

# pull images
docker pull wurstmeister/zookeeper 
docker pull wurstmeister/kafka

# run kafka & zookepper
docker run -d --name zookeeper -p 2181 -t wurstmeister/zookeeper  
docker run --name kafka -e HOST_IP=localhost -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=1 -e ZK=zk -p 9092:9092 --link zookeeper:zk -t wurstmeister/kafka  

# enter container
docker exec -it ${CONTAINER ID} /bin/bash  
cd opt/kafka_2.11-0.10.1.1/ 

# make a tpoic
bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic mykafka 

# start a producer in terminal-1
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mykafka 

# start another terminal-2 and start a consumer
bin/kafka-console-consumer.sh --zookeeper zookeeper:2181 --topic mykafka --from-beginning 
当我在producer中键入一些消息时,消费者将立即得到它。 所以我认为卡夫卡很好用

2.现在我需要用golang创建一个消费者来访问kafka

这是我的golang演示代码:

import "github.com/bsm/sarama-cluster"
func Consumer(){
    // init (custom) config, enable errors and notifications
    config := cluster.NewConfig()
    config.Consumer.Return.Errors = true
    config.Group.Return.Notifications = true

    // init consumer
    brokers := []string{"192.168.9.100:9092"}
    topics := []string{"mykafka"}
    consumer, err := cluster.NewConsumer(brokers, "my-group-id", topics, config)
    if err != nil {
        panic(err)
    }
    defer consumer.Close()

    // trap SIGINT to trigger a shutdown.
    signals := make(chan os.Signal, 1)
    signal.Notify(signals, os.Interrupt)

    // consume messages, watch errors and notifications
    for {
        select {
        case msg, more := <-consumer.Messages():
            if more {
                fmt.Fprintf(os.Stdout, "%s/%d/%d\t%s\t%s\n", msg.Topic, msg.Partition, msg.Offset, msg.Key, msg.Value)
                consumer.MarkOffset(msg, "")    // mark message as processed
            }
        case err, more := <-consumer.Errors():
            if more {
                log.Printf("Error: %s\n", err.Error())
            }
        case ntf, more := <-consumer.Notifications():
            if more {
                log.Printf("Rebalanced: %+v\n", ntf)
            }
        case <-signals:
            return
    }
}
我在启动卡夫卡时使用了端口图,但在golang中无法访问它

有没有办法使用curl访问卡夫卡? 我试过:

curl http://192.168.99.10:9092
卡夫卡报告了一个错误:

kafka: client has run out of available brokers to talk to (Is your cluster reachable?)
[2017-08-02 06:39:15,232] WARN Unexpected error from /192.168.99.1; closing connection (org.apache.kafka.common.network.Selector)
org.apache.kafka.common.network.InvalidReceiveException: Invalid receive (size = 1195725856 larger than 104857600)
    at org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:95)
    at org.apache.kafka.common.network.NetworkReceive.readFrom(NetworkReceive.java:75)
    at org.apache.kafka.common.network.KafkaChannel.receive(KafkaChannel.java:203)
    at org.apache.kafka.common.network.KafkaChannel.read(KafkaChannel.java:167)
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:379)
    at org.apache.kafka.common.network.Selector.poll(Selector.java:326)
    at kafka.network.Processor.poll(SocketServer.scala:499)
    at kafka.network.Processor.run(SocketServer.scala:435)
    at java.lang.Thread.run(Thread.java:748)
顺便说一句:

我使用Windows7

dcoker机器的ip:192.168.99.100

这让我发疯了


有什么建议或解决办法吗?感谢

不确定,是否可以与卡夫卡一起使用curl。但是您可以使用kafka控制台消费者

kafka-console-consumer.bat --bootstrap-server 192.168.9.100:9092 --topic mykafka --from-beginning

不确定,是否可以与卡夫卡一起使用curl。但是您可以使用kafka控制台消费者

kafka-console-consumer.bat --bootstrap-server 192.168.9.100:9092 --topic mykafka --from-beginning
我找到了原因。 因为卡夫卡的设置不正确

这是服务器。属性:

############################# Socket Server Settings #############################

# The address the socket server listens on. It will get the value returned from 
# java.net.InetAddress.getCanonicalHostName() if not configured.
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092

# Hostname and port the broker will advertise to producers and consumers. If not set, 
# it uses the value for "listeners" if configured.  Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
#advertised.listeners=PLAINTEXT://your.host.name:9092
如果未设置
侦听器
,kafka将只接收来自
java.net.InetAddress.getCanonicalHostName()
的请求,这意味着
localhost

所以我应该设置:

listeners = PLAINTEXT://0.0.0.0:9092
这将起作用

我已经找到了原因。 因为卡夫卡的设置不正确

这是服务器。属性:

############################# Socket Server Settings #############################

# The address the socket server listens on. It will get the value returned from 
# java.net.InetAddress.getCanonicalHostName() if not configured.
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092

# Hostname and port the broker will advertise to producers and consumers. If not set, 
# it uses the value for "listeners" if configured.  Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
#advertised.listeners=PLAINTEXT://your.host.name:9092
如果未设置
侦听器
,kafka将只接收来自
java.net.InetAddress.getCanonicalHostName()
的请求,这意味着
localhost

所以我应该设置:

listeners = PLAINTEXT://0.0.0.0:9092

这将起作用

如果您想创建一个消费者来收听卡夫卡的主题,让我们试试这种方式。 我使用了教程中的合流卡夫卡:

这是main.go文件中的代码:

import (
    "fmt"
    "gopkg.in/confluentinc/confluent-kafka-go.v1/kafka"
)

func main() {

    c, err := kafka.NewConsumer(&kafka.ConfigMap{
        "bootstrap.servers": "localhost",
        "group.id":          "myGroup",
        "auto.offset.reset": "earliest",
    })

    if err != nil {
        panic(err)
    }

    c.SubscribeTopics([]string{"myTopic", "^aRegex.*[Tt]opic"}, nil)

    for {
        msg, err := c.ReadMessage(-1)
        if err == nil {
            fmt.Printf("Message on %s: %s\n", msg.TopicPartition, string(msg.Value))
        } else {
            // The client will automatically try to recover from all errors.
            fmt.Printf("Consumer error: %v (%v)\n", err, msg)
        }
    }

    c.Close()
}
如果您使用docker构建:请按照此注释添加合适的包

对于基于Debian和Ubuntu的发行版,请从标准存储库或使用Confluent的Deb存储库安装librdkafka dev

对于基于Redhat的发行版,请使用Confluent的YUM存储库安装librdkafka-devel

对于MacOS X,请从自制中安装librdkafka。如果尚未安装pkg配置,则可能还需要brew安装pkg配置。brew安装librdkafka pkg config

对于Alpine:apk添加librdkafka dev pkgconf Windows上不支持合流卡夫卡围棋

对于Alpine,请记住安装社区版本,因为它无法使用max版本1.1.0安装librdkafka(不使用Alpine社区版本)


祝你好运

如果您想创建一个消费者来聆听卡夫卡的主题,让我们试试这种方式。 我使用了教程中的合流卡夫卡:

这是main.go文件中的代码:

import (
    "fmt"
    "gopkg.in/confluentinc/confluent-kafka-go.v1/kafka"
)

func main() {

    c, err := kafka.NewConsumer(&kafka.ConfigMap{
        "bootstrap.servers": "localhost",
        "group.id":          "myGroup",
        "auto.offset.reset": "earliest",
    })

    if err != nil {
        panic(err)
    }

    c.SubscribeTopics([]string{"myTopic", "^aRegex.*[Tt]opic"}, nil)

    for {
        msg, err := c.ReadMessage(-1)
        if err == nil {
            fmt.Printf("Message on %s: %s\n", msg.TopicPartition, string(msg.Value))
        } else {
            // The client will automatically try to recover from all errors.
            fmt.Printf("Consumer error: %v (%v)\n", err, msg)
        }
    }

    c.Close()
}
如果您使用docker构建:请按照此注释添加合适的包

对于基于Debian和Ubuntu的发行版,请从标准存储库或使用Confluent的Deb存储库安装librdkafka dev

对于基于Redhat的发行版,请使用Confluent的YUM存储库安装librdkafka-devel

对于MacOS X,请从自制中安装librdkafka。如果尚未安装pkg配置,则可能还需要brew安装pkg配置。brew安装librdkafka pkg config

对于Alpine:apk添加librdkafka dev pkgconf Windows上不支持合流卡夫卡围棋

对于Alpine,请记住安装社区版本,因为它无法使用max版本1.1.0安装librdkafka(不使用Alpine社区版本)


祝你好运

您的主机\u IP=localhost错误。使用它的原因是指定实际IP。因此,指定192.168.99.100 IPHOST\u IP=localhost是错误的。使用它的原因是指定实际IP。因此,指定192.168.99.100 IPCurl将不起作用。它没有使用http,而是使用Kafka wire协议。Curl将无法工作。它没有使用http,它使用的是Kafka wire协议。我在alpine上遇到问题,您如何选择librdkafka社区版本?Hi@District,我在alpine上安装librdkafka版本1.1.0时遇到问题,我通过以下方式解决了这个问题:运行apk update运行apk add build base librdkafka dev librdkafka--update cache--repository祝你好运!!谢谢你的回复,我决定用它工作很好,不会有太多问题,我也会试试。我在Docker上使用dep安装它时遇到了一些麻烦。感谢您的回复我对alpine有问题,您如何选择librdkafka社区版本?您好@Amber,我在alpine安装librdkafka 1.1.0版时遇到了问题,我通过以下方式解决了这个问题:运行apk update运行apk add build base librdkafka dev librdkafka--update cache--repository祝您好运!!谢谢你的回复,我决定用它工作很好,不会有太多问题,我也会试试。我在Docker上使用dep安装它时遇到了一些麻烦。谢谢你的回复