可觀察性
Spring 透過 Micrometer 提供可觀察性支援,Micrometer 定義了 Observation 概念,可在應用程式中啟用指標和追蹤。
Spring Cloud Stream 在 Spring Cloud Function 層級整合了此支援,透過提供多種抽象概念,包含 ObservationFunctionAroundWrapper
,此元件包裝函式以直接處理可觀察性。
必要的相依性
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core-micrometer</artifactId>
</dependency>
以及可用的追蹤器橋接器之一。例如 Zipkin Brave
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
命令式函式
命令式函式會使用觀察包裝器 ObservationFunctionAroundWrapper
包裝,此包裝器提供必要的基礎架構來處理與 Observation 登錄檔的互動。此類互動發生在每次函式調用時,這實際上表示觀察會附加到每次函式調用(即,每個訊息單次觀察)。換句話說,對於命令式函式,如果存在先前提及的必要相依性,可觀察性將會直接運作。
反應式函式
反應式函式本質上與命令式函式不同,因此不會使用 ObservationFunctionAroundWrapper
包裝。
命令式函式是訊息處理常式函式,每次有訊息時都會由框架調用,有點像您典型的事件處理常式,其中對於 N 個訊息,將會調用 N 次此類函式。這讓我們可以包裝此類函式,並使用額外功能(例如錯誤處理、重試,當然還有可觀察性)來裝飾它。
反應式函式是初始化函式。其工作是將使用者提供的串流處理程式碼 (Flux) 與繫結器提供的來源和目標串流連接。它僅在應用程式啟動期間調用一次。一旦串流程式碼與來源/目標串流連接,我們就無法看到或控制實際的串流處理。這掌握在反應式 API 的手中。反應式函式也帶來了一個額外的變數。鑑於函式讓您可以查看整個串流鏈(而不僅僅是一個事件),預設的觀察單位應該是什麼?串流鏈中的單個項目?一系列項目?如果經過一段時間後沒有訊息怎麼辦?等等... 我們想要強調的是,對於反應式函式,我們不能假設任何事情。(有關反應式和命令式函式之間差異的更多資訊,請參閱 反應式函式)。
因此,就像重試和錯誤處理一樣,您需要手動處理觀察。
幸運的是,您可以透過在使用反應式 API 的 tap
操作時,提供 ObservationRegistry
的實例,輕鬆地進入串流的區段。此區段定義了一個觀察單位,它可以是 flux 中的單個項目、範圍或您可能想要在串流中觀察的任何其他內容。
@SpringBootApplication
public class DemoStreamApplication {
Logger logger = LoggerFactory.getLogger(DemoStreamApplication.class);
public static void main(String[] args) {
Hooks.enableAutomaticContextPropagation();
SpringApplication.run(DemoStreamApplication.class, args);
}
@Bean
public Function<Flux<String>, Flux<String>> uppercase(ObservationRegistry registry) {
return flux -> flux.flatMap(item -> {
return Mono.just(item)
.map(value -> value.toUpperCase())
.doOnNext(v -> logger.info(v))
.tap(Micrometer.observation(registry));
});
}
}
上面的範例模擬將 Observation 附加到單個訊息處理(即,命令式函式),因為在這種情況下,觀察單位從 Mono.just(..) 開始,最後一個操作將 ObservationRegistry
附加到訂閱者。
如果訂閱者已附加觀察,它將用於為 tap
上游的鏈/區段建立子觀察,但是正如我們已經說過的,預設情況下,框架不會將任何觀察附加到您返回的串流鏈。