写在最前
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心
源码地址(前端):mingyue-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 的一些主要特点和功能:
-
应用程序列表: Spring Boot Admin 提供了一个仪表板,用于显示注册的 Spring Boot 应用程序的列表,以及它们的健康状态和其他有用的信息。
-
健康检查: 它可以监测和报告应用程序的健康状态,如果应用程序出现问题,您可以立即看到并采取措施。
-
性能指标: Spring Boot Admin 可以收集和显示应用程序的性能指标,包括 CPU 使用率、内存使用率、线程数等。
-
日志查看: 您可以查看应用程序的日志文件,有助于故障排除和分析。
-
环境属性: Spring Boot Admin 可以显示应用程序的配置属性,这有助于查看应用程序的配置信息。
-
安全性: 您可以配置安全性,以确保只有授权用户可以访问 Spring Boot Admin 界面。
-
通知和警报: 您可以设置通知和警报,以在应用程序出现问题时及时收到通知。
Spring Boot Admin 可以作为一个单独的服务部署,也可以集成到您的应用程序中。它使用 Spring Boot Actuator 来收集应用程序的信息,因此您需要在要监视的 Spring Boot 应用程序中集成 Actuator。通过 Spring Boot Admin,您可以集中管理多个应用程序,轻松监控它们的状态,以确保它们保持健康和可靠。
新建监控中心
添加 mingyue-monitor 模块
添加依赖
<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>
监控权限配置
@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<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); } }); } }
监控中心启动类
@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 模块
<!-- SpringBoot Actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
暴露监控端点
修改 application-common.yml 添加配置
management: endpoints: web: exposure: include: '*' endpoint: health: show-details: ALWAYS logfile: external-file: ./logs/${spring.application.name}/console.log
启动测试
依次启动 mingyue-gateway
、mingyue-auth
、mingyue-system
、mingyue-push
、mingyue-oss
、mingyue-monitor
测试监控中心。
监控中心搭建完成啦~~。可以测试启停项目,观察监控是否能检测到。