前言
本文我们来分析CounterService,GaugeService的自动装配.关于其装配的实现是区分jdk版本的.其自动装配是在MetricRepositoryAutoConfiguration中,该类的说明如下:
创建面向用户的GaugeService和CounterService的实例,同时创建repositories来存储数据.
Java 7 使用的是InMemoryMetricRepository或者CounterBuffers 而在Java 8 使用的是GaugeBuffers.存储的值可以通过Exporter 来导出.
如果Spring Messaging添加到项目中并且创建了1个名为metricsChannel的MessageChannel,则所有metric更新的事件会发送到这个channel中.可以通过订阅该channel来进行额外的处理
如果在类路径下存在Dropwizard’s metrics 的jar包,则MetricRegistry会被创建.默认情况下的counter,gauge就不会创建.(关于这个我们在上篇文章中有说明)
默认情况下所有的度量会更新到MetricWriter的实例中,通过metriccopyexporter.每5秒进行一次.(可以使用spring.metrics.export.enabled=false来禁用)
接下来我们就来分析吧.
解析
MetricRepositoryAutoConfiguration 中声明3个静态配置类:
LegacyMetricRepositoryConfiguration:
其声明了如下注解:
@Configuration @ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) @ConditionalOnMissingBean(name = "actuatorMetricRepository")
- @Configuration –> 配置类
- @ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) –> 在jdk1.8之前的环境中生效
- @ConditionalOnMissingBean(name = “actuatorMetricRepository”)–> BeanFactory中不存在id为actuatorMetricRepository的bean时生效
声明了如下2个@Bean方法:
actuatorMetricRepository,代码如下:
@Bean @ExportMetricReader @ActuatorMetricWriter public InMemoryMetricRepository actuatorMetricRepository() { return new InMemoryMetricRepository(); }
actuatorMultiMetricRepository,代码如下:
@Bean @ExportMetricReader @ActuatorMetricWriter public InMemoryMultiMetricRepository actuatorMultiMetricRepository( InMemoryMetricRepository actuatorMetricRepository) { return new InMemoryMultiMetricRepository(actuatorMetricRepository); }
关于这部分的内容我们在之前的文章中有介绍.
FastMetricServicesConfiguration:
该类声明了如下注解:
@Configuration @ConditionalOnJava(JavaVersion.EIGHT) @ConditionalOnMissingBean(GaugeService.class)
- @Configuration–> 配置类
- @ConditionalOnJava(JavaVersion.EIGHT) –> 在jdk1.8及jdk1.8以上的环境中生效
- @ConditionalOnMissingBean(GaugeService.class) –> BeanFactory中不存在GaugeService类型的bean时生效.
声明了如下几个@Bean方法:
counterBuffers:
@Bean @ConditionalOnMissingBean public CounterBuffers counterBuffers() { return new CounterBuffers(); }
- @Bean –> 注册1个id为counterBuffers,类型为CounterBuffers的bean
- @ConditionalOnMissingBean–>BeanFactory中不存在CounterBuffers类型的bean时生效.
gaugeBuffers:
@Bean @ConditionalOnMissingBean public GaugeBuffers gaugeBuffers() { return new GaugeBuffers(); }
- @Bean –> 注册1个id为gaugeBuffers,类型为GaugeBuffers的bean
- @ConditionalOnMissingBean–>BeanFactory中不存在GaugeBuffers类型的bean时生效.
actuatorMetricReader:
@Bean @ExportMetricReader @ConditionalOnMissingBean public BufferMetricReader actuatorMetricReader(CounterBuffers counters, GaugeBuffers gauges) { return new BufferMetricReader(counters, gauges); }
- @Bean –> 注册1个id为actuatorMetricReader,类型为BufferMetricReader的bean
- @ConditionalOnMissingBean–>BeanFactory中不存在BufferMetricReader类型的bean时生效.
- @ExportMetricReader –> Qualifier注解
关于这个类的作用,我们后续会进行说明
counterService:
@Bean @ConditionalOnMissingBean(CounterService.class) public BufferCounterService counterService(CounterBuffers writer) { return new BufferCounterService(writer); }
- @Bean –> 注册1个id为counterService,类型为BufferCounterService的bean
- @ConditionalOnMissingBean–>BeanFactory中不存在CounterService类型的bean时生效.
gaugeService:
@Bean @ConditionalOnMissingBean(GaugeService.class) public BufferGaugeService gaugeService(GaugeBuffers writer) { return new BufferGaugeService(writer); }
- @Bean –> 注册1个id为gaugeService,类型为BufferGaugeService的bean
- @ConditionalOnMissingBean(GaugeService.class)–> BeanFactory中不存在BufferGaugeService类型的bean时生效.
LegacyMetricServicesConfiguration:
该类声明了如下注解:
@Configuration @ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) @ConditionalOnMissingBean(GaugeService.class)
- @Configuration –> 配置类
@ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) –> 在jdk1.8之前的环境中生效
@ConditionalOnMissingBean(GaugeService.class) –> BeanFactory中不存在GaugeService类型的bean时生效.
该类的字段,构造器如下:
private final MetricWriter writer; // 此时注入的是InMemoryMetricRepository LegacyMetricServicesConfiguration(@ActuatorMetricWriter MetricWriter writer) { this.writer = writer; }
声明了如下几个@Bean方法:
counterService:
@Bean @ConditionalOnMissingBean(CounterService.class) public DefaultCounterService counterService() { return new DefaultCounterService(this.writer); }
- @Bean –> 注册1个id为counterService,类型为DefaultCounterService的bean
- @ConditionalOnMissingBean(CounterService.class)–> BeanFactory中不存在CounterService类型的bean时生效.
gaugeService:
@Bean @ConditionalOnMissingBean(GaugeService.class) public DefaultGaugeService gaugeService() { return new DefaultGaugeService(this.writer); }
- @Bean –> 注册1个id为gaugeService,类型为DefaultGaugeService的bean
- @ConditionalOnMissingBean(GaugeService.class)–> BeanFactory中不存在GaugeService类型的bean时生效.
注意,在本文中提到的类,除了BufferMetricReader,InMemoryMultiMetricRepository 之外,其他的类都在之前的文章中有详细的介绍.