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

时间:2017-08-03 01:19:54

标签: docker go apache-kafka

我需要使用golang来访问kafka,所以我安装了一个kafka&在码头工人的动物园。

1.其中有kafka安装脚本:

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
    }
}

当我在制作人中键入一些消息时,消费者会立即得到它。 所以我认为卡夫卡工作正常

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

这是我的golang演示代码:

kafka: client has run out of available brokers to talk to (Is your cluster reachable?)

}

实际上这个演示代码是从github repo的演示中复制的:array_unique

运行代码时,出现错误:

curl http://192.168.99.10:9092

我在启动kafka时确实使用了端口映射,但是在golang中无法访问它

有没有办法使用curl访问kafka? 我试过了:

[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)

和kafka报告错误:

C:\Users\myUser\Desktop\CompareScripts\runCompareScript.ps1

顺便说一句:

我使用的是Windows 7

dcoker machine的ip:192.168.99.100

它让我发疯了

有一些建议或解决方案吗?欣赏!!!

3 个答案:

答案 0 :(得分:1)

如果您想创建一个消费者来收听Kafka的主题,让我们尝试一下。 我使用了以下教程中的confluent-kafka-go:https://github.com/confluentinc/confluent-kafka-go

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

导入(     “ 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,请从Homebrew安装librdkafka。如果尚未安装,则可能还需要brew install pkg-config。 brew install librdkafka pkg-config。

对于高山:apk添加librdkafka-dev pkgconf Windows不支持confluent-kafka-go。

  

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

祝你好运!

答案 1 :(得分:0)

不确定,是否可以使用curl和kafka。但是你可以使用kafka-console-consumer。

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

答案 2 :(得分:0)

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

这是server.properties

############################# 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

如果未设置listeners,则kafka只会收到来自java.net.InetAddress.getCanonicalHostName()的请求,这意味着localhost

所以我shuld set:

listeners = PLAINTEXT://0.0.0.0:9092

这将起作用