031-从零搭建微服务-监控中心(一)

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):gitee.com/csps/mingyu...

源码地址(前端):gitee.com/csps/mingyu...

文档地址:gitee.com/csps/mingyu...

mingyue-visual

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。微服务是一种软件架构模式,它将大型应用程序拆分为小型、自治的服务,每个服务都有自己的特定功能。这种架构提供了很多好处,如增加开发速度、提高灵活性和可伸缩性,但同时也引入了一些挑战,特别是涉及到服务之间的通信和协调。

明月可视化模块将担任确保微服务之间的稳定性,实施健康检查和自愈机制,以监测和自动修复服务的问题。实施监控和日志记录,以及性能分析工具,以及时检测和解决问题。制定紧急计划和容错机制,以处理服务中断或失败时的情况。

明月可视化模块规划是存放监控中心,如 mingyue-monitor(监控中心 SpringBoot Admin)、Xxl-Job(分布式任务调度平台)、Sentinel(分布式系统的流量防卫兵)等微服务所需的第三方可视化应用,通过丰富该模块来健壮和拓展 mingyue,多个维度保护服务的稳定性。

Spring Boot Admin

Spring Boot Admin 是一个开源的社区项目,用于监控和管理 Spring Boot 应用程序。它提供了一个用户友好的 Web 界面,通过该界面,您可以查看和管理您的 Spring Boot 应用程序的各种运行时信息,包括健康状态、性能指标、日志、环境属性等。Spring Boot Admin 可以帮助您更容易地监控和管理多个 Spring Boot 应用程序,特别适用于微服务架构中的应用程序。

以下是 Spring Boot Admin 的一些主要特点和功能:

  1. 应用程序列表: Spring Boot Admin 提供了一个仪表板,用于显示注册的 Spring Boot 应用程序的列表,以及它们的健康状态和其他有用的信息。
  2. 健康检查: 它可以监测和报告应用程序的健康状态,如果应用程序出现问题,您可以立即看到并采取措施。
  3. 性能指标: Spring Boot Admin 可以收集和显示应用程序的性能指标,包括 CPU 使用率、内存使用率、线程数等。
  4. 日志查看: 您可以查看应用程序的日志文件,有助于故障排除和分析。
  5. 环境属性: Spring Boot Admin 可以显示应用程序的配置属性,这有助于查看应用程序的配置信息。
  6. 安全性: 您可以配置安全性,以确保只有授权用户可以访问 Spring Boot Admin 界面。
  7. 通知和警报: 您可以设置通知和警报,以在应用程序出现问题时及时收到通知。

Spring Boot Admin 可以作为一个单独的服务部署,也可以集成到您的应用程序中。它使用 Spring Boot Actuator 来收集应用程序的信息,因此您需要在要监视的 Spring Boot 应用程序中集成 Actuator。通过 Spring Boot Admin,您可以集中管理多个应用程序,轻松监控它们的状态,以确保它们保持健康和可靠。

新建监控中心

添加 mingyue-monitor 模块

添加依赖

xml 复制代码
<dependencies>
    <!-- SpringBoot Admin -->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
        <version>${spring-boot-admin.version}</version>
    </dependency>
​
    <!-- SpringCloud Alibaba Nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
​
    <!-- SpringCloud Alibaba Nacos Config -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
​
    <!-- SpringCloud Alibaba Sentinel -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
​
    <!-- web容器 -->
    <dependency>
      <groupId>com.csp.mingyue</groupId>
      <artifactId>mingyue-common-web</artifactId>
    </dependency>
​
    <!-- Spring Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
​
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

监控权限配置

scss 复制代码
@EnableWebSecurity
public class WebSecurityConfigurer {
    private final String adminContextPath;
​
    public WebSecurityConfigurer(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }
​
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");
​
        return httpSecurity
                .headers().frameOptions().disable()
                .and().authorizeRequests()
                .antMatchers(adminContextPath + "/assets/**"
                        , adminContextPath + "/login"
                        , adminContextPath + "/actuator/**"
                        , adminContextPath + "/instances/**"
                ).permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage(adminContextPath + "/login")
                .successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout")
                .and()
                .httpBasic().and()
                .csrf()
                .disable()
                .build();
    }
}

自定义事件通知处理

scala 复制代码
@Slf4j
@Component
public class CustomNotifier extends AbstractEventNotifier {
​
    protected CustomNotifier(InstanceRepository repository) {
        super(repository);
    }
​
    @Override
    @SuppressWarnings("all")
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> {
            // 实例状态改变事件
            if (event instanceof InstanceStatusChangedEvent) {
                String registName = instance.getRegistration().getName();
                String instanceId = event.getInstance().getValue();
                String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
                log.info("Instance Status Change: [{}],[{}],[{}]", registName, instanceId, status);
            }
        });
    }
​
}

监控中心启动类

less 复制代码
@EnableAdminServer
@SpringBootApplication
public class MingYueMonitorApplication {
    public static void main(String[] args) {
        SpringApplication.run(MingYueMonitorApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  监控中心启动成功   ლ(´ڡ`ლ)゙  ");
    }
}

启动配置

yaml 复制代码
# Tomcat
server:
  port: 9100
​
# Spring
spring:
  application:
    # 应用名称
    name: mingyue-monitor
  profiles:
    # 环境配置
    active: @profiles.active@
​
--- # nacos 配置
spring:
  cloud:
    nacos:
      # nacos 服务地址
      server-addr: @nacos.server@
      discovery:
        # 注册组
        group: @nacos.discovery.group@
        namespace: ${spring.profiles.active}
      config:
        # 配置组
        group: @nacos.config.group@
        namespace: ${spring.profiles.active}
  config:
    import:
      - optional:nacos:application-common.yml
      - optional:nacos:${spring.application.name}.yml

接入监控中心

修改 mingyue-common-web

添加 actuator 模块

xml 复制代码
<!-- SpringBoot Actuator -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

暴露监控端点

修改 application-common.yml 添加配置

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS
    logfile:
      external-file: ./logs/${spring.application.name}/console.log

启动测试

依次启动 mingyue-gatewaymingyue-authmingyue-systemmingyue-pushmingyue-ossmingyue-monitor 测试监控中心

监控中心搭建完成啦~~。可以测试启停项目,观察监控是否能检测到。

相关推荐
Estar.Lee2 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_857610034 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_5 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞5 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货5 小时前
Rust 的简介
开发语言·后端·rust
monkey_meng5 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
Estar.Lee6 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
新知图书6 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放7 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang7 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net