当前位置: 首页 > 后端技术 > Java

下面说说springboot项目是如何实现自定义actuator端点的

时间:2023-04-02 09:38:20 Java

前言用过springboot的朋友可能知道springboot有四个神器:自动组装、starter、cli、actuator。其中,执行器可以帮助您在将应用推送到生产环境时对其进行监控和管理。您可以选择使用HTTP端点或JMX来管理和监控您的应用程序。审计、健康和指标收集也可以自动应用于您的应用程序。Actuator默认为我们提供以下内置端点ID说明默认启用Auditevents公开当前应用程序的审计事件信息YesNobeans显示应用程序中所有Springbeans的完整列表YesNoconditions显示在配置和自动配置类上评估的条件以及是否它们匹配YesNoconfigprops显示所有@ConfigurationProperties与YesNoenv公开来自Spring的ConfigurableEnvironment的属性YesNoflyway显示任何已应用的Flyway数据库迁移YesNohealth显示应用程序健康信息Interactive)YesNoinfo显示任意应用程序信息YesYesloggers显示和修改记录器的配置applicationYesNoliquibase显示任何已应用的Liquibase数据库迁移YesNometrics显示当前应用程序的“指标”信息dumpsYesNo如果您的应用程序是Web应用程序(SpringMVC、SpringWebFlux或Jersey),则可以使用以下附加端点ID描述默认情况下启用默认情况下公开heapdump返回一个GZip压缩的hprof堆转储文件YesNojolokia通过HTTP公开JMXbean(当Jolokia在类路径上时,WebFlux不可用)YesNologfile返回一个日志文件它支持使用HTTPRange标头来检索部分日志文件内容。是Noprometheuspublicindicators,这种格式可以被Prometheusserver采集。是否注意:springboot1.X和springboot2.X中的actuator有很大区别。.X正如本文的解释,一般情况下,执行器内置端点可以满足我们的日常需求,但有时我们需要自定义端点下面列出几个常用的customendpointcustomendpoint自定义前置条件,引入pom.xml中的org.springframework.bootspring-boot-starter-actuator1。自定义健康当内置的健康端点信息不足以判断我们的项目是否健康时,我们可以通过实现org.springframework.boot.actuate.health.HealthIndicator接口来自定义健康,比如@ComponentpublicclassCustomHealthIndicatorimplementsHealthIndicator{@覆盖公共卫生health(){interrorCode=check();if(errorCode==1){returnHealth.down().withDetail("错误代码",errorCode).build();}返回Health.up().build();}privateintcheck(){//执行一些特定的健康检查returnThreadLocalRandom.current().nextInt(5);}}或者继承自org.springframework。boot.actuate.health.Abs??tractHealthIndicator,如@Component("otherCustom")publicclassCustomAbstractHealthIndicatorextendsAbstractHealthIndicator{@Ov错误保护voiddoHealthCheck(Health.Builderbuilder)throwsException{interrorCode=check();if(errorCode==1){builder.down().down().withDetail("错误代码",errorCode).build();返回;}builder.up().build();}privateintcheck(){//执行一些特定的健康检查returnThreadLocalRandom.current().nextInt(5);}}建议继承AbstractHealthIndicator在配置文件中做如下配置,可以查看详细的健康信息管理:形状如下从图中我们可以看到,我们自定义的健康端点信息,如果@Component不指定名称,则为CustomHealthIndicator的形式,默认取custom为自定义端点对象2.对于自定义信息,我们可以实现org.springframework.boot.actuate.info.InfoContributor接口,暴露一些我们想要显示的信息。形状像@ComponentpublicclassCustomInfoContributorimplementsInfoContributor{@Overridepublicvoidcontribute(Info.Builderbuilder){builder.withDetail("customInfo",Collections.singletonMap("hello","world"));}}通过访问http://ip:port/actuator/info查看,形式如下3.自定义endpoints有时候我们需要自定义自己的endpoints。我们可以使用@Endpoint注解+@ReadOperation、@WriteOperation、@DeleteOperation注解来实现自定义端点。形式如下@Component@Endpoint(id="customEndpoint")publicclassCustomEndpoint{//@ReadOperation对应GET请求/***请求示例:*GEThttp://localhost:8080/actuator/customEndpoint/zhangsan/20*@paramusername*@paramage**@return*/@ReadOperationpublicMapendpointByGet(@SelectorStringusername,@SelectorIntegerage){MapcustomMap=newHashMap<>();customMap.put("httpMethod",HttpMethod.GET.toString());customMap.put("用户名",用户名);customMap.put("年龄",年龄);返回自定义映射;}//@WriteOperation对应POST请求/***请求示例:*POSThttp://localhost:8080/actuator/customEndpoint**请求参数为json格式**{*"username":"zhangsan",*"age":20*}**@paramusername参数是必需的*@paramage参数是必需的*@return*/@WriteOperationpublicMapendpointByPost(Stringusername,Integerage){MapcustomMap=新的HashMap<>();customMap.put("httpMethod",HttpMethod.POST.toString());customMap.put("用户名",用户名);customMap.put("年龄",年龄);返回自定义映射;}//@DeleteOperation对应删除请求/***请求示例:*DELETEhttp://localhost:8080/actuator/customEndpoint**@return*/@DeleteOperationpublicMapendpointByDelete(){Map<字符串,对象>customMap=newHashMap<>();customMap.put("httpMethod",HttpMethod.DELETE.toString());返回自定义映射;}代码片段中有更详细的注释,这里不再赘述一个细节是我们需要在yml中做如下配置,通过管理暴露我们的自定义端点:endpoints:web:exposure:include:customEndpointormanagement:endpoints:web:exposure:include:"*"总结一下,本文只介绍几个比较常见的自定义endpoint,更详细的endpoint介绍可以去官网查看,链接如下https://docs.spring。io/spring-boot/docs/current/reference/html/actuator.html#actuatordemo链接https://github.com/lyb-geek/springboot-learning/tree/master/springboot-custom-actuator-endpoint