Spring boot 轮询spring启动执行器端点的更好方法(流式传输而不是轮询?)

Spring boot 轮询spring启动执行器端点的更好方法(流式传输而不是轮询?),spring-boot,spring-webflux,server-sent-events,spring-boot-actuator,spring-webclient,Spring Boot,Spring Webflux,Server Sent Events,Spring Boot Actuator,Spring Webclient,我正在编写一个web UI,用于监视Spring Boot中的另一个Java应用程序,该应用程序由Spring Actuator支持 现在,我可以使用常规的Get请求(通过SpringWebFlux的WebClient.Get()方法)从另一个客户端SprintBootWeb应用程序轮询SpringActuator的端点 但是如果一些数据发生了变化,比如说其中一个指标端点(即CPU使用率总是变化),我必须“刷新”get请求。我可以通过@scheduled注释设置定时,但我觉得有更好的方法吗 我知

我正在编写一个web UI,用于监视Spring Boot中的另一个Java应用程序,该应用程序由Spring Actuator支持

现在,我可以使用常规的Get请求(通过SpringWebFlux的WebClient.Get()方法)从另一个客户端SprintBootWeb应用程序轮询SpringActuator的端点

但是如果一些数据发生了变化,比如说其中一个指标端点(即CPU使用率总是变化),我必须“刷新”get请求。我可以通过@scheduled注释设置定时,但我觉得有更好的方法吗

我知道如何从不断流动的数据的get请求中检索流量,但在服务器上,必须创建流量。SpringBootActuator是否可以提供一个度量流,以便我可以流式传输它

下面是一些代码,我目前通过一个预定的方法调用这个方法,该方法每500毫秒ping一次

private Flux<Health> getHealth(String baseUrl) {

    var fallbackValue = new Health();
    fallbackValue.setStatus("Unknown");
    return webClient.get().uri(baseUrl + "/actuator/health").retrieve().bodyToFlux(Health.class)
            .onErrorReturn(fallbackValue);

}

首先,应该避免过于频繁地调用执行器端点,尤其是在应用程序未使用数据时。如果您的应用程序是一个仪表板,那么它不应该获取数据,除非有人正在查看该仪表板。这排除了使用
@Scheduled
,无论发生什么情况,都会发生这种情况。此外,执行器数据可以缓存,也可以在应用程序上创建一些负载,具体取决于端点。这应该仔细考虑

现在,您可以在轮询应用程序中以如下流式方式实现这一点:


@GetMapping(path = "/status/{application}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Status> streamStatus() {
  return Flux.interval(interval).flatMap(i -> getHealth(...));
}


@GetMapping(path=“/status/{application}”,products=MediaType.TEXT\u EVENT\u STREAM\u VALUE)
公共交通状况(){
返回通量.interval(interval).flatMap(i->getHealth(…);
}

这允许您定期轮询远程端点,并将结果流式传输到浏览器(使用SSE),而无需向远程应用程序添加不必要的负载。

首先,您应该避免过于频繁地调用启动器端点,尤其是当您的应用程序未使用数据时。如果您的应用程序是一个仪表板,那么它不应该获取数据,除非有人正在查看该仪表板。这排除了使用
@Scheduled
,无论发生什么情况,都会发生这种情况。此外,执行器数据可以缓存,也可以在应用程序上创建一些负载,具体取决于端点。这应该仔细考虑

现在,您可以在轮询应用程序中以如下流式方式实现这一点:


@GetMapping(path = "/status/{application}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Status> streamStatus() {
  return Flux.interval(interval).flatMap(i -> getHealth(...));
}


@GetMapping(path=“/status/{application}”,products=MediaType.TEXT\u EVENT\u STREAM\u VALUE)
公共交通状况(){
返回通量.interval(interval).flatMap(i->getHealth(…);
}

这允许您定期轮询远程端点,并将结果流式传输到浏览器(使用SSE),而无需向远程应用程序添加不必要的负载。

谢谢,我将尝试一下。我绝对不想使用@scheduled,我把它作为一个临时的“hack”放在那里,直到我能以正确的方式完成它汉克斯,我来试试。我绝对不想使用@scheduled,我把它作为一个临时的“hack”放在那里,直到我能以正确的方式完成它D