小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
项目从0到1,没有什么基础建设,前段时间刚整合完nacos配置中心,nacos对于区分环境变量各种配置真是太友好了,之前可能写死在代码里面每次发布修改配置,对于开发和运维同学来说都是巨大的工作量,公司的kafka集群,Hbase集群通过vip区分不同的环境。结合nacos动态配置,简化配置的工作量,让开发同学专注与业务和工程性能上面来。
版本选择
其实官网也介绍了很多除了SpringBoot其他方式对于版本选择的方式。
SpringBoot很简单直接引入Pom文件依赖。
<!--SpringKafka依赖-->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
Nacos 配置
# kafka配置
spring.kafka.bootstrap-servers=127.0.0.1:9092
# producer 配置
spring.kafka.producer.retries=0
# 每次批量发送消息的数量,produce积累到一定数据,一次发送
spring.kafka.producer.batch-size=16384
# produce积累数据一次发送,缓存大小达到buffer.memory就发送数据
spring.kafka.producer.buffer-memory=33554432
# ack机制:all, -1, 0, 1
spring.kafka.producer.acks=1
# 指定消息key和消息体的编解码方式
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
# consumer
# 指定默认消费者group id --> 由于在kafka中,同一组中的consumer不会读取到同一个消息,依靠groud.id设置组名
spring.kafka.consumer.group-id=dzlog-smp-tiny-url-info-group
# earliest和latest才有效,如果earliest重新0开始读取,如果是latest从logfile的offset读取。一般情况下我们都是设置earliest
spring.kafka.consumer.auto-offset-reset=earliest
# enable.auto.commit:true --> 设置自动提交offset
spring.kafka.consumer.enable-auto-commit=true
#如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
spring.kafka.consumer.auto-commit-interval=100
# 指定消息key和消息体的编解码方式
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
Kafka Producer 生产者
用kafkaTemplate生产的就很简单了,和引用SpringRedisTemplate一样直接@Autoware进来就可以了。
@Component
public class TestProducer {
@Resource
private KafkaTemplate kafkaTemplate;
public void send(String msg) {
kafkaTemplate.send("test_topic", msg);
}
}
Kafka Consumer
@Component
public class Consumer {
@KafkaListener(topics = "test_topic")
public void onMessage1(String message) {
// 处理
System.out.println(message);
}
}
单元测试
@SpringBootTest
@ActiveProfiles("dev")
public class TestProducerTest {
@Autowired
private TestProducer testProducer;
@Test
public void send() {
for (int i = 0; i < 30; i++) {
RecordDTO recordDTO = new RecordDTO();
recordDTO.setTinyCode("SX03")
.setTinyUrl("z.dz.cn")
.setPhoneNo(18795969912L)
.setLongUrl("www.baidu.com")
.setTaskId(100L)
.setRecordId(101L);
tinyUrlInfoProducer.send(JSON.toJSONString(recordDTO));
}
}
}