专栏首页TECH flowerSpring Boot Admin实现服务健康预警

Spring Boot Admin实现服务健康预警

Over View

上一篇文章主要介绍了Spring Boot Admin的概况以及我们如何在系统中引入和使用Spring Boot Admin,以此来帮助我们更加了解自己的系统,做到能快速发现、排查问题。本篇文章将用代码演示Spring Boot Admin的消息通知功能,并利用这个开箱即用的特性来个性化我们的需求,优化我们在服务治理方面的工作效率。

Spring Boot Admin内置了多种开箱即用的系统通知渠道,包括邮件、Slack、Telegram、Hipchat等多种社交媒体的通知渠道。但是考虑到它所支持的大都是一些国外的主流社交媒体,在国内的本地化可能并不是那么的友好。不过没关系Spring Boot Admin也提供了通用的接口,使得用户可以基于他所提供的接口来自定义通知方式。下面使用Spring Boot Admin的通知功能来实现基于邮件和国内办公软件“飞书”的服务健康预警。


邮件预警

依赖引入

在Spring Boot Admin的服务端项目中引入邮件相关依赖

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

添加配置

添加Spring Mail相关配置,我们配置好我们邮箱的Smtp服务器相关信息

spring.mail.host=your email smtp server
spring.mail.password=your password
spring.mail.port=your email smtp server port
spring.mail.test-connection=true
spring.mail.username=837718548@qq.com

添加Spring Boot Admin(SBA)中相关的邮件配置,以下是SBA官方提供的邮件相关参数

Property name

Description

Default value

spring.boot.admin.notify.mail.enabled

Enable mail notifications

true

spring.boot.admin.notify.mail.ignore-changes

Comma-delimited list of status changes to be ignored. Format: ":". Wildcards allowed.

"UNKNOWN:UP"

spring.boot.admin.notify.mail.template

Resource path to the Thymeleaf template used for rendering.

"classpath:/META-INF/spring-boot-admin-server/mail/status-changed.html"

spring.boot.admin.notify.mail.to

Comma-delimited list of mail recipients

"root@localhost"

spring.boot.admin.notify.mail.cc

Comma-delimited list of carbon-copy recipients

spring.boot.admin.notify.mail.from

Mail sender

"Spring Boot Admin noreply@localhost"

spring.boot.admin.notify.mail.additional-properties

Additional properties which can be accessed from the template

我们这里使用如下配置

spring.boot.admin.notify.mail.from=837718548@qq.com
spring.boot.admin.notify.mail.ignore-changes=""
spring.boot.admin.notify.mail.to=目标邮箱

配置中的ignore-changes参数表示服务从一个状态变成其他状态时发出预警,例如:"UNKNOWN:UP" 表示服务从未知状态变成UP时,发出通知。当其值是""时,表示任何状态变更都会发出预警。若想指定其他参数,参考上面的参数表。完成上述操作后,重启Spring Boot Admin服务端,当客户端服务注册进来并且状态变为UP时,我们可以收到一封邮件:

添加邮件模版

Spring Boot admin发送的邮件可以自定义模板样式,我们使用thymeleaf语法编写邮件模板,示例模板代码可参考本文在Github的代码示例仓库,编写完模板文件之后,将文件放入项目src/main/resources/templates中,并且在配置文件中增加指定模板文件的地址:

spring.boot.admin.notify.mail.template=classpath:/templates/status-changed.html

重启Spring Boot Admin服务端,当客户端服务注册进来并且状态变为UP时,我们可以收到一封邮件,如下是我们对邮件进行本地化之后的样式:


飞书预警

由于Spring Boot Admin内置的通知渠道都是国外的社交媒体,不过它也提供了自定义通知渠道的接口,所以我们很容易就可以自定义通知渠道,下面演示集成办公软件飞书的通知。

获取通知地址

飞书中提供了聊天机器人,我们只需调用机器人的WebHook就可以实现详细的推送(企业微信,钉钉也具有类似功能)。

自定义通知渠道

Spring Boot Admin中提供了一个AbstractStatusChangeNotifier抽象类,我们可以通过继承它来自定义通知渠道

public class FlyBookNotifier extends AbstractStatusChangeNotifier {

    private static final String DEFAULT_MESSAGE = "#{instance.registration.name} (#{instance.id}) 状态发生转变 #{lastStatus} ➡️ #{instance.statusInfo.status} " +
            "\n" +
            "\n 实例详情:#{instanceEndpoint}";

    private final SpelExpressionParser parser = new SpelExpressionParser();

    private RestTemplate restTemplate;

    private URI webhookUrl;

    private Expression message;

    public FlyBookNotifier(InstanceRepository repository, RestTemplate restTemplate) {
        super(repository);
        this.restTemplate = restTemplate;
        this.message = parser.parseExpression(DEFAULT_MESSAGE, ParserContext.TEMPLATE_EXPRESSION);
    }

    @Override
    protected Mono<Void> doNotify( InstanceEvent event,  Instance instance) {
        if (webhookUrl == null) {
            return Mono.error(new IllegalStateException("'webhookUrl' must not be null."));
        }
        return Mono
                .fromRunnable(() -> restTemplate.postForEntity(webhookUrl, createMessage(event, instance), Void.class));
    }

    public void setRestTemplate(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    protected Object createMessage(InstanceEvent event, Instance instance) {
        Map<String, Object> messageJson = new HashMap<>();
        messageJson.put("title", "?警告&?提醒");
        messageJson.put("text", getText(event, instance));

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        return new HttpEntity<>(messageJson, headers);
    }


    protected String getText(InstanceEvent event, Instance instance) {
        Map<String, Object> root = new HashMap<>();
        root.put("event", event);
        root.put("instance", instance);
        root.put("instanceEndpoint", instance.getEndpoints().toString());
        root.put("lastStatus", getLastStatus(event.getInstance()));
        StandardEvaluationContext context = new StandardEvaluationContext(root);
        context.addPropertyAccessor(new MapAccessor());
        return message.getValue(context, String.class);
    }


    public URI getWebhookUrl() {
        return webhookUrl;
    }

    public void setWebhookUrl(URI webhookUrl) {
        this.webhookUrl = webhookUrl;
    }

    public String getMessage() {
        return message.getExpressionString();
    }

    public void setMessage(String message) {
        this.message = parser.parseExpression(message, ParserContext.TEMPLATE_EXPRESSION);
    }
}

上面代码是一个示例,用户可以根据自己的需求来自定义消息体的格式和内容。随后我们在Spring中创建该通知类的bean

@Configuration
public static class NotifierConfiguration {
    @Bean
    @ConditionalOnMissingBean
    @ConfigurationProperties("spring.boot.admin.notify.flybook")
    public FlyBookNotifier flyBookNotifier(InstanceRepository repository) {
        return new FlyBookNotifier(repository, new RestTemplate());
    }
}

最后我们在项目的配置文件中添加我们飞书渠道的配置信息

spring.boot.admin.notify.flybook.ignore-changes=""
spring.boot.admin.notify.flybook.webhook-url=https://open.feishu.cn/open-apis/bot/hook...

完成上述操作后,重启Spring Boot Admin服务端,当客户端服务注册进来并且状态变为UP时,我们可以在飞书端收到Spring Boot Admin自动推过来的预警信息:

至此,我们的自定义消息渠道就已经完成。通过继承AbstractStatusChangeNotifier抽象类,我们可以很轻易的自定义自己想要实现的推送渠道(设计模式:模板方法模式)。


总结

本文主要介绍了Spring Boot Admin中所提供的多种消息预警推送渠道,并且我们可以通过自定义消息预警渠道来满足我们自身的需求,整个过程并不需要耗费太多的人力和时间成本。我们用了两个示例来演示如何实现Spring Boot Admin的消息预警功能,分别是邮件预警和自定义的飞书预警。

本文的示例代码 SBA-client:https://github.com/cg837718548/sba-client-demo.git SBA-server:https://github.com/cg837718548/sba-server-demo.git

本文分享自微信公众号 - TECH flower(tech-flower),作者:东溪陈姓少年

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Cloud Admin健康检查 邮件、钉钉群通知

    源码地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/cloudadmin

    全栈程序员站长
  • SpringBootAdmin2.0实现微服务应用监控

    Spring Boot Admin Server 可以监控的功能很多,使用起来没有难度,下面描述下可以监测的部分内容:

    黎明大大
  • 对没有监控的微服务Say No!

    目录: 一、监控简介 二、监控策略 三、总结 一、监控简介 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用...

    yuanyi928
  • Spring Boot 微服务之程序性能监控

    Spring Boot特别适合团队构建各种可快速迭代的微服务,同时为了减少程序本身监控系统的开发量,Spring Boot提供了actuator模块,可以很方便...

    搜云库技术团队
  • Spring Boot Admin 2.1.0 全攻略

    Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client...

    方志朋
  • Spring Boot 2 实战:使用 Spring Boot Admin 监控平台

    生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring...

    码农小胖哥
  • Spring Boot Admin简介及实践

    在若干年前的单体应用时代,我们可以相对轻松地对整个业务项目进行健康检查、指标监控、配置管理等等项目治理。如今随着微服务的发展,我们将大型单体应用按业务模型进行划...

    东溪陈姓少年
  • 重学SpringBoot系列应用程序监控管理

    Spring Boot作为构建微服务节点的方案,一定要提供全面而且细致的监控指标,使微服务更易于管理!微服务不同于单体应用,微服务的每个服务节点都单独部署,独立...

    大忽悠爱学习
  • Spring Boot Admin解析

    之前文章我们讲解了Spring Boot提供的 Actuator 模块以实现应用的监控与管理。具体可参考:Spring Boot Actuator...

    Luga Lee
  • SpringBoot Admin 2.0 详解

    Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。应用程序作为Spring Boot Admin Client向...

    macrozheng
  • Spring Boot Admin 2.0 详解

    Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client...

    jwangkun
  • Spring Boot Admin 2.0 详解

    Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client...

    程序员果果
  • SpringBoot Actuator — 埋点和监控

    监控机器环境的性能和业务流程或逻辑等各项数据,并根据这些数据生成对应的指标,那么我们就称为数据埋点。比如我们想知道某个接口调用的 TPS、机器 CPU 的使用率...

    晚上没宵夜
  • Spring Boot 应用监控

    当一个Spring Boot 应用运行的时候,开发者需要对Spring Boot应用进行实时监控,获得项目的报警需求,Spring Boot 提供了,actua...

    mySoul
  • Spring Boot Actuator详解与深入应用(三):Prometheus+Grafana应用监控

    本文系《Spring Boot Actuator详解与深入应用》中的第三篇。在前两篇文章,我们主要讲了Spring Boot Actuator 1.x与 2.x...

    aoho求索
  • 项目offline发生了什么

    Spring Boot Admin is a community project to manage and monitor your Spring Boot ...

    只喝牛奶的杀手
  • SpringBoot应用监控实战

    CodeSheep
  • Springboot之监控健康状况

      在微服务环境中,因为我们的服务节点比较多,所以我们需要获取每个服务节点的健康信息来掌握整个系统的运行情况及问题解决,本文就来具体介绍下怎么实现SpringB...

    用户4919348
  • Spring Cloud Eureka 总结

    它主要记录各个微服务和微服务地址的映射关系,各个微服务都将自己注册到这个注册中心上面,当微服务之间需要互相调用时,就可以从注册中心上面去发现微服务和进行调用。

    EalenXie

扫码关注云+社区

领取腾讯云代金券