在spring boot中实现starter的自动化配置只需要引入maven依赖和相关的配置文件。
其实引入maven实质上就是导入jar包,spring-boot启动的时候会找到starter jar包中的resources/META-INF/spring.factories文件,根据spring.factories文件中的配置,找到需要自动配置的类:
自定义一个starter
Spring boot给我们提供了一个actuator的starter用来监控项目中引入的中间件状态(mysql, rabbit mq, redis, es…)但是他只提供了rest和jmx的访问方式,没有将状态写入到log中。
下面就开始自定义一个strater,定时获取actuator的监控状态并写入log中。
1:创建一个spring boot 工程
Spring boot starter本身也是一个spring boot工程,所以需要创建一个spring boot工程。
在pom中引入下面三个依赖:
1):spring-boot-configuration-processor 作用是编译时生成 spring-configuration-metadata.json ,在IDE中编辑配置文件时,会出现提示。
2):spring-boot-autoconfigure 作用是帮助我们完成bean的自动装配
3):spring-boot-starter-actuator 引入原生的actuator监控项目中配置的中间件健康状态
4):spring-boot-starter-log4j2 因为要自己写actuator的监控日志到log中,引入log4j2
org.springframework.boot
spring-boot-configuration-processor
org.springframework.boot
spring-boot-autoconfigure
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
com.alibaba
fastjson
1.2.48
2:创建获取actuator的监控信息并写入log的功能类
在功能类HealthGatherService中注入actuator的HealthEndpoint,然后从HealthEndpoint中获取中间件的健康状态和详细信息
public class HealthGatherService {
public final static Logger logger = LoggerFactory.getLogger(HealthGatherService.class);
@Autowired
private HealthEndpoint healthEndpoint;
public void gatherHelthDetails() {
//从actuator获取mysql, redis, ldap的状态信息
CompositeHealth health = (CompositeHealth)this.healthEndpoint.health();
Map map =health.getComponents();
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
logger.info(JSONObject.toJSONString(entry.getValue()));
}
}
}
3:写一个定时任务,项目启动或定时完成监控并写监控信息到log中
public class GatherTask {
@Autowired
private HealthGatherService healthGatherService;
@Scheduled(cron = "*/5 * * * * ?")
public void getHealthStatusInfo(){
//HealthGatherService healthGatherService = new HealthGatherService();
healthGatherService.gatherHelthDetails();
}
}
4:编写配置类,完成定时任务类和监控日志收集类的自动装配
当配置文件中配置了gather.task.enabled=true时自动装配定时任务类
当配置文件中配置了health.gather.enabled=true时自动装配日志的收集类
@Configuration
@ConditionalOnClass({GatherTask.class, HealthGatherService.class})
public class healthGatherAutoConfigure {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "gather.task", value = "enabled", havingValue = "true")
GatherTask starterGatherTask (){
return new GatherTask();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "health.gather", value = "enabled", havingValue = "true")
HealthGatherService starterHealthGatherService (){
return new HealthGatherService();
}
}
5:设置actuator开启jmx,设置log4j2, 显示监控日志详情
spring.jmx.enabled=true
management.endpoints.jmx.exposure.include=*
management.endpoint.health.show-details=always
logging.config=classpath:log4j2.xml
6:创建spring.factories文件,并设置autoconfiguration的类路径
在resources/META-INF/下创建spring.factories文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=service.healthGatherAutoConfigure
在项目中引入starter
1: maven 打包
执行: mvn clean后再执行 mvn install 完成starter的打包
2:在另一个工程的pom文件中引入starter依赖
com.cxy.starterTest
userStarterTest-spring-boot-starter
1.0-SNAPSHOT
3:在配置文件中启用监控和日志的收集
gather.task.enabled=true
health.gather.enabled=true