Spring Boot 自定义自己的starter

在spring boot中实现starter的自动化配置只需要引入maven依赖和相关的配置文件。
其实引入maven实质上就是导入jar包,spring-boot启动的时候会找到starter jar包中的resources/META-INF/spring.factories文件,根据spring.factories文件中的配置,找到需要自动配置的类:


image.png

自定义一个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的打包


image.png

image.png

2:在另一个工程的pom文件中引入starter依赖


    com.cxy.starterTest
    userStarterTest-spring-boot-starter
    1.0-SNAPSHOT

3:在配置文件中启用监控和日志的收集

gather.task.enabled=true
health.gather.enabled=true

4: 启动项目可以,查看工程下的日志文件

image.png

你可能感兴趣的:(Spring Boot 自定义自己的starter)