Kafka Streams+SpringBoot之探索:將一個流轉換到另外一個流 - mydeveloperplanet
為了從主題中讀取無限制的資料流,我們需要建立一個小型應用程式,以傳送無限制的資料流。我們模擬一條Tweet流,在Tweet末尾恰好有一個標籤。每秒都會在該主題上釋出一條訊息。Tweets始終包含相同的訊息(Lorem ipsum…),主題標籤是從5個主題標籤的固定列表中隨機選擇的。
@RestController public class KafkaProducerController { private static final String loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " + "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco " + "laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit " + "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa " + "qui officia deserunt mollit anim id est laborum."; private static final String[] hashTags = {"latin", "italy", "roman", "caesar", "cicero"}; private Random randomNumber = new Random(); private String randomMessage; @RequestMapping("/sendMessages/") public void sendMessages() { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("acks", "all"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); try { while (true) { // Every second send a message try { Thread.sleep(1000); } catch (InterruptedException e) {} randomMessage = loremIpsum + " #" + hashTags[randomNumber.nextInt(hashTags.length)]; producer.send(new ProducerRecord<String, String>("my-kafka-streams-topic", null, randomMessage)); } } finally { producer.close(); } } } |
變數loremIpsum是固定訊息,變數hashTags是主題標籤的固定列表。在該sendMessages方法中,我們首先定義一些Kafka屬性。在第一個try塊中,無休止的迴圈每秒向主題傳送一條帶有隨機主題標籤(變數randomMessage)的訊息。my-kafka-streams-topic。我們只為該主題提供一個值,而不是一個鍵,因為該主題中的鍵與我們無關。
最後要做的是在Kafka中建立主題。我們透過Kafka的bin目錄中的kafka-topics.sh 指令碼來執行此操作 :
$ ./kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my-kafka-streams-topic |
可以透過呼叫URL http:// localhost:8081 / sendMessages /來啟動資料流。
現在我們已經做好了所有準備,現在該開始第一個流媒體示例了。我們將從中讀取Tweets my-kafka-streams-topic,使用主題標籤過濾Tweets latin並將其釋出到主題my-kafka-streams-out1。
我們建立一個Spring Boot應用程式(mykafkaprocessingplanet多模組Maven專案中的模組),並將以下依賴項新增到pom中:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-streams</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.3.0</version> </dependency> </dependencies> |
可以看出,除了kafka-streams依賴之外,我們還必須新增kafka-clients依賴。如果不新增最後一個依賴項,則在建立時會遇到以下錯誤KStream:
java.lang.NoSuchMethodError: org.apache.kafka.clients.admin.AdminClientConfig |
與生產者一樣,我們確保可以在呼叫URL之後開始處理。這URL的KafkaProcessingController:
private KafkaStreams streams1; @RequestMapping("/startProcessing1/") public void startProcessing1() { Properties props = new Properties(); props.put(StreamsConfig.APPLICATION_ID_CONFIG, "processor1"); props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass()); final StreamsBuilder builder = new StreamsBuilder(); //魔術關鍵行 builder.stream("my-kafka-streams-topic").filter((key, value) -> ((String) value).endsWith("latin")).to("my-kafka-streams-out1"); final Topology topology = builder.build(); streams1 = new KafkaStreams(topology, props); streams1.start(); } |
與往常一樣,首先我們需要定義屬性以連線到主題。注意,我們沒有覆蓋預設鍵Serializer / Deserializer,因為我們沒有為主題中的訊息提供鍵。注意魔術關鍵行,我們從my-kafka-streams-topic中讀取流,過濾以結“latin”結尾的訊息,並將過濾後的訊息傳送到主題my-kafka-streams-out1
最後要做的是建立輸出主題:
$ ./kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my-kafka-streams-out1 |
是時候把所有東西放在一起了。透過從mykafkaproducerplanet目錄呼叫以下命令來啟動生產者:
$ mvn spring-boot:run
執行以下命令來啟動Consumer :
$ ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my-kafka-streams-out1 --from-beginning |
透過呼叫URL http:// localhost:8081 / sendMessages /將訊息從生產者傳送到my-kafka-streams-topic,透過呼叫URL http:// localhost:8082 / startProcessing1 /實現流轉發處理;可以透過呼叫URL http:// localhost:8082 / stop來停止流處理。
帖子中使用的資源當然可以在GitHub上找到。點選標題見原文
相關文章
- Kafka Streams+SpringBoot之探索:統計計數 - mydeveloperplanetKafkaSpring BootDeveloper
- 註解:從一個namespace跳轉到另外一個namespace,Struts2namespace
- 將一個陣列賦值給另外一個陣列陣列賦值
- Java之IO轉換流Java
- 轉換流與列印流
- 轉換流
- 電壓-電流轉換(一):4-20mA電流環
- 流------緩衝流、轉換流、序列化流、列印流
- 安利一個js節流庫JS
- 將表從一個表空間遷移到另外一個表空間
- Java —— 轉換流Java
- IO流(02)--屬性集、緩衝流、轉換流
- Java_轉換流和緩衝流Java
- Windows 複製 xcopy 檔案到另外一個 目錄Windows
- 【備份恢復】下:還原和恢復資料庫(即將一個庫還原到另外一個庫)資料庫
- 【備份恢復】上:還原和恢復資料庫(即將一個庫還原到另外一個庫)資料庫
- 也是是另外一個開始
- 如何將Rust的“struct”轉換為資料流?RustStruct
- 流媒體學習筆記----配置一個編碼程式 (轉)筆記
- Java基礎(八)——IO流2_緩衝流、轉換流Java
- Java基礎之IO轉換流學習Java
- 字串與資料流之間的轉換字串
- 使用 yogaKit 實現一個資訊流佈局
- 字元流中第一個不重複的字元字元
- 原生 JS 實現一個瀑布流外掛JS
- 一個流暢的iOS圖表框架PNChartiOS框架
- vue在一個函式中呼叫另外一個函式Vue函式
- SpringMVC 執行一個action之後跳轉到下一個actionSpringMVC
- ASP.NET 中將檔案上傳到另外一個伺服器的方法二ASP.NET伺服器
- C# 將一個物件轉換為指定型別C#物件型別
- 工作流引擎之Elsa入門系列教程之一 初始化專案並建立第一個工作流
- 將一個陣列複製到另一個陣列上陣列
- 再造一個WinZip ——C++流技術物件導向分析與設計(一) (轉)C++物件
- Spring Cloud之微服務之間相互呼叫、如何讓一個微服務呼叫另外一個微服務SpringCloud微服務
- 移動一個帶有lob欄位的表到另外一個表空間的語法
- 安卓shell 移動某個時間之後的檔案到另外一個資料夾 命令記錄安卓
- 流批一體在京東的探索與實踐
- 記錄一個行列轉換