当前位置: 首页 > 知识库问答 >
问题:

如何使`@endpoint(id=“health”)`在Spring Boot2.0中工作?

穆洋
2023-03-14
@Endpoint(id = "health")
public class HealthEndpoint {
    @ReadOperation
    public Health health() {
        return new Health.Builder()
            .up()
            .withDetail("MyStatus", "is happy")
            .build();
    }
}

当我使用通过healthindicator实现自定义健康信息的“传统方式”时,它会按照预期工作,健康信息会被给定的细节修饰:

@Component
public class MyHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        return new Health.Builder()
            .up()
            .withDetail("MyStatus 1.1", "is happy")
            .withDetail("MyStatus 1.2", "is also happy")
            .build();
    }
}

问题:要使@endpoint(id=“health”)解决方案工作,还需要配置和/或实现哪些功能?

我的意图不是创建自定义执行器myhealt,而是自定义现有的healt执行器。基于这些文档,我希望达到与实现HealthIndicator相同的结果。我的假设错了吗?

Maven配置pom.xml包含:

xml prettyprint-override"><parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.M5</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

Spring Boot配置application.properties包含:

endpoints.health.enabled=true
endpoints.autoconfig.enabled=true
endpoints.autoconfig.web.enabled=true

共有1个答案

贲骏喆
2023-03-14

>

  • 关于新的Spring执行器endpoint的文档不是很清楚。它试图以现有的健康endpoint为例解释新的endpoint基础结构。

    新的endpointID必须是唯一的,并且不应该与现有的执行器endpoint相同。如果试图将以下示例的ID更改为healt,则会出现以下异常:

     java.lang.IllegalStateException: Found two endpoints with the id 'health'
    

    上面关于使用@bean注释声明endpoint类的注释是正确的。

    自定义healtendpoint在Spring Boot2.0中没有更改。您仍然必须实现healthindicator来添加自定义值。

    以下是在Spring Boot2.0中创建自定义执行器endpoint所需的更改。

    包含自定义信息的域。

    @Data
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    public class MyHealth {
    
        private Map<String, Object> details;
    
        @JsonAnyGetter
        public Map<String, Object> getDetails() {
            return this.details;
        }
    }
    
    @Endpoint(id = "myhealth")
    public class MyHealthEndpoint {
    
        @ReadOperation
        public MyHealth health() {
            Map<String, Object> details = new LinkedHashMap<>();
            details.put("MyStatus", "is happy");
            MyHealth health = new MyHealth();
            health.setDetails(details);
    
            return health;
        }
    }
    
    @WebEndpointExtension(endpoint = MyHealthEndpoint.class)
    public class MyHealthWebEndpointExtension {
    
        private final MyHealthEndpoint delegate;
    
        public MyHealthWebEndpointExtension(MyHealthEndpoint delegate) {
            this.delegate = delegate;
        }
    
        @ReadOperation
        public WebEndpointResponse<MyHealth> getHealth() {
            MyHealth health = delegate.health();
            return new WebEndpointResponse<>(health, 200);
        }
    }
    
    @Configuration
    public class ActuatorConfiguration {
    
        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnEnabledEndpoint
        public MyHealthEndpoint myHealthEndpoint() {
            return new MyHealthEndpoint();
        }
    
        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnEnabledEndpoint
        @ConditionalOnBean({MyHealthEndpoint.class})
        public MyHealthWebEndpointExtension myHealthWebEndpointExtension(
                MyHealthEndpoint delegate) {
            return new MyHealthWebEndpointExtension(delegate);
        }
    }
    

    更改application.yml,

    endpoints:
      myhealth:
        enabled: true
    

    启动应用程序后,应该能够访问http:// : /application/myhealth 上的新执行器endpoint。

    您应该会得到如下所示的响应,

    {
      "MyStatus": "is happy"
    }
    

  •  类似资料:
    • 我似乎找不到如何启用hystrix。SpringBoot2.0中的流。当我试图访问文件时,转到http://localhost:8080/hystrix.stream我得到一个404文件未找到错误。 在控制器中调用的方法: CommentHelper代码,请注意正在使用@HystrixCommand: 这些是来自构建的依赖项。格拉德尔: 当我进入http://localhost:8080/appl

    • GoogleSheets文档可以包含一些表单。第一个是默认值和“0”。一般情况下,任何工作表都有如下地址: https://docs.google.com/spreadsheets/d/(spreadsheetId)/编辑#gid=(sheetId) 同时具有和。 但是在API文档中没有提到如何使用。我只能读取和编辑给定的默认表格。 如果在来自示例性链接中显示的代码,我添加了属性,我得到错误:

    • 我们希望为所有到Spring Boot Actuator提供的健康endpoint的GET请求启用CORS。 我们尝试添加以下bean,但没有成功:

    • 我有点纠结于动态路由概念和消费者规则。 假设我有一个带有交换数据的路由,然后我想在“从”endpoint的不同路由中使用来自交换的报头。 我想它看起来是这样的: 一号干线: 二号干线: 所以这些步骤对我来说似乎是正确的,但我觉得我有点污染了交流。 对我来说,我使用动态路由,但同时也创造了一个新的消费者。这意味着我要创建一个新的交易所,对吗?那么,骆驼如何知道在剩下的路线中选择和使用哪种交换呢? 起

    • 我使用Hazelcast 3.8.1 java客户端在Hazelcast实例中发送映射、队列。 我正在使用以下方法发送我的数据,请看一下我下面的示例:

    • 管理endpoint: 对于Spring Boot Actuator应用程序,还有一些额外的管理endpoint: http://localhost:8080/env/testprop它工作并返回: 但当我发帖时:http://localhost:8080/env/testprop不支持请求方法“POST” 我想更新,如何使用API?