8IBU`T/FXJO
4QSJOH#PPU
+46(ษ‫ڧ‬ձ
஑୩ɹஐߦ
w೔ຊ4QSJOHϢʔβձ	+46(
ελοϑ
w๭4*FSͰιϑτ΢ΣΞΞʔΩςΫτ

ʢ࣮ଶ͸؅ཧ‫ۀ‬຿ଟΊɾɾɾʣ

w๭ॻͷචऀͷҰਓ
ࣗ‫঺ݾ‬հ
IUUQTXXXTIPFJTIBDPKQCPPLEFUBJM
7.8BSFຘ͞ΜͷߨԋࢿྉΛࢀর
ࢀߟɿա‫ڈ‬ͷ8IBU`T/FXγϦʔζ

IUUQTEPDTHPPHMFDPNQSFTFOUBUJPOE
F1659)X'R0
%8@OQ33RT1US'S7O;IPDGR0-H'L
FEJUTMJEFJEHD@@
IUUQTEPDTHPPHMFDPNQSFTFOUBUJPOE
S1.'QU+N6)/SE5Y;1S#PFDC8D
B(VKG7J#1FEJUTMJEFJEQ
w ϥΠϑαΠΫϧ౳
w ৽‫ػ‬ೳʗվળ
w ‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
w υΩϡϝϯτվળ
ΞδΣϯμ

IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU3FMFBTF/PUFT
w 4QSJOH#PPU͔Β͸൒೥̍ճස౓ͰϦϦʔεʢ+%,ͱରԠʣ
w 4QSJOH#PPUͷ0-͸݄
ϥΠϑαΠΫϧ
Version Released Expected End of
Life
ґଘSpring
Framework
ґଘSpring
Cloud
ରԠJavaό
ʔδϣϯ
2.5.x May 2021 February 2023 5.3 2020.0.3 16ʙ8
2.4.x November 2020 August 2022 5.3 2020.0.3

2020.0.0
15ʙ8
2.3.x May 2020 February 2022 5.2 Hoxton.SR11 14ʙ8
2.2.x October 2019 July 2021 5.2 Hoxton.SR11 13ʙ8
IUUQTTUBSUTQSJOHJPBDUVBUPSJOGP
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4VQQPSUFE7FSTJPOTSFMFBTFEWFSTJPOT
044ͱͯ͠ͷக໋తόά΍੬ऑੑ΁ͷαϙʔτͷϙϦγ

ʢॏཁͳ࿩ͳͷͰɺਖ਼ࣜʹ͸ެࣜ63-Ͱ֬ೝΛʣ
w ϝδϟʔόʔδϣϯ͸ϦϦʔε͔Β࠷௿೥͸αϙʔτ͞ΕΔ
ʢͨͩ͠αϙʔτର৅ͷϚΠφʔόʔδϣϯͰ͋Δඞཁʣ
w ϚΠφʔόʔδϣϯ͸࠷௿ϲ݄͸αϙʔτ͞ΕΔ
w 0-͸ϦϦʔεΑΓϲ݄
ࢀߟɿ4QSJOH#PPUͷ044αϙʔτϙϦγ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4VQQPSUFE7FSTJPOTTQSJOHCPPUTVQQPSUQPMJDZ
w ϥΠϑαΠΫϧ౳
w ৽‫ػ‬ೳʗվળ
w ‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
w υΩϡϝϯτվળ
ΞδΣϯμ

IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU3FMFBTF/PUFT
w ‫ڥ؀‬ม਺ͷϓϨϑΟοΫε
w 4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ
w %BUB4PVSDF#FBOͷੜ੒ॱংͷվળ
w 3%#$Ͱͷσʔλιʔεॳ‫ظ‬Խ
w ͦͷଞ
4QSJOH#PPU৽‫ػ‬ೳʗվળ
͜Ε·ͰɺಉҰ‫ڥ؀‬ʢಉҰίϯςφ౳ʣͰෳ਺4QSJOH#PPUΛ‫ى‬ಈ
͢Δ৔߹ɺ4QSJOH#PPU༻‫ڥ؀‬ม਺͕‫͍ͨͯͬ·ͯ͠͠߹ڝ‬ɻ
‫ڥ؀‬ม਺ͷϓϨϑΟοΫε

$export SERVER_PORT=8090
$export FUGA_SERVER_PORT=8091
$java -jar hoge.jar
…
$java -jar fuga.jar --server.port=$FUGA_SERVER_PORT
…
ઃఆͷ૿‫ݮ‬ͷ࣌ɺ͍͍ͪͪ
Ϛοϐϯά͕໘౗
‫ڥ؀‬ม਺΁ͷ֎ग़͠͸
࠷ۙͰ͸.VTU
৽‫ػ‬ೳʗվળ
Y
ΞϓϦέʔγϣϯຖʹϓϨϑΟοΫεΛઃఆՄೳʹͳΓɺ‫߹ڝ‬Λආ
͚Δ͜ͱ͕Մೳɻ
‫ڥ؀‬ม਺ͷϓϨϑΟοΫε

$export SERVER_PORT=8090
$export FUGA_SERVER_PORT=8091
$java -jar hoge.jar
…
$java -jar fuga.jar
…
কདྷɺΧελϜ͍ͨ͠ม਺
͕૿͑ͯ΋҆৺
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setEnvironmentPrefix(fuga);
application.run(args);
} ‫ڥ؀‬ม਺ͷϓϨϑΟοΫε
Λࢦఆ
ϓϨϑΟοΫε෇͖ͷ
‫ڥ؀‬ม਺Λఆٛ
৽‫ػ‬ೳʗվળ
Y
w ‫ڥ؀‬ม਺ͷϓϨϑΟοΫε
w 4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ
w %BUB4PVSDF#FBOͷੜ੒ॱংͷվળ
w 3%#$Ͱͷσʔλιʔεॳ‫ظ‬Խ
w ͦͷଞ
4QSJOH#PPU৽‫ػ‬ೳʗվળ
4QSJOH%BUB3FQPTJUPSZͷར༻࣮੷͕ɺDUVBUPSͷNFUSJDTΤϯ
υϙΠϯτ΍.JDSPNFUFSʹެ։Ͱ͖ΔΑ͏ʹͳͬͨɻ
4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ

{
name: spring.data.repository.invocations,
description: null,
baseUnit: seconds,
measurements: [
{
statistic: COUNT,
value: 4
},
{
statistic: TOTAL_TIME,
value: 0.216646629
},
{
statistic: MAX,
value: 0.211294863
}
],
availableTags: [
{
tag: exception,
values: [None]
},
{
tag: method,
values: [findAll]
},
{
tag: state,
values: [SUCCESS]
},
{
tag: repository,
values: [TodoRepository]
}]}
IUUQMPDBMIPTUBDUVBUPSNFUSJDTTQSJOHEBUBSFQPTJUPSZJOWPDBUJPOT
.FUSJDTΤϯυϙΠϯτͷྫ
৽‫ػ‬ೳʗվળ
4QSJOH%BUB3FQPTJUPSZͷར༻࣮੷͕ɺDUVBUPSͷNFUSJDTΤϯ
υϙΠϯτ΍.JDSPNFUFSʹެ։Ͱ͖ΔΑ͏ʹͳͬͨɻ
4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ

{
name: spring.data.repository.invocations,
description: null,
baseUnit: seconds,
measurements: [
{
statistic: COUNT,
value: 4
},
{
statistic: TOTAL_TIME,
value: 0.216646629
},
{
statistic: MAX,
value: 0.211294863
}
],
availableTags: [
{
tag: exception,
values: [None]
},
{
tag: method,
values: [findAll]
},
{
tag: state,
values: [SUCCESS]
},
{
tag: repository,
values: [TodoRepository]
}]}
IUUQMPDBMIPTUBDUVBUPSNFUSJDTTQSJOHEBUBSFQPTJUPSZJOWPDBUJPOT
.FUSJDTΤϯυϙΠϯτͷྫ
‫ͼݺ‬ग़͠ճ਺
૯ॴ༻࣌ؒ
࠷େॴ༻࣌ؒ
ϝιου໊
ൃੜྫ֎
࣮ߦ݁Ռঢ়ଶ
ର৅ϦϙδτϦ
৽‫ػ‬ೳʗվળ
4QSJOH%BUB3FQPTJUPSZͷར༻࣮੷͕ɺDUVBUPSͷNFUSJDTΤϯ
υϙΠϯτ΍.JDSPNFUFSʹެ։Ͱ͖ΔΑ͏ʹͳͬͨɻ
4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ

1SPNFUFVTग़ྗͷྫ
# HELP spring_data_repository_invocations_seconds_max
# TYPE spring_data_repository_invocations_seconds_max gauge
spring_data_repository_invocations_seconds_max{exception=None,method=fi
ndAll,repository=TodoRepository,state=SUCCESS,} 0.111220909
# HELP spring_data_repository_invocations_seconds
# TYPE spring_data_repository_invocations_seconds summary
spring_data_repository_invocations_seconds_count{exception=None,method=
findAll,repository=TodoRepository,state=SUCCESS,} 1.0
spring_data_repository_invocations_seconds_sum{exception=None,method=fi
ndAll,repository=TodoRepository,state=SUCCESS,} 0.111220909
IUUQMPDBMIPTUBDUVBUPSQSPNFUIFVT
৽‫ػ‬ೳʗվળ
4QSJOH%BUB3FQPTJUPSZͷར༻࣮੷͕ɺDUVBUPSͷNFUSJDTΤϯ
υϙΠϯτ΍.JDSPNFUFSʹެ։Ͱ͖ΔΑ͏ʹͳͬͨɻ
4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ

1SPNFUFVTग़ྗͷྫ
# HELP spring_data_repository_invocations_seconds_max
# TYPE spring_data_repository_invocations_seconds_max gauge
spring_data_repository_invocations_seconds_max{exception=None,method=fi
ndAll,repository=TodoRepository,state=SUCCESS,} 0.111220909
# HELP spring_data_repository_invocations_seconds
# TYPE spring_data_repository_invocations_seconds summary
spring_data_repository_invocations_seconds_count{exception=None,method=
findAll,repository=TodoRepository,state=SUCCESS,} 1.0
spring_data_repository_invocations_seconds_sum{exception=None,method=fi
ndAll,repository=TodoRepository,state=SUCCESS,} 0.111220909
IUUQMPDBMIPTUBDUVBUPSQSPNFUIFVT
ͲͷςʔϒϧʹͲͷ͘Β͍ΞΫηε͍ͯ͠Δ͔ɺॴཁ࣌ؒ͸Ͳͷ͘
Β͍͔͕೺ѲͰ͖Δ
ˣ
͏·͘Ճ޻ɾՄࢹԽ͢Ε͹ੑೳνϡʔχϯάͰ‫
͏͖ͦͰ༻׆‬
ʢࠓճ͸ؒʹ߹ΘͣՄࢹԽ͸লུʣ
৽‫ػ‬ೳʗվળ
खॱ̍ɿDUVBUPSͷઃఆΛมߋ͠ɺNFUSJDTΤϯυϙΠϯτ΍
1SPNFUIFVTͷެ։ઃఆΛߦ͏ɻ
खॱ̎ɿNJDSPNFUFSSFHJTUSZQSPNFUIFVTͷ௥Ճ

ʢ1SPNFUIFVTग़ྗͷ৔߹ʣ
4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ

management.endpoints.web.exposure.include=health,info,metrics,prometheus
BQQMJDBUJPOQSPQFSUJFT
dependency
groupIdio.micrometer/groupId
artifactIdmicrometer-registry-prometheus/artifactId
scoperuntime/scope
/dependency
QPNYNM
৽‫ػ‬ೳʗվળ
खॱ̏ɿ4QSJOH%BUB3FQPTJUPSZΛར༻͢Δɻ

ॳճΞΫηεҎ߱ʹ‫ه‬࿥͕։࢝͞ΕΔɻ
4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ

@GetMapping(todo/selectall)
@Transactional(readOnly = true)
public ListTodo selectAll() {
ListTodo todoList = new ArrayList();
todoRepository.findAll().iterator().forEachRemaining(todoList::add);
return todoList;
}
public interface TodoRepository extends CrudRepositoryTodo, String {
}
৽‫ػ‬ೳʗվળ
w ‫ڥ؀‬ม਺ͷϓϨϑΟοΫε
w 4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ
w %BUB4PVSDF#FBOͷੜ੒ॱংͷվળ
w 3%#$Ͱͷσʔλιʔεॳ‫ظ‬Խ
w ͦͷଞ
4QSJOH#PPU৽‫ػ‬ೳʗվળ
͜Ε·Ͱ͸ɺ%BUB4PVSDFʹؔ࿈͢Δ#FBOͷੜ੒ॱং੍͕‫͞ޚ‬Ε
͓ͯΒͣɺ॥‫؀‬ґଘΤϥʔ͕ൃੜ͢Δέʔε͕͋ͬͨɻ
%BUB4PVSDF#FBOͷੜ੒ॱংͷվળ

@Bean
public DataSource dataSource1(DataSourceProperties properties) {
…
}
@Bean
public DataSource dataSource2(DataSourceProperties properties) {
…
}
@Bean
@Primary
public AbstractRoutingDataSource routingDataSource(
@Qualifier(dataSource1) DataSource dataSource1,
@Qualifier(dataSource2) DataSource dataSource2) {
…
}
৽‫ػ‬ೳʗվળ
͜Ε·Ͱ͸ɺ%BUB4PVSDFΛར༻͢Δ#FBOੜ੒ॱং੍͕‫͞ޚ‬Εͯ
͓Βͣɺ॥‫؀‬ґଘΤϥʔ͕ൃੜ͢Δέʔε͕͋ͬͨɻ
%BUB4PVSDF#FBOͷੜ੒ॱংͷվળ

@Bean
public DataSource dataSource1(DataSourceProperties properties) {
…
}
@Bean
public DataSource dataSource2(DataSourceProperties properties) {
…
}
@Bean
@Primary
public AbstractRoutingDataSource routingDataSource(
@Qualifier(dataSource1) DataSource dataSource1,
@Qualifier(dataSource2) DataSource dataSource2) {
…
}
॥‫؀‬ґଘΤϥʔ͕ൃੜ
Y
৽‫ػ‬ೳʗվળ
શ͘ಉ͡ίʔυͰ΋ɺ4QSJOH#PPUYͰ͸॥‫؀‬ΤϥʔͱͳΒͣ
ਖ਼ৗʹ‫ى‬ಈ͢Δɻ
%BUB4PVSDF#FBOͷੜ੒ॱংͷվળ

@Bean
public DataSource dataSource1(DataSourceProperties properties) {
…
}
@Bean
public DataSource dataSource2(DataSourceProperties properties) {
…
}
@Bean
@Primary
public AbstractRoutingDataSource routingDataSource(
@Qualifier(dataSource1) DataSource dataSource1,
@Qualifier(dataSource2) DataSource dataSource2) {
…
}
Τϥʔͳ͘ਖ਼ৗ‫ى‬ಈ
Y
IUUQTEPDTTQSJOHJPTQSJOHCPPUEPDTSFGFSFODFIUNMIPXUPIUNMIPXUPEBUBJOJUJBMJ[BUJPOEFQFOEFODJFTEFQFOETPO
JOJUJBMJ[BUJPOEFUFDUJPO
৽‫ػ‬ೳʗվળ
w ‫ڥ؀‬ม਺ͷϓϨϑΟοΫε
w 4QSJOH%BUB3FQPTJUPSZͷϝτϦΫεެ։ରԠ
w %BUB4PVSDF#FBOͷੜ੒ॱংͷվળ
w 3%#$Ͱͷσʔλιʔεॳ‫ظ‬Խ
w ͦͷଞ
4QSJOH#PPU৽‫ػ‬ೳʗվળ
͜Ε·Ͱɺ3%#$σʔλιʔεʢ$POOFDUJPO'BDUPSZʣͰ͸%#
ॳ‫ظ‬Խ‫ػ‬ೳʢTDIFNBTRMEBUBTRMʣ͕ར༻Ͱ͖ͣɺҎԼ࣮૷͕ඞ
ཁ͕ͩͬͨɺY͔Β࣮૷͕ෆཁͱͳͬͨɻ
σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷ3%#$ରԠ

// 2.5.x ͔Β͸࣮૷ෆཁʹͳͬͨ
@Configuration(proxyBeanMethods = false)
static class DatabaseInitializationConfiguration {
@Autowired
void initializeDatabase(ConnectionFactory connectionFactory) {
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource[] scripts = new Resource[] { resourceLoader.getResource(classpath:schema.sql),
resourceLoader.getResource(classpath:data.sql) };
new ResourceDatabasePopulator(scripts).populate(connectionFactory).block();
}
}
Y
IUUQTEPDTTQSJOHJPTQSJOHCPPUEPDTSFGFSFODFIUNMTJOHMFIPXUPJOJUJBMJ[FBEBUBCBTFVTJOHSECD
৽‫ػ‬ೳʗվળ
w %PDLFS*NBHF#VJMEJOH4VQQPSUʢຘ͞ΜϋϯζΦϯʹͯ঺հʣ
w $VTUPN#VJMEQBDLT
w ϘϦϡʔϜͷCJOEJOH
w ࣮ߦՄೳ8BSͷ%PDLFS*NBHFαϙʔτ
w -BZFSFE8BST
w )551PWFS5$1	ID

w 0QFO.FUSJDTGPS1SPNFUIFVT
w 8FC'MVYͰͷ!5JNFE
w .POHP%#.FUSJDT
w -JRVJCBTF%BUB4PVSDF
w (5SFRVFTUTUPBDUVBUPSTUBSUVQ
w DUVBUPSOEQPJOUGPS2VBSU[
ͦͷଞ

৽‫ػ‬ೳʗվળ
IUUQTTQSJOHCPPUDOCIPMBQQTQDGPOFJP
IUUQTTQSJOHCPPUDOCIPMBQQTQDGPOFJP
IUUQTTQSJOHCPPUDOCIPMBQQTQDGPOFJP
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU3FMFBTF/PUFT
w ϥΠϑαΠΫϧ౳
w ৽‫ػ‬ೳʗվળ
w ‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
w υΩϡϝϯτվળ
ΞδΣϯμ

IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU3FMFBTF/PUFT
w σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷϦϑΝΫλ
w σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬
w %FGBVMUSSPS7JFXͷϝοηʔδඇදࣔ
w CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ
w SSPS$POUSPMMFSͷHFUSSPS1BUI	
ͷഇࢭ
w ͦͷଞ
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
4DSJQUͰͷ%#ॳ‫ظ‬Խ‫ػ‬ೳʢTDIFNBTRMEBUBTRMʣͷ಺෦ߏ଄ͷ
มߋ͕͋ΓɺϓϩύςΟ͕มߋʹͳ͍ͬͯΔɻ
σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷϦϑΝΫλ

YҎલʢY͔Βඇਪ঑ʣ YҎ߱ આ໌
TQSJOHEBUBTPVSDFJOJUJBMJ[BUJPONPEF
TQSJOHTRMJOJUFOBCMFE	

TQSJOHTRMJOJUNPEF
%#ॳ‫ظ‬Խ‫ػ‬ೳΛ࡞ಈͤ͞Δ৚݅
TQSJOHEBUBTPVSDFQMBUGPSN TQSJOHTRMJOJUQMBUGPSN
EBUBTRMɺTDIFNBTRMͷ෦෼ͷ
ࢦఆ
TQSJOHEBUBTPVSDFTDIFNB TQSJOHTRMJOJUTDIFNBMPDBUJPOT TDIFNBTRMͷϦιʔεύε
TQSJOHEBUBTPVSDFTDIFNBVTFSOBNF TQSJOHTRMJOJUVTFSOBNF TDIFNBTRMͷ%#Ϣʔβ໊
TQSJOHEBUBTPVSDFTDIFNBQBTTXPSE TQSJOHTRMJOJUQBTTXPSE TDIFNBTRMͷ%#Ϣʔβύεϫʔυ
TQSJOHEBUBTPVSDFEBUB TQSJOHTRMJOJUEBUBMPDBUJPOT EBUBTRMͷϦιʔεύε
TQSJOHEBUBTPVSDFEBUBVTFSOBNF TQSJOHTRMJOJUVTFSOBNF EBUBTRMͷ%#Ϣʔβ໊
TQSJOHEBUBTPVSDFEBUBQBTTXPSE TQSJOHTRMJOJUQBTTXPSE EBUBTRMͷ%#Ϣʔβύεϫʔυ
TQSJOHEBUBTPVSDFDPOUJOVFPOFSSPS TQSJOHTRMJOJUDPOUJOVFPOFSSPS
4DSJQU్தͰΤϥʔ͕‫ܧʹ͖࣌ͨى‬
ଓ͢Δ͔
TQSJOHEBUBTPVSDFTFQBSBUPS TQSJOHTRMJOJUTFQBSBUPS 4DSJQUͷ۠੾Γจࣈ
TQSJOHEBUBTPVSDFTRMTDSJQUFODPEJOH TQSJOHTRMJOJUFODPEJOH 4DSJQUͷจࣈΤϯίʔσΟϯά
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
4DSJQUͰͷ%#ॳ‫ظ‬Խ‫ػ‬ೳʢTDIFNBTRMEBUBTRMʣͷ಺෦ߏ଄ͷ
มߋ͕͋ΓɺϓϩύςΟ͕มߋʹͳ͍ͬͯΔɻ
σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷϦϑΝΫλ

YҎલʢY͔Βඇਪ঑ʣ YҎ߱ આ໌
TQSJOHEBUBTPVSDFJOJUJBMJ[BUJPONPEF
TQSJOHTRMJOJUFOBCMFE	

TQSJOHTRMJOJUNPEF
%#ॳ‫ظ‬Խ‫ػ‬ೳΛ࡞ಈͤ͞Δ৚݅
TQSJOHEBUBTPVSDFQMBUGPSN TQSJOHTRMJOJUQMBUGPSN
EBUBTRMɺTDIFNBTRMͷ෦෼ͷ
ࢦఆ
TQSJOHEBUBTPVSDFTDIFNB TQSJOHTRMJOJUTDIFNBMPDBUJPOT TDIFNBTRMͷϦιʔεύε
TQSJOHEBUBTPVSDFTDIFNBVTFSOBNF TQSJOHTRMJOJUVTFSOBNF TDIFNBTRMͷ%#Ϣʔβ໊
TQSJOHEBUBTPVSDFTDIFNBQBTTXPSE TQSJOHTRMJOJUQBTTXPSE TDIFNBTRMͷ%#Ϣʔβύεϫʔυ
TQSJOHEBUBTPVSDFEBUB TQSJOHTRMJOJUEBUBMPDBUJPOT EBUBTRMͷϦιʔεύε
TQSJOHEBUBTPVSDFEBUBVTFSOBNF TQSJOHTRMJOJUVTFSOBNF EBUBTRMͷ%#Ϣʔβ໊
TQSJOHEBUBTPVSDFEBUBQBTTXPSE TQSJOHTRMJOJUQBTTXPSE EBUBTRMͷ%#Ϣʔβύεϫʔυ
TQSJOHEBUBTPVSDFDPOUJOVFPOFSSPS TQSJOHTRMJOJUDPOUJOVFPOFSSPS
4DSJQU్தͰΤϥʔ͕‫ܧʹ͖࣌ͨى‬
ଓ͢Δ͔
TQSJOHEBUBTPVSDFTFQBSBUPS TQSJOHTRMJOJUTFQBSBUPS 4DSJQUͷ۠੾Γจࣈ
TQSJOHEBUBTPVSDFTRMTDSJQUFODPEJOH TQSJOHTRMJOJUFODPEJOH 4DSJQUͷจࣈΤϯίʔσΟϯά
஫ҙ఺ᶃ
w ͸݁ߏා͍όά͕ɾɾɾ
w ຊ൪‫ڥ؀‬%#Λॳ‫ظ‬Խ͠ͳ͍Α͏஫ҙ
࡞ಈ৚݅ Y
૊ࠐ%#ͷ৔߹ͷΈ FNCFEEFE
FNCFEEFE
 FNCFEEFE
FNCFEEFE
ৗʹ࡞ಈ BMXBZT USVF BMXBZT
ແޮ OFWFS GBMTF OFWFS
σϑΥϧτ஋
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUJTTVFT
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
4DSJQUͰͷ%#ॳ‫ظ‬Խ‫ػ‬ೳʢTDIFNBTRMEBUBTRMʣͷ಺෦ߏ଄ͷ
มߋ͕͋ΓɺϓϩύςΟ͕มߋʹͳ͍ͬͯΔɻ
σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷϦϑΝΫλ

YҎલʢY͔Βඇਪ঑ʣ YҎ߱ આ໌
TQSJOHEBUBTPVSDFJOJUJBMJ[BUJPONPEF
TQSJOHTRMJOJUFOBCMFE	

TQSJOHTRMJOJUNPEF
%#ॳ‫ظ‬Խ‫ػ‬ೳΛ࡞ಈͤ͞Δ৚݅
TQSJOHEBUBTPVSDFQMBUGPSN TQSJOHTRMJOJUQMBUGPSN
EBUBTRMɺTDIFNBTRMͷ෦෼ͷ
ࢦఆ
TQSJOHEBUBTPVSDFTDIFNB TQSJOHTRMJOJUTDIFNBMPDBUJPOT TDIFNBTRMͷϦιʔεύε
TQSJOHEBUBTPVSDFTDIFNBVTFSOBNF TQSJOHTRMJOJUVTFSOBNF TDIFNBTRMͷ%#Ϣʔβ໊
TQSJOHEBUBTPVSDFTDIFNBQBTTXPSE TQSJOHTRMJOJUQBTTXPSE TDIFNBTRMͷ%#Ϣʔβύεϫʔυ
TQSJOHEBUBTPVSDFEBUB TQSJOHTRMJOJUEBUBMPDBUJPOT EBUBTRMͷϦιʔεύε
TQSJOHEBUBTPVSDFEBUBVTFSOBNF TQSJOHTRMJOJUVTFSOBNF EBUBTRMͷ%#Ϣʔβ໊
TQSJOHEBUBTPVSDFEBUBQBTTXPSE TQSJOHTRMJOJUQBTTXPSE EBUBTRMͷ%#Ϣʔβύεϫʔυ
TQSJOHEBUBTPVSDFDPOUJOVFPOFSSPS TQSJOHTRMJOJUDPOUJOVFPOFSSPS
4DSJQU్தͰΤϥʔ͕‫ܧʹ͖࣌ͨى‬
ଓ͢Δ͔
TQSJOHEBUBTPVSDFTFQBSBUPS TQSJOHTRMJOJUTFQBSBUPS 4DSJQUͷ۠੾Γจࣈ
TQSJOHEBUBTPVSDFTRMTDSJQUFODPEJOH TQSJOHTRMJOJUFODPEJOH 4DSJQUͷจࣈΤϯίʔσΟϯά
஫ҙ఺ᶄ
w YҎલ͸TDIFNBTRMͱEBUBTRMΛผͷ%#ϢʔβͰ࣮ߦͰ͖ͨ
w YͰ͸ಉҰ%#ϢʔβͰͷΈ࣮ߦͰ͖Δʢઃఆ΋ҰຊԽʣ
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
w σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷϦϑΝΫλ
w σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬
w %FGBVMUSSPS7JFXͷϝοηʔδඇදࣔ
w CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ
w SSPS$POUSPMMFSͷHFUSSPS1BUI	
ͷഇࢭ
w ͦͷଞ
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
ΞϓϦέʔγϣϯ৘ใΛ։ࣔ͢ΔDUVBUPSͷʮJOGPʯ͕σϑΥϧ
τͰެ։͞Εͳ͘ͳͬͨɻ
σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬

IUUQTEPDTTQSJOHJPTQSJOHCPPUEPDTSFGFSFODFIUNMBDUVBUPSIUNMBDUVBUPS
Y:FT
ˣ
Y/P
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
4QSJOH4FDVSJUZґଘແ͠ͷΞϓϦέʔγϣϯͷ৔߹
σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬

Y Y
ެ։͞Ε͍ͯͳ͍
ʮHJUDPNNJUJEQMVHJOʯΛ༻͍ͯϏϧυ࣌ʹHJUQSPQFSUJFTΛੜ੒ͨ͠৔߹ͷྫ
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
4QSJOH4FDVSJUZґଘ͋ΓͷΞϓϦέʔγϣϯͷ৔߹
σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬

Y
Y
w ೝূର৅ͱͳͬͨ
w ެ։͞Ε͍ͯͳ͍
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
อ‫ޢ‬Λղআ͢Δํ๏
σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬

Y
management.endpoints.web.exposure.include=health,info
BQQMJDBUJPOQSPQFSUJFT
ެ։͞Εͨ
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
w σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷϦϑΝΫλ
w σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬
w %FGBVMUSSPS7JFXͷϝοηʔδඇදࣔ
w CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ
w SSPS$POUSPMMFSͷHFUSSPS1BUI	
ͷഇࢭ
w ͦͷଞ
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
4QSJOH#PPUʹͯσϑΥϧτͰۭจࣈஔ͖‫͑͞׵‬ΕΔΑ͏ʹͳ
ͬͨΤϥʔϝοηʔδ͕ɺ͔Β͸߲໨͝ͱ࡟আ͞Εͨɻ
%FGBVMUSSPS7JFXͷϝοηʔδඇදࣔ


UJNFTUBNQ5
TUBUVT

FSSPS#BE3FRVFTU

QBUIFSSPS@NFTTBHF
^
Y

UJNFTUBNQ5
TUBUVT

FSSPS#BE3FRVFTU

NFTTBHF

QBUIFSSPS@NFTTBHF
^ NFTTBHF߲໨
ࣗମ͕ͳ͘ͳͬͨ
YʙY

UJNFTUBNQ5
TUBUVT

FSSPS#BE3FRVFTU

NFTTBHF5453303.44(

QBUIFSSPS@NFTTBHF
^
Y
NFTTBHF͕σϑΥͰ
ۭจࣈʹͳͬͨ
@GetMapping(error_message)
public String errorMessage() {
throw new ResponseStatusException(
HttpStatus.BAD_REQUEST,
TEST ERROR MESSAGE);
}
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
ϝοηʔδΛද͍ࣔͨ͠৔߹͸ɺ4QSJOH#PPUʙͰͷରԠͱ
ಉ༷ͷઃఆΛߦ͏ɻ
%FGBVMUSSPS7JFXͷϝοηʔδඇදࣔ


UJNFTUBNQ5
TUBUVT

FSSPS#BE3FRVFTU

NFTTBHF5453303.44(

QBUIFSSPS@NFTTBHF
^
Y
NFTTBHF߲໨
ͱϝοηʔδ͕෮‫ͨ͠׆‬
server.error.include-message=always
BQQMJDBUJPOQSPQFSUJFT
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
w σʔλϕʔεॳ‫ظ‬Խ‫ػ‬ೳͷϦϑΝΫλ
w σϑΥϧτͰͷJOGPΤϯυϙΠϯτͷอ‫ޢ‬
w %FGBVMUSSPS7JFXͷϝοηʔδඇදࣔ
w CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ
w SSPS$POUSPMMFSͷHFUSSPS1BUI	
ͷഇࢭ
w ͦͷଞ
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
CTUSBDU3PVUJOH%BUB4PVSDFʹର͢ΔϔϧενΣοΫ͕ਖ਼֬ʹ‫ػ‬
ೳ͢ΔΑ͏ʹͳͬͨɻ
CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ
Y

Y
management.endpoint.health.show-details=always
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
Կ͔͠Βͷϧʔϧʹ‫͍ͯͮج‬ɺෳ਺ͷ%BUB4PVSDFΛಈతʹ੾Γସ
͑Δ͜ͱ͕Մೳͳ%BUB4PVSDFɻ
ࢀߟɹCTUSBDU3PVUJOH%BUB4PVSDFʹ͍ͭͯ

CTUDBU3PVUJOH
%BUB4PVSDF
۩৅Ϋϥε
QQMJDBUJPO
%BUB4PVSDF
%BUB4PVSDF
ɾɾɾ ɾɾɾ
%BUB4PVSDFͷৼΓ෼͚ϧʔϧΛ࣮૷
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {
@Override
protected Object determineCurrentLookupKey() {
return idHolder.getId() % 2 == 0 ? even : odd;
}
};
routingDataSource.setTargetDataSources(
Map.of(even, dataSource1, odd, dataSource2));
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
FWFO
PEE
JE
4QSJOH#PPUYͷϔϧενΣοΫͰ͸੾Γସ͑ର৅ͷ
%BUB4PVSDFશͯͷϔϧενΣοΫΛߦ͏ɻ
CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ

CTUDBU3PVUJOH
%BUB4PVSDF
۩৅Ϋϥε
QQMJDBUJPO
%BUB4PVSDF
%BUB4PVSDF
ɾɾɾ ɾɾɾ
DUVBUPS
-PBE#BMBODFS
)FBMUI
)FBMUI
)FBMUI
)FBMUI
)FBMUI 61
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
Y
%#͕̍ͭͰ΋ো֐͕‫͖ى‬ΔͱϔϧενΣοΫ͕/(ͱͳΔΑ͏ʹͳ
ͬͨɻ
CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ

CTUDBU3PVUJOH
%BUB4PVSDF
۩৅Ϋϥε
QQMJDBUJPO
%BUB4PVSDF
%BUB4PVSDF
ɾɾɾ ɾɾɾ
DUVBUPS
-PBE#BMBODFS
)FBMUI
)FBMUI
)FBMUI
)FBMUI
)FBMUI %08/ҟৗΠϯελϯεͱΈͳ͠ɺ-#͔Β੾Γ཭͠౳
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬
Y
Ұ෦ͷ%#͚ͩͰαʔϏε‫ܧ‬ଓ͞
͍ͤͨ৔߹͸໰୊͋Γ
ແޮʹ͍ͨ͠৔߹͸ɺҎԼͰઃఆΛ0''ʹ͢Δɻ
CTUSBDU3PVUJOH%BUB4PVSDFͷϔϧενΣοΫ࢓༷มߋ

# AbstractRoutingDataSourceҎ֎ͷDataSource͕ଘࡏ͢Δ৔߹
management.health.db.ignore-routing-data-sources=true
# ଘࡏ͠ͳ͍৔߹
management.health.db.enabled=false
BQQMJDBUJPOQSPQFSUJFT
Y
‫ط‬ଘ‫ػ‬ೳͷมߋ΍Ө‫ڹ‬

What's New in Spring Boot 2.5