場景說明
今天接到的一個任務是做公網接入阿里雲的kafka。不推薦通過公網訪問。
由於通過公網問,需要配置爲客戶端接入配置SASL_SSL的鑑權,設置證書,協議,訪問模式的賬號密碼等參數。
自己的應用採用的是spring boot + spring kafka來接入kafka。
因此,在配置上需要做一些適配和調整。
官方文檔
https://help.aliyun.com/knowledge_detail/99958.html
原生的配置,主要有幾個點:
- 在控制檯下載ssl證書 ---- kafka.client.truststore.jks,放在機器的某個路徑上,不要跟着應用打包
- 構建 kafka_client_jaas.conf,它包含着登錄模式,登錄用賬號密碼等的信息,賬號密碼信息在控制檯上能找到。將應用啓動參數java.security.auth.login.config設置爲kafka_client_jaas.conf的絕對路徑,可以通過代碼或者啓動參數設置。
注意 : spring boot配置中可以不需要的這個kafka_client_jaas.conf,它通過讀取application.yaml中的配置生成了一個,設置到應用中,具體見下。
- 根證書是有密碼,阿里雲kafka證書統一的解析密碼爲KafkaOnsClient。
- 接入協議爲SASL_SSL, 鑑權方式爲PLAIN。
配置適配
由於採用spring boot + spring kafka來接入kafka,配置的時候需要做一下適配調整。
spring boot讀取kafka屬性的類爲org.springframework.boot.autoconfigure.kafka.KafkaProperties,其中也包含有SSL, JAAS的配置項,這些是我們需要配置的。
當然也有一些額外的配置,需要通過通用的properties給設置進去,讓spring讀取到,轉換成kafka-client的配置。
SSL
主要是設置證書文件的絕對路徑和證書解密密碼。
這裏是分別都爲producer, consumer設置ssl的參數
JAAS
主要是配置屬性,然後構建一個類似kafka_client_jaas.conf的文件,設置到應用中,最終的實質也仍然是將生成的文件路徑設置給java.security.auth.login.config這個應用變量。
spring:
kafka:
jaas:
enabled: true
loginModule: org.apache.kafka.common.security.plain.PlainLoginModule
controlFlag: REQUIRED
options:
username: aliyun-kafka-username
password: aliyun-kafka-password
...
其中各個屬性的值可以對照阿里雲官方接入文檔中kafka_client_jaas.conf文件內容進行配置
額外參數
通過producer, consumer的properties屬性可以添加額外自定義的屬性,這裏主要設置了
- sasl.mechanism: PLAIN
- security.protocol: SASL_SSL
配置例子
spring:
kafka:
bootstrap-servers: kafka-server1, kafka-server2, kafka-server3
jaas:
enabled: true
loginModule: org.apache.kafka.common.security.plain.PlainLoginModule
options:
username: aliyun-kafka-username
password: aliyun-kafka-password
consumer:
ssl:
truststorePassword: KafkaOnsClient
truststoreLocation: file:/etc/kafka/kafka.client.truststore.jks
properties:
sasl.mechanism: PLAIN
security.protocol: SASL_SSL
group-id: consumer-group
max-poll-records: 2
producer:
ssl:
truststorePassword: KafkaOnsClient
truststoreLocation: file:/etc/kafka/kafka.client.truststore.jks
retries: 3
acks: 1
compression-type: lz4
buffer-memory: 33554432
batch-size: 51200
properties:
send.buffer.bytes: 262144
sasl.mechanism: PLAIN
security.protocol: SASL_SSL