Slide 1

Slide 1 text

#JJUG Shin Tanimoto / 2025-04-17 SPRING BOOTͰ࣮૷ͱΠϯϑϥΛ ͜ΕͰ΋͔ͱ෼཭͢ΔͨΊͷࢼΈ JJUGφΠτηϛφʔ 2025೥4݄

Slide 2

Slide 2 text

୩ຊ ৺ (Shin Tanimoto) EverforthɺAcroquest Technologyͷ2ࣾͰಇ͘ΤϯδχΞ Java ChampionɺOracle ACEɺJJUG୅ද ஶॻʮJavaຊ֨ೖ໳ʯ झຯ͸ϕϏϝλͷϥΠϒͱϑΝϯΧϜࡱӨ Twitter - @cero_t ࣗݾ঺հ

Slide 3

Slide 3 text

࠷ۙɺաܹ೿ͷਓ͕πΠολʔʢݱɿXʣʹډͯා͍ͷͰ͕͢… ࣗݾ঺հ

Slide 4

Slide 4 text

Spring Boot + Spring CloudΛ࢖ͬͯϚΠΫϩαʔϏε։ൃΛ͢Δ͜ͱ਺೥ ΞϓϦέʔγϣϯྖҬ಺ʹؔ৺ࣄ͕૿͍͑ͯͬͨ ໰୊ҙࣝͷഎܠ Spring Boot ΞϓϦέʔγϣϯྖҬ

Slide 5

Slide 5 text

ΞϓϦέʔγϣϯྖҬ Spring Boot + Spring CloudΛ࢖ͬͯϚΠΫϩαʔϏε։ൃΛ͢Δ͜ͱ਺೥ ΞϓϦέʔγϣϯྖҬ಺ʹؔ৺ࣄ͕૿͍͑ͯͬͨ ໰୊ҙࣝͷഎܠ Spring Cloud Eureka ผͷSpring Boot ϚΠΫϩαʔϏε Spring Boot

Slide 6

Slide 6 text

Spring Boot + Spring CloudΛ࢖ͬͯϚΠΫϩαʔϏε։ൃΛ͢Δ͜ͱ਺೥ ΞϓϦέʔγϣϯྖҬ಺ʹؔ৺ࣄ͕૿͍͑ͯͬͨ ໰୊ҙࣝͷഎܠ Spring Cloud Eureka Spring Cloud Stream ผͷSpring Boot ϚΠΫϩαʔϏε RabbitMQ Spring Boot ΞϓϦέʔγϣϯྖҬ

Slide 7

Slide 7 text

Spring Boot + Spring CloudΛ࢖ͬͯϚΠΫϩαʔϏε։ൃΛ͢Δ͜ͱ਺೥ ΞϓϦέʔγϣϯྖҬ಺ʹؔ৺ࣄ͕૿͍͑ͯͬͨ ໰୊ҙࣝͷഎܠ Spring Cloud Eureka Spring Cloud Stream Spring Cloud Sleuth ผͷSpring Boot ϚΠΫϩαʔϏε RabbitMQ Zipkin Spring Boot ΞϓϦέʔγϣϯྖҬ

Slide 8

Slide 8 text

Spring CloudΛ࢖ͬͯΔͱɺόʔδϣϯΞοϓׂ͕ͱਏ͍… ϝδϟʔόʔδϣϯʢδΣωϨʔγϣϯʣ͕มΘΔͱAPI͕େ͖͘มԽ͢Δ͜ͱ͕͋Δ Spring Boot΍ɺSpring Cloud಺ͷผϓϩδΣΫτͱͷ଍ฒΈ͕߹Θͳ͍͜ͱ͕͋Δ JavaΛόʔδϣϯΞοϓΛ͢ΔࡍʹɺϥΠϒϥϦ΍ϑϨʔϜϫʔΫͷόʔδϣϯΞοϓ΋ඞཁ ʹͳΔ͜ͱ͕͋Δ͕ɺ্ͷཧ༝ͰԘ௮͚ʹͤ͟ΔΛಘͳ͘ͳΔ͜ͱ͕͋Δ ໰୊ҙࣝͷഎܠ

Slide 9

Slide 9 text

SPRING BOOT͚ͩ࢖͓͏

Slide 10

Slide 10 text

Spring Boot͚ͩ࢖ͬͯɺͦΕҎ֎͸Ͱ͖Δ͚ͩ֎෦ʹ͍࣋ͬͯ͜͏ ໰୊ҙࣝͷഎܠ Spring Cloud Eureka Spring Cloud Stream Spring Cloud Sleuth ผͷSpring Boot ϚΠΫϩαʔϏε RabbitMQ Zipkin Spring Boot ΞϓϦέʔγϣϯྖҬ

Slide 11

Slide 11 text

Spring Boot͚ͩ࢖ͬͯɺͦΕҎ֎͸Ͱ͖Δ͚ͩ֎෦ʹ͍࣋ͬͯ͜͏ αΠυΧʔαʔϏεΛ࢖͓͏ ໰୊ҙࣝͷഎܠ ผͷSpring Boot ϚΠΫϩαʔϏε RabbitMQ Zipkin Spring Boot Dapr ΞϓϦέʔγϣϯྖҬ

Slide 12

Slide 12 text

Dapr͸k8sͰͷӡ༻͕جຊ ໰୊ҙࣝͷഎܠ Spring Boot Dapr Pod K8s

Slide 13

Slide 13 text

։ൃ؀ڥʹDockerͱminikubeͱdaprΛೖΕͯɺ͢΂ͯͷ։ൃऀʹk8sΛֶΜͰ΋Βͬͯ ։ൃ؀ڥͰ͸ϞοΫΛ࢖͑ΔΑ͏ʹͯ͠ ຊ൪؀ڥͰ͸؂ࢹ༻ͷΤʔδΣϯτ΋ೖΕͯ ར༻͢Δ؀ڥͷҧ͍΍ɺ؀ڥ͝ͱͷ઀ଓઃఆ͸࣮૷ͷ޻෉Λ͢Δͷͱ ؀ڥ͝ͱͷ application-*.yaml Λ্ख͘࢖ͬͯٵऩͯ͠ ໰୊ҙࣝͷഎܠ

Slide 14

Slide 14 text

ΞϓϦέʔγϣϯྖҬ ؀ڥͷ͜ͱΛΞϓϦέʔγϣϯͷ࣮૷΍ઃఆϑΝΠϧ͕୲͏ ໰୊ҙࣝͷഎܠ ։ൃ؀ڥ༻ ઃఆϑΝΠϧ ςετ؀ڥ༻ ઃఆϑΝΠϧ ӡ༻؀ڥ༻ ઃఆϑΝΠϧ ։ൃ؀ڥ ςετ؀ڥ ӡ༻؀ڥ Spring Boot ઀ଓ ઀ଓ ઀ଓ ࣮ߦ ࣮ߦ ࣮ߦ

Slide 15

Slide 15 text

ΞϓϦέʔγϣϯྖҬ ؀ڥͷ͜ͱΛΞϓϦέʔγϣϯͷ࣮૷΍ઃఆϑΝΠϧ͕୲͏ͷ͸ɺ࣮࣭తͳʮ૬ޓࢀরʯ ໰୊ҙࣝͷഎܠ ։ൃ؀ڥ༻ ઃఆϑΝΠϧ ςετ؀ڥ༻ ઃఆϑΝΠϧ ӡ༻؀ڥ༻ ઃఆϑΝΠϧ ։ൃ؀ڥ ςετ؀ڥ ӡ༻؀ڥ Spring Boot ઀ଓ ઀ଓ ઀ଓ ࣮ߦ ࣮ߦ ࣮ߦ

Slide 16

Slide 16 text

૬ޓࢀর͢ΔΑ͏ͳঢ়ଶΛ Ϥγͱͨ͘͠ͳ͍

Slide 17

Slide 17 text

ͦ͏ͩͰ͖Δ͚ͩ ࣮૷ͱΠϯϑϥΛ෼཭͠Α͏

Slide 18

Slide 18 text

#JJUG Shin Tanimoto / 2025-04-17 SPRING BOOTͰ࣮૷ͱΠϯϑϥΛ ͜ΕͰ΋͔ͱ෼཭͢ΔͨΊͷࢼΈ JJUGφΠτηϛφʔ 2025೥4݄

Slide 19

Slide 19 text

1. ઃఆϑΝΠϧͷྲّྀ 2. HTTP઀ଓͷྲّྀ 3. Ωϡʔ઀ଓͷྲّྀ 4. DB઀ଓͷྲّྀ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ ΞδΣϯμ

Slide 20

Slide 20 text

1. ઃఆϑΝΠϧͷྲّྀ

Slide 21

Slide 21 text

๻͸աܹ೿ͳͷͰ ʮapplication.yaml ʹ։ൃ؀ڥͷઃఆͷΈΛೖΕͯ ɹͦΕҎ֎ͷ application-test.yaml ΍ application-prod.yaml Έ͍ͨͳ΋ͷ͸ ɹܾͯ͠࡞Δ΂͖Ͱ͸ͳ͍ʯ ͱ͍͏࿦͕͋Γ·͢ Spring BootͷϓϩϑΝΠϧػೳʢ—spring.pro f iles.active=devͱ͔ʣ͸ېࢭͰ͢ 1. ઃఆϑΝΠϧͷྲّྀ

Slide 22

Slide 22 text

৽͍͠։ൃऀ͕ git ͔ΒίʔυΛऔಘ͖ͯͯ͠ɺԿͷΦϓγϣϯ΋͚ͭͣʹ࣮ߦͨ͠Β ໰୊ͳ͘ಈ͘ͱ͍͏ঢ়ଶΛ໨ࢦ͢ ։ൃ؀ڥߏஙʹ࣌ؒΛֻ͚ͤ͞ͳ͍ ୯ମςετʢ͍͍ͩͨ͸JUnitʣ·Ͱ͸։ൃ؀ڥͷൣᙝ ݁߹ςετ؀ڥ΍ӡ༻؀ڥͷ͜ͱΛʮΞϓϦέʔγϣϯʯͷؔ৺ࣄʹ͠ͳ͍ 1. ઃఆϑΝΠϧͷྲّྀ

Slide 23

Slide 23 text

݁߹ςετ؀ڥ΍ӡ༻؀ڥͰ͸ɺͦΕͧΕͷ؀ڥʢDockerͱ͔ECSͱ͔k8sͱ͔ʣͷ ؀ڥม਺Λར༻ͯ͠ application.yaml ͷઃఆ஋Λ্ॻ͖͢Δ = σϓϩΠ༻εΫϦϓτͷதʹೖΕΔ σϓϩΠ༻εΫϦϓτ͸ʮΠϯϑϥʯΛ୲͏໾ׂ σϓϩΠ༻εΫϦϓτ͸ΞϓϦέʔγϣϯͱผͷgitϦϙδτϦʹೖΕΔ ҟ࿦͸ೝΊΔɻ๻͸༏͍͠ͷͰ 1. ઃఆϑΝΠϧͷྲّྀ

Slide 24

Slide 24 text

ΞϓϦέʔγϣϯྖҬ 1. ઃఆϑΝΠϧͷྲّྀ ։ൃ؀ڥ༻ ઃఆϑΝΠϧ Spring Boot ͦΕͧΕͷ؀ڥ ઀ଓ ࣮ߦ ্ॻ͖ ؀ڥʹؔ͢Δ৘ใΛ֎͔Β༩͑Δ͜ͱͰɺ࣮࣭తʹΠϯϑϥˠΞϓϦͷҰํతͳࢀরʹͳΔ

Slide 25

Slide 25 text

ͪΐͬͱ͚ͩτϦοΩʔͳ͜ͱ͕ඞཁʹͳΔ৔߹΋͋Δ͚Ͳৄ͍͠࿩͸ׂѪ͢ΔͶ ։ൃ؀ڥͰ͸DB઀ଓύεϫʔυΛฏจͰॻ͍ͪΌ͏͚Ͳ ςετ؀ڥҎ߱͸ secretsʢSecretManagerͱ͔ʣʹೖΕΔͱ͍͏৔߹ʹ จ๏͕গ͠มΘΔͱ͔ host ࢦఆͰͷ઀ଓ͔ɺprotocol://user:id@address ࢦఆͰͷ઀ଓ͔ͱ͔ ۩ମతͳ࿩Λ͢Δͱ͕࣌ؒ଍Γͳ͍ͷͰɺઌഐ͔AIʹฉ͍ͯͶ 1. ઃఆϑΝΠϧͷྲّྀ

Slide 26

Slide 26 text

2. HTTP઀ଓͷྲّྀ

Slide 27

Slide 27 text

๻͸աܹ೿ͳͷͰ ʮϓϩηε֎ͷURL͸͢΂ͯઃఆϑΝΠϧʹॻ͘΂͖Ͱ͋Δɻ ɹ͍ͭͰ΋ɺͲΜͳ઀ଓઌͰ΋ɻ ɹJDBC΍AMQP͚ͩͰͳ͘ɺHTTP΋ؚΊͯɺ͢΂ͯྫ֎ͳ͘ʯ ͱ͍͏࿦͕͋Γ·͢ɻ 2. HTTP઀ଓͷྲّྀ

Slide 28

Slide 28 text

ϚΠΫϩαʔϏεA͔ΒϚΠΫϩαʔϏεBΛݺͼग़͢ඞཁ͕͋Γ·͢ ։ൃ؀ڥ - http://localhost:8081/serviceB/ Docker΍ςετ؀ڥ΍ӡ༻؀ڥ - http://serviceB/ ͳ͔ͥEC2Ͱಈ͍ͯΔςετ؀ڥ - http://192.168.10.123/ 2. HTTP઀ଓͷྲّྀ

Slide 29

Slide 29 text

ઃఆϑΝΠϧʹ͸։ൃ؀ڥͷURLͷΈهࡌ͢Δ myApp.urls.serviceB=http://localhost:8081/serviceB/ ͦΕͧΕͷ؀ڥͷ؀ڥม਺Ͱ্ॻ͖͢Δ myApp.urls.serviceB=http://serviceB/ export myApp_urls_serviceB=http://192.168.10.123/ 2. HTTP઀ଓͷྲّྀ

Slide 30

Slide 30 text

࣮૷ଆͰ͸ @Value ΍ @Con f igurationProperties Λ࢖ͬͯઃఆ஋Λར༻͢Δ @Value("${myApp.urls.serviceB}") String baseUrlServiceB; restClient.get() .baseUrl(baseUrlServiceB) .retrieve() .body(String.class); 2. HTTP઀ଓͷྲّྀ

Slide 31

Slide 31 text

Ͳͷ؀ڥͰɺͲͷαʔϏεσΟεΧόϦʢ໊લʣΛ࢖͍ͬͯΔ͔͸ؾʹͯ͠Ͷ Docker΍k8sΛ࢖͏΋Α͠ɺeurekaΛ࢖͏΋Α͠ɺECS Service ConnectΛ࢖͏΋Α͠ ࢀߟ: αʔϏεσΟεΧόϦ “serviceB” ͱ͍͏Α͏ͳϗετ໊͔Βɺ࣮ࡍͷIPΞυϨε܈ͳͲΛҾͨ͘ΊͷαʔϏε ಈతʹϨίʔυ͕มΘΔDNSΈ͍ͨͳ΋Μ 2. HTTP઀ଓͷྲّྀ

Slide 32

Slide 32 text

ϩʔΧϧ؀ڥͷαʔϏεσΟεΧόϦ͸໰୊ʹͳΔ͜ͱ͕͋ΔͶ ݹདྷΑΓ hosts ϑΝΠϧʹॻ͘ͱ͍͏ྲྀ೿͕͋Δ ϩʔΧϧ؀ڥͰ΋ৗʹDocker্Ͱ࣮ߦͯ͠Dockerͷ໊લղܾΛ࢖͏ྲྀ೿΋͋Δ͔΋ ͦΕΑΓ΋։ൃ࣌͸αʔϏεBͷϙʔτ൪߸ΛܾΊଧͪͯ͠ ϙʔτࢦఆͰΞΫηεͤͨ͞ํָ͕Ͱ͠ΐɻҟ࿦͸ೝΊͳ͍ 2. HTTP઀ଓͷྲّྀ

Slide 33

Slide 33 text

3. Ωϡʔ઀ଓͷྲّྀ

Slide 34

Slide 34 text

๻͸աܹ೿ͳͷͰɺ ʮαʔϏεؒͷ௨৴͸σϑΥϧτඇಉظɻ ɹͦͯ͠ಉظʹ͠ͳ͚Ε͹Ͳ͏ͯ͠΋ࠔΔͱ͜Ζ͚ͩಉظʹ͢΂͖ʯ ͱ͍͏࿦͕͋Γ·͢ ฏ੒ʹ͸ʮ೉͍͠΋ͷʯʮτϥϒϧ͕ى͖΍͍͢΋ͷʯͱ͍͏ΠϝʔδͩͬͨΩϡʔ΋ ྩ࿨ʹ͓͍ͯ͸࢖͍΍͘͢ͳΓɺ΋͸΍ඪ४૷උͰ͋Δ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 35

Slide 35 text

ΩϡʔΛ༻͍ͨඇಉظॲཧͰར༻͢Δٕज़ղ Spring Cloud Stream Spring AMQP΍Spring Ka f kaͳͲ DaprͳͲͷαΠυΧʔ ࣗ෼Ͱ࡞ΔϝοηʔδϯάαʔϏε 3. Ωϡʔ઀ଓͷྲّྀ

Slide 36

Slide 36 text

Spring Cloud StreamΛ࢖ͬͨ৔߹ 3. Ωϡʔ઀ଓͷྲّྀ ΞϓϦέʔγϣϯ1 Spring Cloud Stream Spring Boot RabbitMQͳͲ ΞϓϦέʔγϣϯ2 Spring Cloud Stream Spring Boot ΤϯΩϡʔ σΩϡʔ

Slide 37

Slide 37 text

ΩϡʔΛ༻͍ͨඇಉظॲཧʹ͓͍ͯɺSpring Cloud Stream͸ݶΓͳ͘ਖ਼ղʹ͔ۙͬͨ RabbitMQ / Ka f ka / Pulser / Google PubSub / Azure Event Hubs / AWS SNS ͳͲ ࢖͍ͬͯΔϛυϧ΢ΣΞΛҙࣝͤͣʹ࣮૷͕Ͱ͖Δʢઃఆ͚ͩͰٵऩͰ͖Δʣ ૹ৴ଆɾड৴ଆ͕ࣗ਎ͷؔ৺ࣄͷΈهड़͢Ε͹ྑ͍ destination ͱ group Λ༻͍ͨఆ͕ٛඇৗʹ෼͔Γ΍͘͢ૉ੖Β͍͠ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 38

Slide 38 text

ΩϡʔΛ༻͍ͨඇಉظॲཧʹ͓͍ͯɺSpring Cloud Stream͸ݶΓͳ͘ਖ਼ղʹ͔ۙͬͨ Spring Cloud Stream 2.x ͔Β 3.x ʹͳͬͯAPI΍ઃఆ͕෼͔ΓͮΒ͘ͳͬͨ Spring CloudϑΝϛϦʔͳͷͰΞοϓσʔτͰ೉ّͦ͠͏ͳݒ೦͕͋Δ ʢफ೿࣍ୈ͕ͩʣݸผͷΞϓϦέʔγϣϯ͕ؔ৺ࣄΛهड़͢Δ͜ͱͰఆٛ͢Δ෼ γεςϜશମͱͯ͠ɺԿ͕Ͳ͜ʹӨڹͯ͠ඇಉظॲཧ͕૸Δ͔ͷݟ௨͕͠ѱ͍ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 39

Slide 39 text

Spring AMQPΛ࢖ͬͨ৔߹ 3. Ωϡʔ઀ଓͷྲّྀ ΞϓϦέʔγϣϯ1 Spring AMQP Spring Boot RabbitMQ ΞϓϦέʔγϣϯ2 Spring AMQP Spring Boot ΤϯΩϡʔ σΩϡʔ

Slide 40

Slide 40 text

Spring AMQP΍Spring Ka f ka͸ѱ͘ͳ͍΋ͷͷɺؾ͕ར͔ͳ͍෦෼͕͋Δ Spring Cloud Streamʹൺ΂ΔͱɺϩʔϨϕϧAPIʹ͍ۙ Spring Cloud Sleuth΍Micrometer TracingͷτϨʔεID఻೻͕ɺσϑΥϧτແޮ ͜ΕΛ։ൃऀΈΜͳʹ࢖ΘͤΔ͜ͱʹɺׂͱ఍߅͕͋Δ RabbitMQ΍Ka f ka͸·ͩ͠΋Amazon SNSΛ࢖͏৔߹ɺ։ൃ؀ڥͰࠔΓ͕ͪ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 41

Slide 41 text

DaprͷΑ͏ͳαΠυΧʔΛ༻͍ͨ৔߹ 3. Ωϡʔ઀ଓͷྲّྀ ΞϓϦέʔγϣϯPod1 αΠυΧʔ ʢDaprͳͲʣ Spring Boot RabbitMQͳͲ HTTP ΞϓϦέʔγϣϯPod2 αΠυΧʔ ʢDaprͳͲʣ Spring Boot HTTP ΤϯΩϡʔ σΩϡʔ

Slide 42

Slide 42 text

αΠυΧʔίϯςφΛ༻͍ͨ৔߹ 3. Ωϡʔ઀ଓͷྲّྀ ΞϓϦέʔγϣϯ1 αΠυΧʔίϯςφ Spring Boot RabbitMQͳͲ ΞϓϦέʔγϣϯ2 αΠυΧʔίϯςφ Spring Boot ΤϯΩϡʔ σΩϡʔ HTTP HTTP

Slide 43

Slide 43 text

DaprͷΑ͏ͳαΠυΧʔΛ༻͍ͨ࢓૊Έ͸ਖ਼ղʹ͍ۙ αΠυΧʔύλʔϯ ΞϓϦέʔγϣϯͱ1:1Ͱಈ࡞͢Δิॿతͳπʔϧ܈ʢαΠυΧʔʣΛར༻͢Δύλʔϯ αΠυΧʔ͸ɺ୯ಠϓϩηεʢk8sͳΒpod಺ʹڞଘʣ͋Δ͍͸ίϯςφͱͯ͠ఏڙ ઌʹڍ໊͛ͨલղܾ΍ɺϩʔυόϥϯεɺΩϡʔॲཧɺ؂ࢹ৘ใૹ৴ͳͲଟ༻్ʹ࢖͑Δ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 44

Slide 44 text

DaprͷΑ͏ͳαΠυΧʔΛ༻͍ͨ࢓૊Έ͸ਖ਼ղʹ͍ۙ ΞϓϦέʔγϣϯͱαΠυΧʔ͸HTTP௨৴͔gRPC௨৴͚ͩͰࡁΉ ࣮૷ͱΠϯϑϥΛϓϩτίϧϨϕϧͰ෼཭Ͱ͖Δ ͭ·ΓΞϓϦέʔγϣϯ͸HTTP௨৴͔gRPC௨৴͚ͩΕ͹ྑ͍ͱ͍͏͜ͱʹͳΔ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 45

Slide 45 text

DaprͷΑ͏ͳαΠυΧʔΛ༻͍ͨ࢓૊Έ͸ਖ਼ղʹ͍ۙ αΠυΧʔϓϩηεࣗମ͕ෆ҆ఆʹͳΔͱɺΞϓϦέʔγϣϯ͕ෆ҆ఆʹͳΔ αΠυΧʔίϯςφͷͨΊͷϦιʔε͕ඞཁ Daprͷ৔߹͸ඞવతʹk8sΛલఏͱͨ͠ߏ੒ͱͳΔ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 46

Slide 46 text

ࣗ෼Ͱ࡞ΔϝοηʔδϯάαʔϏεΛ༻͍ͨ৔߹ 3. Ωϡʔ઀ଓͷྲّྀ ΞϓϦέʔγϣϯ1 ϝοηʔδϯάαʔϏε Spring Boot RabbitMQͳͲ ΞϓϦέʔγϣϯ2 Spring Boot ΤϯΩϡʔ σΩϡʔ HTTP HTTP

Slide 47

Slide 47 text

ࣗ෼ͰϝοηʔδϯάαʔϏεΛ࡞Δͷ΋Ұ௕Ұ୹͕ͩɺݱ࣮ղʹ͍ۙ ΞϓϦέʔγϣϯͱϝοηʔδϯάαʔϏεؒ͸HTTP௨৴ͳͲΛ࢖͑ΔͨΊ ΞϓϦέʔγϣϯͱΠϯϑϥ͕ϓϩτίϧϨϕϧͰ෼཭Ͱ͖Δ ΄ͱΜͲͷ։ൃϝϯόʔ͸Ωϡʔͱͷ௚઀తͳ௨৴ॲཧΛॻ͔ͳͯ͘ࡁΉ Spring Cloud StreamΛ෦෼తʹ࠶࣮૷͢ΔΑ͏ͳ΋ͷʹͳΔͷͰ࣮૷͸໘౗ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 48

Slide 48 text

ͲͷखஈΛબͿ΂͖͔͸৔߹ʹΑΔͱ͔͠ݴ͑ͳ͍͕ ʮΩϡʔΛܦ༝ͤͣͱ΋HTTPܦ༝ͰAPIίʔϧͰ͖ΔΑ͏ʹ͢Δ΂͖ʯ ͱ͍͏࿦͸ڧΊʹओு͍ͨ͠ ࣗಈςετͷࡍʹɺΩϡʔΛར༻͢ΔͷͰ͸ͳ͘ɺ ड৴ଆͷHTTPΤϯυϙΠϯτʹ௚઀௨৴͢ΔΑ͏ͳʹ͢Δ͜ͱͰ ʢຊདྷͷʣඇಉظॲཧͷऴྃΛ଴ͨͣʹɺಉظॲཧͱͯ݁͠ՌΛ֬ೝͰ͖ΔͨΊ ςετͷ༰қੑ͕޲্͢Δ ςετίʔυʹ Thread.sleep(5000); ͱ͔ॻ͔ͳͯ͘ྑ͍ɻ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 49

Slide 49 text

ࣗಈςετͷ࣌ʹݶΓɺಉظ௨৴ʹ͢Δ 3. Ωϡʔ઀ଓͷྲّྀ ΞϓϦέʔγϣϯ1 αΠυΧʔίϯςφ Spring Boot RabbitMQͳͲ ΞϓϦέʔγϣϯ2 αΠυΧʔίϯςφ Spring Boot ΤϯΩϡʔ σΩϡʔ HTTP HTTP ςετ࣌ͷHTTP௨৴ઌ

Slide 50

Slide 50 text

Spring Cloud Stream΍Spring AMQPΛ࢖͏৔߹Ͱ΋ɺΩϡʔͱͷΤϯυϙΠϯτҎ֎ʹ HTTPΞΫηεͰ͖ΔΤϯυϙΠϯτΛ௥Ճ͢Δ @RabbitListener void onPurchase(PurchaseMessage message) // RabbitMQͷϝοηʔδ @Post(“/purchase”) void purchase(PurchaseEvent event) // ϝοηʔδ಺ͷPOJOͷΈ ௨ৗ࣌͸RabbitTemplateͰΤϯΩϡʔ͢Δ͕ ࣗಈςετ࣌ͷΈ RestClient ΍ RestTemplate Ͱ /purchase ʹΞΫηε͢Δ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 51

Slide 51 text

αΠυΧʔΛར༻͢Δ৔߹΍ɺࣗ࡞ϝοηʔδϯάαʔϏεΛ࢖͏৔߹͸ ࣗಈςετ࣌ʹݶΓHTTPΤϯυϙΠϯτΛม͑Δ͚ͩͰࡁΉ ࣮૷ͱΠϯϑϥͷ෼཭Λ͢Δ௚઀తͳϝϦοτͰ͸ͳ͘ ෭࣍తͳޮՌͰ͸͋Δ͕ɺςετ༰қੑ΍ಈ࡞֬ೝͷ΍Γ΍͕͢͞޲্͢Δͷ͸ྑ͍ 3. Ωϡʔ઀ଓͷྲّྀ

Slide 52

Slide 52 text

4. DB઀ଓͷྲّྀ

Slide 53

Slide 53 text

๻͸աܹ೿ͳͷͰ ʮσʔλϕʔε͸શମͷΠϯϑϥͰ͸ͳ͘ɺΞϓϦέʔγϣϯͷ࣋ͪ෺Ͱ͋Δʯ ͱ͍͏࿦͕͋Γ·͢ 4. DB઀ଓͷྲّྀ

Slide 54

Slide 54 text

σʔλϕʔεͷύϒϦοΫΠϝʔδ 4. DB઀ଓͷྲّྀ ΞϓϦέʔγϣϯ1 Spring Boot σʔλετΞ ΞϓϦέʔγϣϯ2 Spring Boot ΫΤϦ ΫΤϦ

Slide 55

Slide 55 text

๻͕࣋ͭσʔλϕʔεͷΠϝʔδ 4. DB઀ଓͷྲّྀ ΞϓϦέʔγϣϯ1 σʔλετΞ Spring Boot ΞϓϦέʔγϣϯ2 σʔλετΞ Spring Boot ΫΤϦ ΫΤϦ ※͋͘·Ͱ΋ந৅֓೦తͳଊ͑ํͰ͋Γ ɹ࣮ࡍʹΞϓϦέʔγϣϯϓϩηεͱ ɹσʔλετΞͷϓϩηεΛಉډͤ͞Δ ɹΘ͚Ͱ͸͋Γ·ͤΜ

Slide 56

Slide 56 text

ϚΠΫϩαʔϏεతͳൃ૝Ͱ͸σʔλετΞ΋ΞϓϦέʔγϣϯͱಉ༷ʹ෼཭͞ΕΔ ֎෦͔ΒσʔλετΞʹ௚઀ΞΫηεͤͣɺϚΠΫϩαʔϏεΛܦ༝ͯ͠ΞΫηε͢Δ ͭ·ΓϚΠΫϩαʔϏεͷWeb API͕ͦ͜σʔλͷදݱͰ͋Γ ಺෦ͷσʔλετΞ࣮૷͸Ӆṭ͞Ε͔ͯ͠Δ΂͖Ͱ͋Δ 4. DB઀ଓͷྲّྀ

Slide 57

Slide 57 text

Τϥͦ͏ͳ͜ͱΛݴ͍·͕ͨ͠ɺԿΛݴ͍͍͔ͨͱ͍͏ͱ ʮDBΞΫηεΛHTTPͳͲ࢖ͬͯϓϩτίϧӅṭͨ͠Γ ɹΫΤϦΛHTTP bodyͰදݱ͠Α͏ͱ͢Δͷ͸େม͔ͩΒ ɹ΍Ίͱ͜͏ͥʯ ͬͯ͜ͱͰ͢ Daprʹ΋DBΞΫηεػೳ͕͋Δ͕ɺ࢖ͬͨ͜ͱ΋࢖͓͏ͱࢥͬͨ͜ͱ΋ͳ͍ 4. DB઀ଓͷྲّྀ

Slide 58

Slide 58 text

DBͱΞϓϦέʔγϣϯ͸஥ྑ͠ɻζο༑ͩϤʂ 4. DB઀ଓͷྲّྀ

Slide 59

Slide 59 text

5. ΞϓϦέʔγϣϯ؂ࢹͷ ྲّྀ

Slide 60

Slide 60 text

๻͸աܹ೿͚ͩͲ ؂ࢹʹ͍ͭͯ͸ʮ෼ࢄτϨʔγϯά͸100%ऩू͢ΔΑͶʯఔ౓ͷ͜ͱ͔͠ࢥͬͯ·ͤΜ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ

Slide 61

Slide 61 text

ΞϓϦέʔγϣϯ؂ࢹͷͨΊͷ৘ใʢϝτϦΫεɺϩάɺτϨʔεʣͷऩूํ๏͸ෳ਺͋Δ Pullܕ - ֎෦ͷαʔϏε͕ऩूʹདྷΔʢPrometheusͳͲʣ Pushܕ ϥΠϒϥϦ - ΞϓϦέʔγϣϯ಺ͷϥΠϒϥϦ͕ऩूͯ͠ૹ৴͢ΔʢbraveͳͲʣ ΤʔδΣϯτ - ΞϓϦέʔγϣϯͱ͸ผͷϓϩηεͰऩूͯ͠ૹ৴͢ΔʢAPMͳͲʣ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ

Slide 62

Slide 62 text

Pullܕ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ ΞϓϦέʔγϣϯ1 micrometer-registry- prometheus Spring Boot Prometheus ΞϓϦέʔγϣϯ2 micrometer-registry- prometheus Spring Boot ऩू ऩू

Slide 63

Slide 63 text

Pushܕ - ϥΠϒϥϦ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ ΞϓϦέʔγϣϯ1 micrometer-tracing- bridge-brave Spring Boot Zipkin ΞϓϦέʔγϣϯ2 micrometer-tracing- bridge-brave Spring Boot ૹ৴ ૹ৴

Slide 64

Slide 64 text

Pushܕ - ΤʔδΣϯτ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ ΞϓϦέʔγϣϯ1 Elastic APM Spring Boot Zipkin ΞϓϦέʔγϣϯ2 Elastic APM Spring Boot ૹ৴ ૹ৴ ऩू ऩू

Slide 65

Slide 65 text

࣮૷ͱΠϯϑϥΛ෼཭͢Δͱ͍͏؍఺ͩͱɺԿ͕ྑ͍ͷ͔ʁ Pullܕ ΞϓϦέʔγϣϯଆʹʮ؂ࢹ৘ใΛऔಘͰ͖ΔAPIʯΛ༻ҙ͓͚ͯͩ͘͠ ؂ࢹ৘ใΛ࣮ࡍʹऩू͢Δ͔Ͳ͏͔͸؀ڥʹ೚ͤΔ ϝτϦΫεͱϩά͸͜ͷํ๏͕࠾ΕΔ͕ɺPullܕͷτϨʔε͸ʢ஌Βʣͳ͍ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ

Slide 66

Slide 66 text

࣮૷ͱΠϯϑϥΛ෼཭͢Δͱ͍͏؍఺ͩͱɺԿ͕ྑ͍ͷ͔ʁ Pushܕ - ΤʔδΣϯτܕ ؂ࢹ͕ඞཁͳ৔ॴʹͷΈΤʔδΣϯτΛద༻͢Ε͹ɺ࣮૷ͱΠϯϑϥ͸෼͔ΕΔ ͨͱ͑͹ϩʔΧϧͷ։ൃ؀ڥʹ͸ΤʔδΣϯτΛద༻͠ͳͯ͘ྑ͍ ݱ࣮తʹ͸͜Ε͕ਖ਼ղ Ͱ΋ݸਓతʹ͸͋Μ·Γ޷͖͡Όͳ͍ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ

Slide 67

Slide 67 text

࣮૷ͱΠϯϑϥΛ෼཭͢Δͱ͍͏؍఺ͩͱɺԿ͕ྑ͍ͷ͔ʁ Pushܕ - ϥΠϒϥϦ ΞϓϦέʔγϣϯ֎ʹಠࣗϓϩτίϧͰૹ৴͢Δ ։ൃ؀ڥͰ΋ૹ৴͠Α͏ͱ͢Δ ͔ͳΓ࣮૷ͱΠϯϑϥ͕ີ઀Ͱ͋Δ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ

Slide 68

Slide 68 text

PushͰ͋ͬͯ΋֎෦ʹૹ৴͢Δख๏ͱϓϩτίϧ͕ඪ४Խ͞Εͨ΋ͷͰ͋Ε͹ྑ͍ͷͰ͸ʁ OTLP - OpenTelemetry Protocol ϝτϦΫεɺϩΪϯάɺτϨʔεͱ΋ʹOTLPͰૹ෇͢Δ࢓૊Έ͋Γ ଟ͘ͷ؂ࢹϓϥοτϑΥʔϜ͕OTLPରԠ࢝͠Ί͍ͯΔ Otel CollectorΛར༻͢Ε͹ɺ͞Βʹॊೈʹ؂ࢹϓϥοτϑΥʔϜΛબ΂Δ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ

Slide 69

Slide 69 text

OTLPΛ࢖ͬͨ৔߹ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ ΞϓϦέʔγϣϯ1 micrometer-registry- otlp Spring Boot GrafanaͳͲ ΞϓϦέʔγϣϯ2 micrometer-registry- otlp Spring Boot OTLPૹ৴ OTLPૹ৴

Slide 70

Slide 70 text

OTLPͱOtel CollectorΛ࢖ͬͨ৔߹ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ ΞϓϦέʔγϣϯ1 micrometer-registry- otlp Spring Boot Otel Collector ΞϓϦέʔγϣϯ2 micrometer-registry- otlp Spring Boot OTLPૹ৴ OTLPૹ৴ DatadogɺAWSͳͲ ೚ҙͷϓϩτίϧ

Slide 71

Slide 71 text

؂ࢹ͸·ͩॊΒ͔͍ͷͰɺঢ়گΛ஫ࢹதɻͦͷ͏ͪ࿩͠·͢ 5. ΞϓϦέʔγϣϯ؂ࢹͷྲّྀ

Slide 72

Slide 72 text

·ͱΊɾ࠷ޙʹ

Slide 73

Slide 73 text

࣮૷ͱΠϯϑϥΛ෼཭ͤ͞Δ͜ͱͰ ΞϓϦέʔγϣϯଆʹɺ؀ڥ͝ͱͷࠩ෼Λهड़͢Δඞཁ͕ͳ͘ͳΔ ࣮૷ͱΠϯϑϥͷ૬ޓࢀর͕ͳ͘ͳΓɺΠϯϑϥ͔ΒͷҰํ௨ߦʹͳΔ ಛʹ։ൃ؀ڥΛɺ֤छϛυϧ΢ΣΞ΍ίϯςφͳͲΛ࢖ΘͣʹߏஙͰ͖Δ ӡ༻؀ڥ͕k8s΍EKSͰ΋ɺ։ൃ؀ڥͰ͸k8s΍Amazon SNSͳͲ͕ඞཁͳ͘ͳΔ RDBMS͘Β͍͸ཱͯΔ͚Ͳ ·ͱΊ

Slide 74

Slide 74 text

࣮૷ͱΠϯϑϥΛ෼཭ͤ͞Δ͜ͱͰ ςετ͕༰қʹͳΓ΍͍͢ ΩϡʔΛ༻͍ͨॲཧΛɺHTTPͰݺͼग़ͤΔ ʢผʹ࣮૷ͱΠϯϑϥΛ෼཭͠ͳͯ͘΋Ͱ͖Δ͜ͱ͚ͩͲɻ෭࣍తͳޮՌʣ ΩϡʔΛ༻͍ͨඇಉظॲཧͰ΋ɺHTTPͷಉظॲཧͱͯ͠ςετͰ͖Δ ·ͱΊ

Slide 75

Slide 75 text

࣮૷ͱΠϯϑϥΛ෼཭ͤ͞ΔͨΊʹ application.yaml ͸ϩʔΧϧ։ൃ؀ڥ޲͚ͷΈͱ͢Δʢ੍໿ʣ ͦΕҎ֎ͷ؀ڥͰ͸ɺ؀ڥม਺Λར༻ͯ͠ઃఆΛ্ॻ͖͢Δ ͦ΋ͦ΋ʮ࣮૷ͱΠϯϑϥΛ෼཭ͤ͞Δʯͱ͍͏ڧ͍ҙࢤΛ࣋ͭ ·ͱΊ

Slide 76

Slide 76 text

࣮૷ͱΠϯϑϥΛ෼཭͢Δํཱ͕ࣜ֬͢Ε͹ ΞϓϦέʔγϣϯ͕ʮWeb APIΛఏڙ͢ΔͷΈʯͱ͍͏ঢ়ଶʹͳΔ ؀ڥʹ͍ͭͯͷؔ৺ࣄ͔Β੾Γ཭͞ΕɺϩδοΫʹ஫ྗͰ͖ΔΑ͏ʹͳΔ Spring Bootʹͩ͜ΘΒͣɺͲͷΑ͏ͳϑϨʔϜϫʔΫͰ΋࢖͑ΔΑ͏ʹͳΔ ΋ͬͱݴ͑͹ɺͲͷݴޠͰ࣮૷ͯ͠΋ߏΘͳ͘ͳΔ ಠཱੑɾ૬ޓӡ༻ੑ͕ߴ͍ঢ়ଶʹͳΔ ࠷ޙʹ