因为,这是我使用架构注册表的第一个应用程序,所以,我对@EnableSchemaRegistryClient感到有些困惑,因为当我从主类中删除此批注时,生产者仍会与架构注册表交互并自动发布架构,我的使用者在使用主题名称正确获取模式方面也能正常工作 那么,@ EnableSchemaRegistryClient和@EnableSchemaRegistryServer会做什么?
我正在使用confluentinc / cp-schema-registry docker映像进行模式注册表和io.confluent.kafka.serializers.KafkaAvroSerializer和io.confluent.kafka.serializers.KafkaAvroDeserializer进行序列化和反序列化
这是我的生产者的application.yml
spring:
cloud:
stream:
default:
producer:
useNativeEncoding: true
bindings:
output:
destination: inventory
content-type: application/*+avro
kafka:
binder:
producer-properties:
key.serializer: org.apache.kafka.common.serialization.StringSerializer
value.serializer: io.confluent.kafka.serializers.KafkaAvroSerializer
schema.registry.url: http://localhost:8081
请在可能有用的某些情况下尝试详细说明此注释
编辑1:我的发现-
当我看到@EnableSchemaRegistryClient的代码时,它将调用配置类SchemaRegistryClientConfiguration,其中DefaultSchemaRegistryClient bean为ConditionalOnMissingBean。 从那以后,我正在使用KafkaAvroSerializer和Deserializer,它们默认情况下会注册kafkaSerializers的CachedSchemaRegistryClient,因此这意味着DefaultSchemaRegistryClient在kafkaAvroSerializers的情况下将永远不会注册,直到我们将其创建为主要bean
请提出可能产生的影响
SchemaRegistryConfiguration.class
@Bean
@ConditionalOnMissingBean
public SchemaRegistryClient schemaRegistryClient() {
DefaultSchemaRegistryClient defaultSchemaRegistryClient = new DefaultSchemaRegistryClient();
if (StringUtils.hasText(this.schemaRegistryClientProperties.getEndpoint())) {
defaultSchemaRegistryClient
.setEndpoint(this.schemaRegistryClientProperties.getEndpoint());
}
SchemaRegistryClient client = (this.schemaRegistryClientProperties.isCached())
? new CachingRegistryClient(defaultSchemaRegistryClient)
: defaultSchemaRegistryClient;
return client;
}
这意味着SchemaRegistryclient取决于您使用的序列化程序的类型?