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


    写在最前

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

    源码地址(后端):mingyue-springcloud-learning: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心🎉 给出微服务的一些搭建建议

    源码地址(前端):mingyue-springcloud-ui: 🎉 基于 Vue3 + TS + Vite + Element plus 等技术,适配 MingYue 后台微服务

    文档地址:Wiki - Gitee.com

    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 模块

    添加依赖

    
        
        
            de.codecentric
            spring-boot-admin-starter-server
            ${spring-boot-admin.version}
        
    ​
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
    ​
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        
    ​
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-sentinel
        
    ​
        
        
          com.csp.mingyue
          mingyue-common-web
        
    ​
        
        
            org.springframework.boot
            spring-boot-starter-security
        
    ​
        
            org.projectlombok
            lombok
        
    

    监控权限配置

    @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();
        }
    }

    自定义事件通知处理

    @Slf4j
    @Component
    public class CustomNotifier extends AbstractEventNotifier {
    ​
        protected CustomNotifier(InstanceRepository repository) {
            super(repository);
        }
    ​
        @Override
        @SuppressWarnings("all")
        protected Mono 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);
                }
            });
        }
    ​
    }

    监控中心启动类

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

    启动配置

    # 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 模块

    
    
      org.springframework.boot
      spring-boot-starter-actuator
    

    暴露监控端点

    修改 application-common.yml 添加配置

    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 测试监控中心

    image-20231025110211833

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

  • 相关阅读:
    如何 dump 一个进程的 seccomp filters ?
    【雷达通信】基于均匀圆阵下CA-MUSIC的二维DOA估计算法附matlab代码
    Unity的碰撞检测(总结篇)
    PTA JAVA02 基础语法1
    ElasticSearch分布式搜索引擎-03
    最长递增子序列
    02.jvmClass文件结构
    python多进程中常用方法用法详解
    【毕业季·进击的技术er】大学生计算机毕业设计应该这样写
    【API篇】四、Flink物理分区算子API
  • 原文地址:https://blog.csdn.net/csp732171109/article/details/134053363