该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 spring-cloud-stream 5.0.0!spring-doc.cadn.net.cn

可观察性

Spring 支持通过 Micrometer 实现可观测性,定义了一种观测概念,使应用中既支持度量也支持追踪spring-doc.cadn.net.cn

Spring cloud Stream 通过在多个抽象中集成了 Spring Cloud Function 层面的此类支持观察功能环绕器,该函数包裹以直接处理观测值。spring-doc.cadn.net.cn

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
	<groupId>io.projectreactor</groupId>
	<artifactId>reactor-core-micrometer</artifactId>
</dependency>

以及其中一座可用的追踪桥。比如《齐普金勇敢者spring-doc.cadn.net.cn

<dependency>
	<groupId>io.micrometer</groupId>
	<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>

命令式功能

命令式函数被观察包装器包裹观察功能环绕器它提供了处理与观测注册局交互所需的基础设施。 这种交互在每次调用函数时都会发生,实际上意味着每次调用函数都会附加观测值 功能(即每条消息中单一观察)。 换句话说,对于命令函数,如果上述所需的依赖关系存在,可观测性就能正常工作。spring-doc.cadn.net.cn

无功函数

反应函数本质上不同于命令函数,因此不包裹于观察功能环绕器.spring-doc.cadn.net.cn

命令式函数是一个消息处理函数,框架在每次有消息时调用,类似于典型的事件处理程序,对于N条消息,该函数会调用N次。这允许我们对该函数进行包装,并添加错误处理重试以及当然的可观测性等额外功能。spring-doc.cadn.net.cn

反应函数是初始化函数。其工作是将用户提供的流处理代码(Flux)与绑定器提供的源流和目标流连接起来。在应用程序启动时,它只被调用一次。一旦流代码连接到源/目标流,我们就无法看到或控制实际的流处理。这取决于响应式API的作。反应函数还带来了额外的变量。鉴于该函数能让你看到整个流链(而不仅仅是单个事件),默认的观察单位应该是什么? 流链中的单个物品?是一系列物品吗?如果过了一段时间后没有消息怎么办?等。。.我们想强调的是,对于反应函数,我们不能假设任何东西。(有关响应式和命令式功能的区别,请参见“响应式功能”。)spring-doc.cadn.net.cn

所以,就像重错误处理一样,你也需要手动处理观察。spring-doc.cadn.net.cn

幸运的是,你可以通过使用水龙头在提供观测登记册.这样的分段定义了一个观察单位,可以是通量中的单个项目、一个范围,或者你想在流中观察的其他任何东西。spring-doc.cadn.net.cn

@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));
		});
	}
}

上述示例模拟将观察附加到单一消息处理(即命令函数)上,因为此时观察单元以 Mono.just(..) 开头,最后一个作附加观测登记册给订阅者。spring-doc.cadn.net.cn

如果订阅者已经附加了观察值,将用于为上游链/段创建子观察水龙头但如我们之前所说,默认情况下,框架不会为你返回的流链附加任何观察值。spring-doc.cadn.net.cn