From 19f71cfa525546cd198295eef769405def2c7d28 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 22 Jul 2023 23:58:25 -0500 Subject: [PATCH] Add Actuator Health Checking --- .../me/zhengjie/config/ConfigurerAdapter.java | 64 +++++++++++++++++++ .../security/config/SpringSecurityConfig.java | 4 ++ .../main/resources/config/application-dev.yml | 35 ++++++++++ pom.xml | 13 +++- 4 files changed, 115 insertions(+), 1 deletion(-) diff --git a/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java b/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java index a0093d68..3b6dfa6a 100644 --- a/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java +++ b/eladmin-system/src/main/java/me/zhengjie/config/ConfigurerAdapter.java @@ -18,10 +18,27 @@ package me.zhengjie.config; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; + +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties; +import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType; +import org.springframework.boot.actuate.endpoint.ExposableEndpoint; +import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver; +import org.springframework.boot.actuate.endpoint.web.EndpointMapping; +import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; +import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint; +import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; +import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; +import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; +import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.util.StringUtils; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @@ -30,6 +47,7 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -40,6 +58,7 @@ import java.util.List; */ @Configuration @EnableWebMvc +@EnableSwagger2 public class ConfigurerAdapter implements WebMvcConfigurer { /** 文件配置 */ @@ -85,4 +104,49 @@ public class ConfigurerAdapter implements WebMvcConfigurer { converter.setDefaultCharset(StandardCharsets.UTF_8); converters.add(converter); } + + + /** + * 注册endpoints,解决springboot升级到2.6.x之后,actuator error problems + * + * @param webEndpointsSupplier the web endpoints supplier + * @param servletEndpointsSupplier the servlet endpoints supplier + * @param controllerEndpointsSupplier the controller endpoints supplier + * @param endpointMediaTypes the endpoint media types + * @param corsProperties the cors properties + * @param webEndpointProperties the web endpoint properties + * @param environment the environment + * @return the web mvc endpoint handler mapping + */ + @Bean + public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, + ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, + CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties, + Environment environment) { + List> allEndpoints = new ArrayList<>(); + Collection webEndpoints = webEndpointsSupplier.getEndpoints(); + allEndpoints.addAll(webEndpoints); + allEndpoints.addAll(servletEndpointsSupplier.getEndpoints()); + allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints()); + String basePath = webEndpointProperties.getBasePath(); + EndpointMapping endpointMapping = new EndpointMapping(basePath); + boolean shouldRegisterLinksMapping = shouldRegisterLinksMapping(webEndpointProperties, environment, basePath); + + return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, + corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath), + shouldRegisterLinksMapping); + } + + /** + * shouldRegisterLinksMapping + * @param webEndpointProperties webEndpointProperties + * @param environment environment + * @param basePath / + * @return boolean + */ + private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, + Environment environment, String basePath) { + return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) + || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT)); + } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java index ad886f31..96cb9a36 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java @@ -22,6 +22,8 @@ import me.zhengjie.modules.security.security.*; import me.zhengjie.modules.security.service.OnlineUserService; import me.zhengjie.modules.security.service.UserCacheManager; import me.zhengjie.utils.enums.RequestMethodEnum; + +import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -98,6 +100,8 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() + .requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll() + // .antMatchers("/login").permitAll() // 静态资源等等 .antMatchers( HttpMethod.GET, diff --git a/eladmin-system/src/main/resources/config/application-dev.yml b/eladmin-system/src/main/resources/config/application-dev.yml index 6c5c47bb..c9deb7a2 100644 --- a/eladmin-system/src/main/resources/config/application-dev.yml +++ b/eladmin-system/src/main/resources/config/application-dev.yml @@ -114,3 +114,38 @@ file: # 文件大小 /M maxSize: 100 avatarMaxSize: 5 + +management: + # 可以指定暴露哪些actuator服务,'*'为全部,注意加上引号,被注释的写法表示只允许health,info, metrics, shutdown + endpoints: + web: + exposure: + include: health,info, metrics, shutdown + # include: '*' # all + # default: http://localhost:8000/actuator/* + # base-path: http://localhost:8000/${base-path}/* + # base-path: /check (web.base-path) + endpoint: + # 通过/actuator/shutdown停止服务 + shutdown: + enabled: true + # 显示health的详细内容 + health: + show-details: always + info: # 显示任意的应用信息,默认关闭,如果是更低一些的版本默认是开启的 + env: + enabled: true +# 自定义/actuator/info中的各种内容,可以自定义,也可以取默认的一些系统/服务环境变量 +info: + app: + encoding: "@project.build.sourceEncoding@" + java: + source: "@java.version@" + target: "@java.version@" + build: + artifact: @project.artifactId@ + name: @project.name@ + description: @project.description@ + pomVersion: @project.version@ + # 甚至可以自定义test + test: 'I love Spring Boot' diff --git a/pom.xml b/pom.xml index 2444137c..7c58ad30 100644 --- a/pom.xml +++ b/pom.xml @@ -90,6 +90,11 @@ commons-lang3 + + org.springframework.boot + spring-boot-starter-actuator + + org.bgee.log4jdbc-log4j2 @@ -110,7 +115,13 @@ mysql mysql-connector-java - runtime + 5.1.43 + + + + + com.h2database + h2