springboot项目连接虚拟机kafka服务器,消息发送、接收问题

错误信息:Group coordinator promote.localdomain:9092 (id: 2147483647 rack: null) is unavailable or invalid, will attempt rediscovery
2018-10-29 14:56:52.496  INFO 33656 --- [ntainer#0-0-C-1] o.a.k.c.c.internals.AbstractCoordinator  : [Consumer clientId=consumer-1, groupId=test] Discovered group coordinator promote.localdomain:9092 (id: 2147483647 rack: null)

本人开发环境是window10+idea+springboot,而kafka服务器是搭建在虚拟机(Ubuntu17)中的,启动服务后,这边启动springboot项目无法连接到服务器,解决的思路主要是分两步。

【tips】:有时候连接有问题,但是不会打印详细错误信息,比较好的做法是在springboot配置错误信息级别为debug

(1)项目访问kafka服务器时会根据hostname,因此在window本地的hosts文件中,需要配置ip hostname,其中ip是虚拟机的ip地址,hostname即为虚拟机的主机名。

(2)在kafka的服务器目录kafka/kafka_2.12-2.0.0/config/server

### 测试环境中的Kafka消息发送接收 为了在Spring Boot测试环境中有效地模拟Kafka消息发送接收,推荐的方法是利用嵌入式的Kafka服务器。这种方式允许开发者在一个隔离的环境下运行完整的端到端测试而无需依赖外部服务实例。通过`spring-kafka-test`库可以方便地实现这一点。 #### 使用Embedded Kafka进行单元测试 引入必要的依赖项以便能够使用内嵌Kafka功能: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <scope>test</scope> </dependency> ``` 定义一个配置类来启动嵌入式Kafka broker并设置相应的监听器容器工厂和其他组件[^1]。 ```java @TestConfiguration public class EmbeddedKafkaConfig { @Value("${embedded.kafka.brokers}") private String embeddedKafkaBrokers; @Bean public Map<String, Object> consumerConfigs() { Map<String, Object> props = new HashMap<>(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, embeddedKafkaBrokers); // 添加其他消费者配置... return props; } @Bean public ConsumerFactory<String, String> consumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } } ``` 编写具体的测试案例以验证消息传递逻辑的工作情况。下面是一个简单的例子展示如何发送一条消息并通过监听器接收到它[^4]。 ```java @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT) @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) @EmbeddedKafka(partitions = 1, topics = {"reminder_topic"}) class KafkaIntegrationTest { @Autowired private KafkaTemplate<String, String> kafkaTemplate; @LocalServerPort private int port; @Test void testSendMessageAndReceive() throws Exception { RestTemplate restTemplate = new RestTemplate(); // 发送POST请求触发消息生产者行为 ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost:" + port + "/kafka/normal/testMessage", null, String.class); assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); // 验证消息被成功消费 ListenableFuture<ConsumerRecord<String, String>> future = KafkaTestUtils.getSingleRecord(consumerFactory(), "reminder_topic"); ConsumerRecord<String, String> record = future.get(30, TimeUnit.SECONDS); assertEquals("testMessage", record.value()); } private ConsumerFactory<String, String> consumerFactory(){ Map<String, Object> configs = new HashMap<>(); configs.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, embeddedKafka.getBrokersAsString()); return new DefaultKafkaConsumerFactory<>(configs); } } ``` 上述代码片段展示了如何结合RESTful API调用来激活消息生产和随后的消息消费过程。这有助于确保整个流程按预期工作,并且可以在本地开发机器上快速迭代而不必担心影响实际的服务部署。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值