KafkaProducer总是为JavaAPI中的模式注册表选择localhost:8081

KafkaProducer总是为JavaAPI中的模式注册表选择localhost:8081,java,apache-kafka,kafka-producer-api,confluent-schema-registry,Java,Apache Kafka,Kafka Producer Api,Confluent Schema Registry,KafkaProducer无法拾取其属性中定义的schema.registry.url 正如我们在下面的屏幕截图中所看到的,模式注册表url是一个虚拟url // variable which is being debugged private KafkaProducer<K, V> kafkaFullAckProducer; 上述两个证明是在一次节目中拍摄的。正如我们可以清楚地看到的那样,eclipse调试期间的schmearegistry url提示是123.1.1.1,但在我

KafkaProducer无法拾取其属性中定义的
schema.registry.url

正如我们在下面的屏幕截图中所看到的,模式注册表url是一个虚拟url

// variable which is being debugged
private KafkaProducer<K, V> kafkaFullAckProducer;
上述两个证明是在一次节目中拍摄的。正如我们可以清楚地看到的那样,eclipse调试期间的schmearegistry url提示是123.1.1.1,但在我的失败日志中是这样的

因此,在我的其他环境中,我无法运行其他分配的schema.registry.url,因为它总是使用

代码托管在一台机器上,而模式注册表/代理位于另一台机器上

注册表是在开发环境中启动的。/confluent start

我的制作人代码:

private KafkaProducer<K, V> kafkaFullAckProducer;
MonitoringConfig config;

public void produceWithFullAck(String brokerTopic, V genericRecord) throws Exception {
    // key is null
    ProducerRecord<K, V> record = new ProducerRecord<K, V>(brokerTopic, genericRecord);
    try {
        Future<RecordMetadata> futureHandle = this.kafkaFullAckProducer.send(record, (metadata, exception) -> {

            if (metadata != null) {
                log.info("Monitoring - Sent record(key=" + record.key() + " value=" + record.value()
                        + " meta(partition=" + metadata.partition() + " offset=" + metadata.offset() + ")");
            }
        });
        RecordMetadata recordMetadata = futureHandle.get();

    } catch (Exception e) {
        if (e.getCause() != null)
            log.error("Monitoring - " + e.getCause().toString());
        throw new RuntimeException(e.getMessage(), e.getCause());
    } finally {
        // initializer.getKafkaProducer().close();
    }
}

@PostConstruct
private void initialize() {
    Properties props = new Properties();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, config.getBrokerList());
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class.getName());
    // kafkaProps.put("value.serializer",
    // "org.apache.kafka.common.serialization.ByteArraySerializer");
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, CustomAvroSerializer.class.getName());
    props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, Constants.COMPRESSION_TYPE_CONFIG);
    props.put(ProducerConfig.RETRIES_CONFIG, config.getProducerRetryCount());
    props.put("schema.registry.url", config.getSchemaRegistryUrl()); // the url is coming right here 
    props.put("acks", "all");
    kafkaFullAckProducer = new KafkaProducer<K, V>(props);
}
application.properties:

kafka.zookeeper.connect=http://localhost:2181
kafka.broker.list=http://localhost:9092
consumer.timeout.ms=1000
producer.retry.count=1
schema.registry.url=http://123.1.1.1:8082
自定义avro序列化程序是我需要弃用的东西,并使用前面讨论的方法,但我确信这不是问题的原因

以下是主机的详细信息: 主机1:有这个Java服务和Kafka连接,错误日志就在这里。
主机2:具有Kafka、Schema Registry和Zookeper。

您使用的是自定义序列化程序,作为
序列化程序
实现的一部分,您必须定义接受映射的
配置
方法

在该方法中,我猜您定义了一个字段,但没有从配置映射中提取在生产者级别添加的url属性,因此它将默认使用其他本地主机地址


汇合代码需要单步执行四个类,但您将看到序列化程序实现,然后查看单独的配置类以及抽象序列化程序和SerDe父类。在中,我曾指出,我认为您不需要实际使用自定义Avro序列化程序,因为您似乎在重做AbstractKafkaSerializer类所做的事情,您正在使用自定义序列化程序,并且作为
序列化程序
实现的一部分,您必须定义一个接受映射的
configure
方法

在该方法中,我猜您定义了一个字段,但没有从配置映射中提取在生产者级别添加的url属性,因此它将默认使用其他本地主机地址


汇合代码需要单步执行四个类,但您将看到序列化程序实现,然后查看单独的配置类以及抽象序列化程序和SerDe父类。从中,我曾指出,我认为您不需要实际使用自定义Avro序列化程序,因为您似乎正在重做AbstractKafkaSerializer类所做的事情

一切都在哪里运行?同一台机器?不同的机器?你是怎么开始注册的?你能显示它的配置文件吗?请帮助我们使用,包括您的producer codeSure,重现问题,但我的观点是,例如,在Confluent序列化程序中,它将注册表默认为localhost。这就是为什么我想看看你的。。。如果您想弃用自己的,那么现在正是一个好时机,这样您以前的帖子就不会显示
schema.registry.url
实际从属性中取出并用于定义
CachedSchemaRegistryClient
类的位置。。。换句话说,您的属性有字符串,当然,这显然是有效的,但这还不足以覆盖注册表clientAgain的默认行为。请编辑您的问题以包括整个序列化程序类,不要链接到单独的帖子。我个人觉得在一个主题中实现单个架构更容易。JSON有效负载对于网络流量优化来说是浪费。如果是度量,不确定除了应用程序/度量名称、供以后筛选的可选标记列表、时间戳和实际度量值之外,您还需要什么?同一台机器?不同的机器?你是怎么开始注册的?你能显示它的配置文件吗?请帮助我们使用,包括您的producer codeSure,重现问题,但我的观点是,例如,在Confluent序列化程序中,它将注册表默认为localhost。这就是为什么我想看看你的。。。如果您想弃用自己的,那么现在正是一个好时机,这样您以前的帖子就不会显示
schema.registry.url
实际从属性中取出并用于定义
CachedSchemaRegistryClient
类的位置。。。换句话说,您的属性有字符串,当然,这显然是有效的,但这还不足以覆盖注册表clientAgain的默认行为。请编辑您的问题以包括整个序列化程序类,不要链接到单独的帖子。我个人觉得在一个主题中实现单个架构更容易。JSON有效负载对于网络流量优化来说是浪费。如果是度量,则不确定除了应用程序/度量名称、供以后筛选的可选标记列表、时间戳和实际度量值之外,还需要什么。我只是在等待访问自定义avro序列化程序的代码。应该是这样。惊人的调试技巧。我只是在等待访问自定义avro序列化程序的代码。应该是这样。
    @Value("${kafka.zookeeper.connect}")
    private String zookeeperConnect;

    @Value("${kafka.broker.list}")
    private String brokerList;

    @Value("${consumer.timeout.ms:1000}")
    private String consumerTimeout;

    @Value("${producer.retry.count:1}")
    private String producerRetryCount;

    @Value("${schema.registry.url}")
    private String schemaRegistryUrl;

    @Value("${consumer.enable:false}")
    private boolean isConsumerEnabled;

    @Value("${consumer.count.thread}")
    private int totalConsumerThread;
}
kafka.zookeeper.connect=http://localhost:2181
kafka.broker.list=http://localhost:9092
consumer.timeout.ms=1000
producer.retry.count=1
schema.registry.url=http://123.1.1.1:8082