我个人认为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的额外内容。如果有评论或其他需要,我可能会再写。