整合:Spring Boot AWS MSK

YC
程式愛好者
Published in
6 min readDec 10, 2020

2020年底了,最近做了一次 Spring Boot 與 AWS MSK 的整合,當中的坑想讓大家能了解一下。另外相關的資訊真的少的可憐,希望能拋磚引玉一下。

進入正文,先用好 MSK 的部分。

雖然可以透過 aws cli 來部置 msk,但是如果情況允許,可以更直接的使用 Web 來進行快速部置。

1. 建立叢集,請選用自訂設定建立、打上叢集名稱、使用 MSK 預設組態。

2. 因為 MSK 必需要建立在 VPC 上的,所以若未有 VPC 請先按照上面的官方文件的第一、第二步先完成喔。
VPC 可以說是建立 MSK 最重要的一步,如果已經有會用到 Kafka 的 instance 存在,非常建議使用與該 intance 相同的 VPC,可以減少使用 VPC Peering Connection 的處理!

3. 代理程式可以先選最少資源使用量的,之後再增加代理程式的數目。

儲存體同理。

4. 加密可按需求選擇,但若沒有加密需求,建議只選統文字流量。下面的Spring Boot 例子會選用加密的方式開發,亦相對複雜一點。

5. 剩下的步驟可個人選填,然後點選建立叢集後就等吧,需要一點時間才能建好。若還沒建立 instance,現在就是個好時機先去把 instance 建好喔。

6. 當叢集建立完成後,我假設 instance 跟 msk 都在同一個 VPC 底下,這時我們可以看看官方文件的第五步,試著把 kafka Topic 建立起來。若然成功你就會看到Created topic XXXXXXXXX.

1
官方文件的第四步

當時我有遇到一個 Connection Time out 的問題,這問題出現的原因在於官方文件的第四步,設定 VPC 的安全群組上。我們需要把你會用來連上 MSK 的 instance 的安全群組加到 VPC 安全群組的傳入規則中,並設定為允許所有流量,這樣你的 client 才被允許連上 MSK 。

7. 當你確定建立 Topic 成功,恭喜你已經成功大半了!現在就來看 Spring Boot 部分的部置。

1.Spring Boot 先加上 Kafka 的 Dependency:

2. Kafka 的配置可以在 application.yml 中完成,為了簡化,我們直接用 yml 來完成所需要的 configuration。以下是我的範例結構:

有幾點要注意的:
1. security.protocol 若你叢集是選用加密,那要寫上 SSL,若選擇用純文字,那就要使用 PLAINTEXT

2. ssl.trust-store-location 若是選用加密就請加上。這是是你的 truststor.jks 檔位置,我們可以透過找到自已使用的 JDK 資料夾位置,把 cacerts 這個檔案複制出來並重新命名為afka.client.truststore.jks

cp /usr/lib/jvm/<JDKFolder>/jre/lib/security/cacerts /tmp/kafka.client.truststore.jks

如果今天是使用 Elastic Beanstalk 來進行部置,那我建議把 jks 檔放到你的 Resource 文件夾中,使用 classpath: 來讓 Kafka 讀取。這是跟 auto-scaling 有關,因為 Elastic Beanstalk 不會能你在 instance 中產生出來的文件一同複制到另一台 instance 中的。

如果是使用 EC2,那可以按照你有沒有AMI /auto-scaling 等設定來決定你希望從哪邊獲得 jks 檔,但是你總要想辨法獲得 jks 檔。

3. bootstrap-servers 請放你的 MSK BrokerString。這可以在你的 MSK 叢集管理頁,檢視用戶端資訊中獲的。

你會拿到一大串字串,請直接複制貼上到 yml 的producer 與 consumer 中的 bootstrap-servers 後即可。

4. group-id 可以打你任意需要的字串。

5. 在 Controller 與 Service 中分別寫上 Kafka 的生產與消費邏輯。

Kafka Producer Controller
Consumer Service

要接收 Kafka 的消息,我們可以使用 @KafkaListener,後面的 topics 就是當時你創立的 topics 名稱囉。

6. 試著上傳到 instance 然後跑起來吧!

如果你覺得我的文章幫助到你,希望你也可以為文章拍手,分別 Follow 我的個人頁與程式愛好者出版,按讚我們的粉絲頁喔,支持我們推出更多更好的內容創作!

--

--

YC
程式愛好者

提供更精確的技術內容為目標,另創立「程式愛好者」專頁。首席軟體工程師,專研後端技術、物件導向、軟體架構。