一、說明
在現代微服務架構中,Kafka
作為訊息中介軟體被廣泛使用,而安全性則是其中的一個關鍵因素。在本篇文章中,我們將探討如何在 Spring Boot
應用中整合 Kafka
並使用 SCRAM
認證機制進行安全連線;並實現動態建立賬號、ACL 許可權、Topic,以及生產者和消費者等操作。
需要準備一個配置了 SCRAM 認證的 Kafka 環境,可參考《基於 SASL/SCRAM 讓 Kafka 實現動態授權認證》 進行部署。
二、新增依賴
在 Spring Boot
專案的 pom.xml
中新增 spring-kafka
依賴
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
三、配置 Kafka
在 application.yml
中配置 Kafka 的相關屬性,包括伺服器地址、認證資訊等。
spring:
kafka:
bootstrap-servers: localhost:9092
properties:
security.protocol: SASL_PLAINTEXT
sasl.mechanism: SCRAM-SHA-256
sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="your_username" password="your_password";
consumer:
group-id: test-consumer-group
auto-offset-reset: earliest
properties:
sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="test" password="test";
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
bootstrap-servers
Kafka 的叢集地址security.protocol
通訊協議指定啟用SASLsasl.mechanism
指定 SASL 使用的具體身份驗證機制sasl.jaas.config
指定認證模組的處理類以及 使用者名稱 和 密碼auto-offset-reset
指定偏移量的邏輯,earliest 代表新加入的消費者都是從頭開始消費
四、動態管理資源
4.1. 建立 KafkaAdminClient
KafkaAdminClient
用於管理 Kafka 資源(使用者、ACL、主題等)。以下是示例程式碼:
@Configuration
public class KafkaConfig {
@Bean
public KafkaAdminClient kafkaAdminClient(KafkaAdmin kafkaAdmin) {
return (KafkaAdminClient) KafkaAdminClient.create(kafkaAdmin.getConfigurationProperties());
}
}
4.2. 動態建立使用者和設定許可權
使用 Kafka AdminClient API
實現動態建立使用者和設定 ACL 許可權:
/**
* 建立使用者
*/
public void createUser(String userName, String password) throws ExecutionException, InterruptedException {
// 構造Scram認證機制資訊
ScramCredentialInfo info = new ScramCredentialInfo(ScramMechanism.SCRAM_SHA_256, 8192);
//使用者資訊
UserScramCredentialAlteration userScramCredentialAdd = new UserScramCredentialUpsertion(userName, info, password);
AlterUserScramCredentialsResult result = kafkaAdminClient.alterUserScramCredentials(List.of(userScramCredentialAdd));
result.all().get();
}
/**
* 配置使用者只讀許可權
*/
public void createAcl(String account, String topicName, String consumerGroup) {
AclBinding aclBindingTopic = genAclBinding(account, ResourceType.TOPIC, topicName, AclOperation.READ);
AclBinding aclBindingGroup = genAclBinding(account, ResourceType.GROUP, consumerGroup, AclOperation.READ);
kafkaAdminClient.createAcls(List.of(aclBindingTopic, aclBindingGroup));
}
4.3. 動態建立主題
public void createTopic(String topicName, int partitions, short replicationFactor) throws ExecutionException, InterruptedException {
NewTopic newTopic = new NewTopic(topicName, partitions, replicationFactor);
CreateTopicsResult result = kafkaAdminClient.createTopics(List.of(newTopic));
result.all().get();
}
五、生產者和消費者配置
5.1. 生產者配置
配置 Kafka 生產者,用於傳送訊息:
@Service
public class KafkaProducer {
private final KafkaTemplate<String, String> kafkaTemplate;
public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void sendMessage(String message) {
kafkaTemplate.send("test", message);
}
}
5.2. 消費者配置
使用 @KafkaListener
註解實現消費訊息方法:
@Service
public class KafkaConsumer {
@KafkaListener(topics = "test", groupId = "test-consumer-group")
public void consume(String message) {
System.out.println("Received message: " + message);
}
}
六、總結
透過以上步驟,我們成功地在 Spring Boot 應用中整合了 Kafka,並使用 SCRAM 認證機制進行安全連線;確保在生產環境中妥善管理使用者憑證,並根據需要調整 Kafka 的安全配置。
完整的樣例程式碼下載:
https://gitee.com/zlt2000/kafka-scram-demo