springcloud2.0负载均衡性能(极简SpringCloud6Actuator)

springcloud2.0负载均衡性能(极简SpringCloud6Actuator)(1)

Actuator是springboot引入的,非常好用的应用监控组件。在SpringCloud生态里,也是扮演非常重要的角色。

依赖:

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

Endpoints

Actuator中一个最重要的概念是Endpoints。中文一般翻译为端点。很不传神。可以理解为监控点。

默认开启的端点:

springcloud2.0负载均衡性能(极简SpringCloud6Actuator)(2)

注意,其中有个shutdown是默认关闭的,这个很危险。

这些端点都是可以单独配置打开还是关闭的

management: endpoint: #注意没有s shutdown: enabled: true #开启shutdown,仅为了演示。线上要关闭

当然,如果你大部分端点都不想打开,一个个关闭又很麻烦。

可以这样

management.endpoints.enabled-by-default=false //全部默认关闭 management.endpoint.info.enabled=true //把需要enable的单独打开

另外,如果你是spring mvc工程,还有下面几个端点可用

springcloud2.0负载均衡性能(极简SpringCloud6Actuator)(3)

这个heapdump实在是太好用了,再也不用费力的去服务器取dump文件了

上面说的是开启的端点,开启了并不表示你可以随便访问。还需要暴露。

springboot默认是暴露了/actuator/health 和 /actuator/info两个端点

要想暴露所有的端点,如下配置。

management: endpoints: web: exposure: #加载所有的端点,默认只加载了info、health include: '*' exclude: beans #排除beans

配置端点信息的缓存时间

management: endpoint: #注意没有s info: cache: time-to-live: 10s

Health信息:

最常用也是重要的要算这个health端点了,经常使用这个端点的信息来判断应用的健康状态

健康信息是来自于 HealthIndicators,下列是springboot默认装配的HealthIndicators

springcloud2.0负载均衡性能(极简SpringCloud6Actuator)(4)

可以通过设置management.health.defaults.enabled = false来关闭

我们来看一下DiskSpaceHealthIndicator是怎么实现的

// 继承了AbstractHealthIndicator public class DiskSpaceHealthIndicator extends AbstractHealthIndicator { private final File path; private final long threshold; /** * Create a new {@code DiskSpaceHealthIndicator} instance. * @param path the Path used to compute the available disk space * @param threshold the minimum disk space that should be available (in bytes) */ public DiskSpaceHealthIndicator(File path, long threshold) { super("DiskSpace health check failed"); this.path = path; this.threshold = threshold; } @Override protected void doHealthCheck(Health.Builder builder) throws Exception { long diskfreeInBytes = this.path.getUsableSpace();//File类的自带功能 if (diskFreeInBytes >= this.threshold) { builder.up();//builder设计模式的使用 } else { logger.warn(String.format( "Free disk space below threshold. " "Available: %d bytes (threshold: %d bytes)", diskFreeInBytes, this.threshold)); builder.down(); } builder.withDetail("total", this.path.getTotalSpace()) .withDetail("free", diskFreeInBytes) .withDetail("threshold", this.threshold); } }

整个代码还是很简单的。我们从中可以学到怎么创建自己的HealthIndicator

模仿这个代码,创建我们自己的健康检查指标

比如通过版本控制,来触发服务不可用状态

在yml文件中配置一个version字段

# version version: 1.0.0

@Slf4j @Component public class VersionCheckHealthIndicator extends AbstractHealthIndicator { @Value("${version}") String version; @Override protected void doHealthCheck(Health.Builder builder) throws Exception { if ("2.0.0".equalsIgnoreCase(version)) { builder.up(); } else { log.warn("版本过低"); builder.down(); } builder.withDetail("version", version); } }

springcloud2.0负载均衡性能(极简SpringCloud6Actuator)(5)

默认情况下,EurekaServer检测客户端是否可用,靠的是心跳检测,这不是很好用,因为很多时候时候client端心跳是在的,但是服务已经不可用了。那能不能改成使用Health端点呢?

当然是可以的,而且很简单。

在client的配置文件里设置一下healthcheck

eureka: client: healthcheck: enabled: true

效果如下:

springcloud2.0负载均衡性能(极简SpringCloud6Actuator)(6)

注意Spring Boot Actuator所有的监控项中的任何一个健康状态是DOWN,那个整体应用的健康状态也是DOWN,这时候调用方就把服务当作不可用。

所以对于不是必须的服务,从健康检查中排除,避免造成整个服务不可用。

比如通过如下配置关闭邮箱健康检查。

management.health.mail.enabled=false

其他一些自定义配置:

改变访问路径

默认情况下,这些端点路径前面都有 /actuator/health前缀

这个也是可以改的。

方法:

management.endpoints.web.base-path=/manage

这样子,/actuator/health变成/manage/health访问

那这个health能不能改?也能

management.endpoints.web.path-mapping.health=healthcheck

这样/health变成/healthcheck访问

指定端口:

management.server.port=8081

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页