Spring Cloud Stream如何深度支援Apache Kafka?

banq發表於2019-03-13

Spring Cloud Stream提供了一種程式設計模型,可以立即連線到Apache Kafka。應用程式需要在其類路徑中包含Kafka繫結器並新增一個名為的註釋@EnableBinding,該註釋將Kafka主題繫結到其輸入或輸出(或兩者)。
Spring Cloud Stream提供了三個方便的介面來繫結@EnableBinding:( Source單輸出),Sink(單輸入)和Processor(單輸入和輸出)。它可以擴充套件到具有多個輸入和輸出的自定義介面。
以下程式碼片段顯示了Spring Cloud Stream的基本程式設計模型:

@SpringBootApplication
@EnableBinding(Processor.class)
public class UppercaseProcessor {

  @StreamListener(Processor.INPUT)
  @SendTo(Processor.OUTPUT)
  public String process(String s) {
     return s.toUpperCase();
  }
}


請注意該方法已註釋@StreamListener,Spring Cloud Stream提供該方法以接收來自Kafka主題的訊息。同樣的方法也用註釋SendTo,這是一個方便的註釋,用於將訊息傳送到輸出目的地。這是一個Spring Cloud Stream Processor應用程式,它使用來自輸入的訊息並向輸出生成訊息。

前面的程式碼中沒有提到Kafka主題Topic。此時可能出現的一個自然問題是,“此應用程式如何與Kafka通訊?”答案是:使用Spring Boot支援的眾多配置選項之一配置入站和出站主題。在這種情況下,我們使用名為YAML的配置檔案application.yml,預設情況下會搜尋該檔案。以下是輸入和輸出目標的配置:

spring.cloud.stream.bindings:
  input:
    destination: topic1
  output:
    destination: topic2



Spring Cloud Stream將輸入input對映到輸出topic1和輸出topic2。這是一組非常小的配置,但有更多選項可用於進一步自定義應用程式。預設情況下,主題是使用單個分割槽建立的,但可以由應用程式覆蓋。有關更多資訊,請參閱這些文件
最重要的是,開發人員可以專注於編寫核心業務邏輯,並讓Spring Cloud Stream和Spring Boot處理基礎架構問題(例如連線到Kafka,配置和調整應用程式等)。
以下示例顯示了另一個簡單的應用程式(消費者):

@SpringBootApplication
@EnableBinding(Sink.class)
public class LoggingConsumerApplication {

  @StreamListener(Sink.INPUT)
  public void handle(Person person) {
     System.out.println("Received: " + person);
  }

  public static class Person {
     private String name;
     public String getName() {
        return name;
     }
     public void setName(String name) {
        this.name = name;
     }
     public String toString() {
        return this.name;
     }
  }
}

請注意,@EnableBinding帶有一個Sink.class,表示這是一個消費者。與之前的應用程式的一個主要區別在於,註釋的方法@StreamListener是將稱為Person的POJO作為其引數而不是字串。將來自Kafka主題的訊息轉換為此POJO!Spring Cloud Stream提供自動內容型別轉換。預設情況下,它application/JSON用作內容型別,但也支援其他內容型別。您可以使用該屬性提供內容型別spring.cloud.stream.bindings.input.contentType,然後將其設定為適當的內容型別,例如application/Avro。
Spring Cloud Stream根據此配置選擇適當的訊息轉換器。如果應用程式想要使用Kafka提供的本機序列化和反序列化而不是使用Spring Cloud Stream提供的訊息轉換器,則可以設定以下屬性。
對於序列化:

spring.cloud.stream.bindings.output.useNativeEncoding=true 

對於反序列化:

spring.cloud.stream.bindings.input.useNativeDecoding=true



自動配置主題
Apache Kafka繫結器提供了一個配置器provisioner ,用於在啟動時配置主題。如果在代理上啟用了主題建立,則Spring Cloud Stream應用程式可以作為應用程式啟動的一部分來建立和配置Kafka主題。
例如,可以向分配器提供分割槽和其他主題級配置。這些自定義可以在 binder完成,適用於應用程式中使用的所有主題,或者適用於單個生產者和消費者級別。這在應用程式的開發和測試期間尤其方便。有關如何為多個分割槽配置主題的各種示例

支援消費組和分割槽
消費者組和分割槽等眾所周知的屬性可透過Spring Cloud Stream進行配置。可以透過屬性設定消費者組:

spring.cloud.stream.bindings.input.group=group-name


如前所述,在內部,該小組將被翻譯成Kafka的消費者群體。在編寫生產者應用程式時,Spring Cloud Stream提供了將資料傳送到特定分割槽的選項。在內部,框架再次將這些職責委託給Kafka。
如果禁用消費者組的自動重新平衡,則可以限制特定應用程式例項使用來自某組分割槽的訊息,這是一個需要覆蓋的簡單配置屬性。有關詳細資訊,請參閱這些配置選項

繫結視覺化和控制
使用Spring Boot的執行器機制,我們現在可以控制 Spring Cloud Stream中的各個繫結
在執行時,可以使用執行器端點停止,暫停,恢復應用程式,這是Spring Boot的機制,用於在將應用程式推送到生產環境時監視和管理應用程式。此功能使使用者可以對應用程式處理Kafka資料的方式進行更多控制。如果應用程式暫停繫結,則處理來自該特定主題的記錄將被暫停,直到恢復為止。
Spring Cloud Stream還與Micrometer整合,可實現更豐富的指標,排放混亂率並提供其他與監控相關的功能。這些可以與許多其他監控系統進一步整合。Kafka活頁夾提供了擴充套件的指標功能,可以提供有關主題的消費者滯後的其他見解。
Spring Boot 透過特殊的健康端點提供應用程式執行狀況檢查。Kafka繫結器提供了一個特殊的健康指示器實現,它考慮了與代理的連線,並檢查所有分割槽是否健康。如果在沒有領導者的情況下找到任何分割槽,或者無法連線代理,則執行狀況檢查會相應地報告狀態。

下面見Spring Cloud Stream對Kafka Streams的深度支援,可點選Kafka標籤進入檢視

 

相關文章