前言:基於Windows系統下的Kafka環境搭建;以及使用.NET 6環境進行開發簡單的生產者與消費者的演示。
一、環境部署
Kafka是使用Java語言和Scala語言開發的,所以需要有對應的Java環境,以及Scala語言環境。
Java環境配置,如果不清楚的,可以檢視鄙人的另一篇部落格:
https://www.cnblogs.com/weskynet/p/14852471.html
1、Scala環境安裝,需要先下載Scala語言包,下載地址:
https://www.scala-lang.org/download/scala2.html
要選擇Binaries版本的環境,否則需要自己編譯:
2、Kafka基於Zookeeper環境執行,zookeeper提供給kafka一系列的功能支援,所以還需要安裝Zookeeper有關的環境。下載zookeeper地址:
https://zookeeper.apache.org/releases.html#download
3、同樣,Zookeeper也需要下載帶bin 的連結,沒有帶bin的連結,可能是原始碼,需要自己編譯:
4、接下來是下載主角,Kafka了。下載地址:
https://kafka.apache.org/downloads.html
5、同樣需要選擇下載binary版本,然後根據scala的版本選擇對應的版本。
6、下載的三個安裝包,如圖所示:
7、先安裝Scala語言包環境:
8、驗證Scala語言包是否安裝成功:
控制檯視窗,輸入:scala -version
如果提示類似如下有關版本資訊,則代表安裝成功。
9、然後是安裝zookeeper環境。必須先啟動zookeeper,才可以使用kafka。
安裝zookeeper環境,先解壓下載的包,然後在解壓後的目錄下新增data資料夾
10、然後複製data資料夾的絕對路徑,備用。在conf資料夾下,編輯cfg檔案
11、在cfg檔案內,修改dataDir指定為上面新建的data資料夾的絕對路徑。注意路徑是斜槓/,如果要使用 \ 反斜杆,需要寫雙反斜槓 \\
12、也要更改cfg格式的檔名稱為 zoo.cfg 否則zookeeper無法識別配置檔案。Zoo.cfg檔案是zookeeper啟動時候自動關聯的預設配置檔名稱。
13、然後新建環境變數 ZOOKEEPER_HOME:
14、環境變數path新增:%ZOOKEEPER_HOME%\bin
15、啟動zookeeper,直接任意開啟控制檯,輸入 zkServer
16、如果都沒有報錯,一般是啟動成功了的。再次驗證下,可以任意開個控制檯,輸入JPS進行檢視,如下圖所示,有JPS、也有QuorumPeerMain,代表zookeeper啟動成功了。
17、Kafka環境安裝。先解壓,然後在解壓後的目錄下,新增logs資料夾
18、然後在Config資料夾下,修改 server.properties 檔案,修改 log.dirs 的值為 新增的logs資料夾的絕對路徑
19、進入到解壓後的kafka目錄下,在路徑欄輸入cmd,快速開啟當前資料夾下的控制檯視窗:
20、輸入命令:
.\bin\windows\kafka-server-start.bat .\config\server.properties
進行啟動Kafka服務:
21、啟動Kafka報錯了,可能是版本問題,kafka一般新版本對windows環境不友好,所以降級一下。此處我把kafka3.0降級為2.8:
22、此處我下載的版本為 2.13-2.8.1,各位大佬們可以按照自己意願選擇版本。可能2.x版本和3.x版本跨度比較大,所以3.0版本沒法玩。
23、然後是重複以上配置kafka有關的動作,修改有關配置檔案以及新增logs資料夾等。此處省略。
24、接著在低版本的kafka目錄下,快速進入當前解壓縮的目錄下,再次輸入有關命令嘗試一下:
25、沒有提示錯誤,根據提示資訊,代表是啟動成功了。任意開啟控制檯,再輸入JPS檢視下,可以看到Kafka,確認是啟動OK了。
26、然後是要一款Kafka視覺化工具,此處我選擇使用offset explorer (原來是叫kafka tools,如下載地址所示),下載地址:
https://www.kafkatool.com/download.html
27、安裝視覺化工具,預設可以一直下一步:
28、可以在安裝目錄下把可執行程式傳送到桌面快捷方式,方便開啟。
29、一些配置,包括名稱、kafka版本、埠號、服務地址等
30、連線以後的效果圖,如下。Topic是空的,接下來寫點程式碼。
二、程式碼開發與測試
31、新建類庫專案,當作kafka服務類庫
32、此處選擇標準庫2.1,用於可以給多種.net core版本使用,方便相容。
33、引用 Confluent.Kafka 包。
34、此處新增釋出服務類和訂閱服務類:
35、新增的生產者釋出服務方法程式碼如下:
程式碼:
/// <summary> /// Description: Kafka生產者釋出服務 /// CreateTime: 2022/1/21 19:35:27 /// Author: Wesky /// </summary> public class PublishService: IPublishService { public async Task PublishAsync<TMessage>(string broker, string topicName, TMessage message) where TMessage : class { var config = new ProducerConfig { BootstrapServers = broker, // kafka服務叢集,例如 "192.168.0.1:9092,192.168.0.2:9092" 或者單機 "192.168.0.1:9092" Acks = Acks.All, MessageSendMaxRetries = 3, // 傳送失敗重試的次數 }; using (var producer = new ProducerBuilder<string, string>(config).Build()) { try { string data = Newtonsoft.Json.JsonConvert.SerializeObject(message); var sendData = new Message<string, string> { Key = Guid.NewGuid().ToString("N"), Value = data}; var report = await producer.ProduceAsync(topicName, sendData); Console.WriteLine($"訊息 >>>>>: {data} \r\n傳送到:{report.TopicPartitionOffset}"); } catch (ProduceException<string, string> ex) { Console.WriteLine($"訊息傳送失敗>>>>>:\r\n Code= {ex.Error.Code} >>> \r\nError= {ex.Message}"); } } } }
36、新增的消費者接收服務方法程式碼如下:
程式碼:
/// <summary> /// Description: kafka 消費者訂閱服務 /// CreateTime: 2022/1/21 19:36:25 /// Author: Wesky /// </summary> public class SubscribeService: ISubscribeService { /// <summary> /// 消費者服務核心程式碼 /// </summary> /// <typeparam name="TMessage"></typeparam> /// <param name="config">消費者配置資訊</param> /// <param name="topics">主題集合</param> /// <param name="func"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task SubscribeAsync<TMessage>(ConsumerConfig config, IEnumerable<string> topics, Action<TMessage> func, CancellationToken cancellationToken) where TMessage : class { const int commitPeriod = 1; using (var consumer = new ConsumerBuilder<Ignore, string>(config) .SetErrorHandler((_, e) => { Console.WriteLine($"消費錯誤 >>>>>: {e.Reason}"); }) .SetStatisticsHandler((_, json) => { Console.WriteLine($"************************************************"); }) .SetPartitionsAssignedHandler((c, partitionList) => { string partitions = string.Join(", ", partitionList); Console.WriteLine($"分配的分割槽 >>>>> : {partitions}"); }) .SetPartitionsRevokedHandler((c, partitionList) => { string partitions = string.Join(", ", partitionList); Console.WriteLine($"回收的分割槽 >>>>> : {partitions}"); }) .Build()) { consumer.Subscribe(topics); try { while (true) { try { var consumeResult = consumer.Consume(cancellationToken); if (consumeResult.IsPartitionEOF) { continue; } if(consumeResult?.Offset % commitPeriod == 0){ try { var result = JsonConvert.DeserializeObject<TMessage>(consumeResult.Message?.Value); func(result); // 消費訊息 } catch (Exception ex) { Console.WriteLine($"消費業務處理失敗: {ex.Message}"); } try { consumer.Commit(consumeResult); // 手動提交 Console.WriteLine($"消費者消費完成,已提交 "); } catch (KafkaException e) { Console.WriteLine($"提交錯誤 >>>>> : {e.Error.Reason}"); } } } catch (ConsumeException e) { Console.WriteLine($"消費錯誤>>>>> : {e.Error.Reason}"); } } } catch (Exception e) { Console.WriteLine($"其他錯誤 >>>>> :{e.Message}"); consumer.Close(); } } await Task.CompletedTask; } }
37、並且提供對應的介面服務,用於開放給外部呼叫,或者提供依賴注入使用:
38、新建一個控制檯專案,用來當作消費者端的測試,並且新增一個方法,用來當作消費者接收到訊息以後的業務處理方法體。此處控制檯環境版本為.NET 6
39、消費客戶端程式碼如下。其中,BootstrapServers也可以提供叢集地址,例如 ip1:port,ip2:port…… 服務之間以半形逗號隔開。
40、再新增一個webapi專案,用來當作生產者的客戶端進行傳送資料。以及對kafka服務類部分進行依賴注入註冊,此處使用單例。該webapi此處使用.NET 6環境,帶有控制器的模式。
41、新增的控制器裡面,進行生產者的注入與實現。注意:topicName引數對應上邊的topic-wesky,通過主題繫結,否則消費者不認識就沒辦法消費到了。
控制器程式碼:
[Route("api/[controller]/[action]")] [ApiController] public class ProducerController : ControllerBase { IPublishService _service = null; public ProducerController(IPublishService publishService) { _service = publishService; } [HttpPost] public IActionResult SendMessage(string broker,string topicName,string message) { _service.PublishAsync(broker, topicName, message); return Ok(); } }
42、接下來是一些測試,如圖所示:
43、最後,使用視覺化管理工具Offset進行檢視,可以看到對應的主題。選中主題,可以設定資料型別,這裡我設定為字串,就可以檢視到對應的訊息內容了。如果沒有設定,預設是16進位制的資料。
44、檢視剛剛測試時候收發的訊息佇列裡面的資料,如下所示:
45、一些額外補充:
Kafka也是訊息佇列的一種,用於在高吞吐量場景下使用比較適合。如果是輕量級的,只需要用於削峰,可以使用RabbitMQ。
以上只是簡單的操作演示,至於要用得溜,觀眾朋友們可以自行補充所需的相關理論知識。
視覺化工具還有一款yahoo提供的開源的工具,叫kafka-manager,有興趣的大佬們可以自行玩玩,開源地址:
還有一款滴滴平臺做的開源的kafka運維管理平臺,有興趣的大佬們也可以自行了解,地址:
https://github.com/didi/LogiKM
以上就是該部落格的全部內容,感謝各位大佬們的觀看~