我个人认为SpringBoot这种写法非常方便

首先

这是豊田高専2021年Advent Calendar的第19篇文章。
我很喜欢尝试SpringBoot,现在我想介绍一些我个人认为很方便的写法。

时间的处理方式

在Spring Boot中处理时间时,如果事先定义一个Bean作为Clock,编写测试会更容易。在编写测试时,可以使用@Before和@BeforeEach来定义要测试的日期的Instant,并将getClock进行模拟。

@Configuration
public class ClockConfig {
    @Bean
    public Clock getClock() {
        return Clock.system(ZoneId.of("Asia/Tokyo"));
    }
}
@Component
@RequiredArgsConstructor
public class Sample {
    private final ClockConfig clockConfig

    public void hoge() {
         Clock clock = clockConfig.getClock();
         LocalDateTime localDateTime = LocalDateTime.now(clock);
    }
}
@SpringBootTest(classes = Sample.class)
public class SampleTest {
    @Autowired
    Sample sample;

    @MockBean
    ClockConfig clockConfig;

    @BeforeEach
    public void beforeEach() {
        //clockの初期化
        Instant instant = Instant.parse("2021-01-01T09:45:32Z");
        doReturn(Clock.fixed(instant, ZoneId.of("Asia/Tokyo")).when(clockConfig).getClock();
    }
}

如何收集指标

可以使用测微计(Micrometer)来自由获取任意指标,如异常发生次数等。
可以通过Prometheus对获取的指标进行可视化。

在pom.xml文件中添加监控工具。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
    </dependencies>

请创建一个用于计算任何异常发生次数的类。
Metrics.counter的参数将包括指标名称、标签名称和标签详细信息。
可以通过以下示例代码获取的指标格式如下。

api_exception_count_total{exception="IOException",} 0.0
api_exception_count_total{exception="Exception",} 0.0
@Component
public class ExceptionCounter {
    private final Counter ioException;
    private final Counter exception;

    public ExceptionCounter() {
        this.ioException = Metrics.counter("api.exception.count", "exception", "IOException");
        this.exception = Metrics.counter("api.exception.count", "exception", "Exception");
    }

    public void incrementIoException() {
        this.ioException.increment();
    }

    public void incrementException() {
        this.exception.increment();
    }
}

在处理异常的类中注入此类,根据每个异常执行相应的increment方法,就可以使用Micrometer进行测量。

默认情况下,仅公开了prometheus端点的一部分,所以在application.properties中添加以下内容以打开端点。

management.endpoints.web.exposure.include=prometheus

您可以通过访问http://localhost:8080/actuator/prometheus来进行操作确认。

最后

由于时间不够,我放弃了写关于Junit5的ParameterizedTest的额外内容。如果有评论或其他需要,我可能会再写。

广告
将在 10 秒后关闭
bannerAds