spring boot 源码解析40-CounterService,GaugeService默认自动装配解析

前言

本文我们来分析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来禁用)

接下来我们就来分析吧.

解析

  1. MetricRepositoryAutoConfiguration 中声明3个静态配置类:

    1. LegacyMetricRepositoryConfiguration:

      1. 其声明了如下注解:

        @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. 声明了如下2个@Bean方法:

        1. actuatorMetricRepository,代码如下:

          @Bean
          @ExportMetricReader
          @ActuatorMetricWriter
          public InMemoryMetricRepository actuatorMetricRepository() {
              return new InMemoryMetricRepository();
          }
        2. actuatorMultiMetricRepository,代码如下:

          @Bean
          @ExportMetricReader
          @ActuatorMetricWriter
          public InMemoryMultiMetricRepository actuatorMultiMetricRepository(
                  InMemoryMetricRepository actuatorMetricRepository) {
              return new InMemoryMultiMetricRepository(actuatorMetricRepository);
          }

        关于这部分的内容我们在之前的文章中有介绍.

    2. FastMetricServicesConfiguration:

      1. 该类声明了如下注解:

        @Configuration
        @ConditionalOnJava(JavaVersion.EIGHT)
        @ConditionalOnMissingBean(GaugeService.class)
        • @Configuration–> 配置类
        • @ConditionalOnJava(JavaVersion.EIGHT) –> 在jdk1.8及jdk1.8以上的环境中生效
        • @ConditionalOnMissingBean(GaugeService.class) –> BeanFactory中不存在GaugeService类型的bean时生效.
      2. 声明了如下几个@Bean方法:

        1. counterBuffers:

          @Bean
          @ConditionalOnMissingBean
          public CounterBuffers counterBuffers() {
              return new CounterBuffers();
          }
          • @Bean –> 注册1个id为counterBuffers,类型为CounterBuffers的bean
          • @ConditionalOnMissingBean–>BeanFactory中不存在CounterBuffers类型的bean时生效.
        2. gaugeBuffers:

          @Bean
          @ConditionalOnMissingBean
          public GaugeBuffers gaugeBuffers() {
              return new GaugeBuffers();
          }
          • @Bean –> 注册1个id为gaugeBuffers,类型为GaugeBuffers的bean
          • @ConditionalOnMissingBean–>BeanFactory中不存在GaugeBuffers类型的bean时生效.
        3. 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注解

          关于这个类的作用,我们后续会进行说明

        4. counterService:

          @Bean
          @ConditionalOnMissingBean(CounterService.class)
          public BufferCounterService counterService(CounterBuffers writer) {
              return new BufferCounterService(writer);
          }
          • @Bean –> 注册1个id为counterService,类型为BufferCounterService的bean
          • @ConditionalOnMissingBean–>BeanFactory中不存在CounterService类型的bean时生效.
        5. 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时生效.
    3. LegacyMetricServicesConfiguration:

      1. 该类声明了如下注解:

        @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时生效.

      2. 该类的字段,构造器如下:

        private final MetricWriter writer;
        // 此时注入的是InMemoryMetricRepository
        LegacyMetricServicesConfiguration(@ActuatorMetricWriter MetricWriter writer) {
            this.writer = writer;
        }
    4. 声明了如下几个@Bean方法:

      1. 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时生效.
      2. 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 之外,其他的类都在之前的文章中有详细的介绍.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值