0

我测试用一个源和一个接收器服务的样本春云流应用(Ubuntu的Linux机器上运行)。我所有的服务都是码头集装箱的,我想用卡夫卡作为邮件经纪人。卡夫卡经纪人无法Dockerized春云流服务连接到饲养员

下面的docker-compose.yml的相关部分:

zookeeper: 
    image: confluent/zookeeper 
    container_name: zookeeper 
    ports: 
     - "2181:2181" 


    kafka: 
    image: wurstmeister/kafka:0.9.0.0-1 
    container_name: kafka 
    ports: 
     - "9092:9092" 
    links: 
     - zookeeper:zk 
    environment: 
     - KAFKA_ADVERTISED_HOST_NAME=192.168.33.101 
     - KAFKA_ADVERTISED_PORT=9092 
     - KAFKA_DELETE_TOPIC_ENABLE=true 
     - KAFKA_LOG_RETENTION_HOURS=1 
     - KAFKA_MESSAGE_MAX_BYTES=10000000 
     - KAFKA_REPLICA_FETCH_MAX_BYTES=10000000 
     - KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS=60000 
     - KAFKA_NUM_PARTITIONS=2 
     - KAFKA_DELETE_RETENTION_MS=1000 

    . 
    . 
    . 

    # not shown: eureka service registry, spring cloud config service, etc. 

    myapp-service-test-source: 
    container_name: myapp-service-test-source 
    image: myapp-h2020/myapp-service-test-source:0.0.1 
    environment: 
     SERVICE_REGISTRY_HOST: 192.168.33.101 
     SERVICE_REGISTRY_PORT: 8761 
    ports: 
     - 8081:8080 

    . 
    . 
    . 

这里的application.ymlservice-test-source服务相关的部分:

spring: 
    cloud: 
    stream: 
     defaultBinder: kafka 
     bindings: 
     output: 
      destination: messages 
      content-type: application/json 
     kafka: 
     binder: 
      brokers: ${SERVICE_REGISTRY_HOST:192.168.33.101} 
      zkNodes: ${SERVICE_REGISTRY_HOST:192.168.33.101} 
      defaultZkPort: 2181 
      defaultBrokerPort: 9092 

的问题如下,如果我启动docker-compose以上,在test-source容器日志我注意到,该服务无法连接到动物园管理员,给人一种重复一套拒绝连接错误,并以使服务终止的ZkTimeoutException完成(见下文)。

奇怪的事实是,如果不是将我的源码(和汇)测试服务作为码头容器运行,我通过maven mvn spring-boot:run <etc...>将它们作为jar文件运行,这些服务可以正常工作,并且能够通过kafka交换邮件。 (请注意,卡夫卡,动物园管理员等仍在作为码头集装箱运行)。

. 
. 
. 

*** THE FOLLOWING REPEATED n TIMES *** 
2017-02-14 14:40:09.164 INFO 1 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 
2017-02-14 14:40:09.166 WARN 1 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect 

java.net.ConnectException: Connection refused 
     at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.8.0_111] 
     at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[na:1.8.0_111] 
     at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361) ~[zookeeper-3.4.6.jar!/:3.4.6-1569965] 
     at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081) ~[zookeeper-3.4.6.jar!/:3.4.6-1569965] 


. 
. 
. 

java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) 
     at java.lang.Thread.run(Thread.java:745) 
     Caused by: org.springframework.context.ApplicationContextException: Failed to start bean 'outputBindingLifecycle'; nested exception is org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeout: 10000 

任何想法可能是什么问题?

编辑:

我发现,在“罐子”执行日志的test-source服务尝试连接通过IP 127.0.0.1到动物园管理员,这可从下剪断日志中可以看出:

2017-02-15 14:24:04.159 INFO 10348 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 
2017-02-15 14:24:04.159 INFO 10348 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 
2017-02-15 14:24:04.178 INFO 10348 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Socket connection established to localhost/127.0.0.1:2181, initiating session 
2017-02-15 14:24:04.201 INFO 10348 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x15a421fd9ec000a, negotiated timeout = 10000 
2017-02-15 14:24:05.870 INFO 10348 --- [   main] org.apache.zookeeper.ZooKeeper   : Initiating client connection, connectString=localhost:2181 sessionTimeout=6000 [email protected] 
2017-02-15 14:24:05.882 INFO 10348 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error) 
2017-02-15 14:24:05.883 INFO 10348 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn   : Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session 

这就解释了为什么一切工作的罐子执行,但不是泊坞窗之一(动物园管理员集装箱出口的2181端口的主机,所以它的可见为localhost直接在主机上运行时,服务过程),但没有按”解决问题米:显然,弹簧云流卡夫卡配置忽略属性spring.cloud.stream.kafka.binder.zkNodes作为设定在application.yml(注意,如果我从服务记录此类环境变量的值,我看到的192.168.33.101我硬编码有用于调试目的的正确的值) 。

+0

这肯定忽略属性设置:我试图把一些垃圾如价值,它确实继续工作......(当然,在非码头版本上)。我也尝试将属性从'application.yml'移动到'bootstrap.yml',但是和以前一样... – chrx

+0

这个问题的标题很搞笑! – benPearce

+0

你能解释一下吗? – chrx

回答

1

您已设置defaultBinder是rabbit试图使用卡夫卡粘结剂配置。您的应用程序的类路径中是否有rabbitkafka联编程序?在这种情况下,您可以启用here

+0

你是对的,我注意到错误之后编写帖子并更改属性文件的文本,然后再次执行我的测试,使用正确的设置但没有任何更改;我只是忘了更新问题的文本,现在我会做。 – chrx

0

饲养员:

图像:wurstmeister /饲养员

container_name: 'zookeeper' 

ports: 
    - 2181:2181 

-------------------- - 卡夫卡--------------------------------

卡夫卡:

image: wurstmeister/kafka 
container_name: 'kafka' 
environment: 
    - KAFKA_ADVERTISED_HOST_NAME=kafka 
    - KAFKA_ADVERTISED_PORT=9092 
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 
    - KAFKA_CREATE_TOPICS=kafka_docker_topic:1:1 
ports: 
    - 9092:9092 
depends_on: 
    - zookeeper 

春:

概况:开发

云:

流:

defaultBinder:卡夫卡

kafka: 

    binder: 

     brokers: kafka  # i added brokers and zkNodes property 

     zkNodes: zookeeper # 

     bindings: 

     input: 

     destination: message 

     content-type: application/json