SlideShare a Scribd company logo
++6($$$'BMM34QSJOH#PPUÎò¹©ò›4QSJOH#PPUsf—Ý£®ì´–Ò¸¡–¬Å®Àâ„z„KKVH@DDD 
DDD@S 
öÕ 
̼s˜ 
«Pv¼ÔÇ¥¦¡z£ò¸Ç–ê 
.BWFOéÜ·Çéz²Ó– 
?zÀ9	 
?4QSJOH#PPUs°63-„_´–Ò¸±žf— 
?Öì·¦®Çzf€£òÜ–Ç 
bU50%0ž rÖì¯èßžñagr[laP 
bU3FEJTžžor$PODVSSFOU)BTI.BQžJó
ž„YúTŠc“R 
?4QSJOH$MPVE$POGJHs”0²òÔ¢­äë–¶æò 
?Öì·¦®Çz£òÜ–Ç 
(JUCVDLFUzO”$POGJH3FQPTJUPSZzf 
$POGJH4FSWFSO” 
°63-„_´–Ò¸±¹]z²òÔ¢­äë–¶æòf 
°63-„_´–Ò¸±	$POGJH$MJFOU
zO” 
bU°63-„_´–Ò¸±	$POGJH$MJFOU
ž3FGSFTI¸²–Öw/Ò 
?4QSJOH$MPVE/FUGMJYsÝ£®ì´–Ò¸¡–¬Å®ÀâÖ¤ 
?Öì·¦®Çz£òÜ–Ç 
$POGJH4FSWFSzO” 
4FSWJDF%JTDPWFSZ	VSFLB4FSWFS
zO” 
$JSDVJU#SFBLFS.POJUPS	)ZTUSJY%BTICPBSE
zO” 
°63-„_´–Ò¸±zO” 
°63-„_´–Ò¸±6*zO” 
°63-„_´–Ò¸±z¸°–ê¡¥Ç 
Št 
̼s˜ 
«Pv¼ÔÇ¥¦¡z£ò¸Ç–ê 
.BD8JOEPXTå–µ–¹]wMecrPŠe}-JOVYsö²e—Ý{•zzžö²cr[laP} 
Java SE 8 
IUUQXXXPSBDMFDPNUFDIOFUXPSLKBWBKBWBTFEPXOMPBETKELEPXOMPBETIUNMW•+BWB 4 %FWFMPQNFOU 
,JUV	’ÖsN˜|Vi•[0,
ž¿¥òì–Ècr|£ò¸Ç–êcr[laP} 
«/DJAVA_HOMEztPATHzðHž«fíor[laP} 
Maven 
IUUQGUQNFJTFJVBDKQNJSSPSBQBDIFEJTUNBWFONBWFOCJOBSJFTBQBDIFNBWFOCJOUBSH[W•.BWFOž 
¿¥òì–Ècr|ŽckÆ¢ë®ÇézCJOԨ꿞«/DPATHwðHcr[laP} 
¡|	Îò¹©òÇXzê–ÇÔ¨ê¿
TPGUXBSFBQBDIFNBWFOCJOUBSH[w¿¥òì–ÈI‹se} 
Git Bash (WindowszÝ) 
8JOEPXTzÝ| 
IUUQHJUTDNDPNEPXOMPBEXJOW•(JUž¿¥òì–Ècr£ò¸Ç–êcr[laP} 
’Asöíe—²ÝòÈ{Àr(JUwÔcrP—(JU#BTIžJPröícr[laP} 
jq (©Ö¶æò) 
«,s{vPseX|+40/c¦z^JwIUUQTUFEPMBOHJUIVCJPKRž£ò¸Ç–êcrV[t Pse} 
Redis
.BDzÝ{|’Ažöícr[laP}	P9$PEF
 
$ cd (ハンズオン資材のルートフォルダ)/software/redis-2.8.17 
$ tar xzvf redis-2.8.17.tar.gz 
$ cd redis-2.8.17 
$ make 
8JOEPXTÒÂÇzÝ{|	Îò¹©òÇXzê–ÇÔ¨ê¿
TPGUXBSFSFEJTSFEJT[JQžŽcr[laP} 
8JOEPXTÒÂÇzÝ{|	Îò¹©òÇXzê–ÇÔ¨ê¿
TPGUXBSFSFEJTFEJTCJO[JQžŽcr[laP} 
Gitbucket 
IUUQTHJUIVCDPNUBLF[PFHJUCVDLFUSFMFBTFTEPXOMPBEHJUCVDLFUXBS”–|(JUCVDLFUž¿¥òì–Ècr[la 
P} 
¡|	Îò¹©òÇXzê–ÇÔ¨ê¿
TPGUXBSFHJUCVDLFUXBSw¿¥òì–ÈI‹se} 
IntelliJ IDEA 
IUUQTXXXKFUCSBJOTDPNJEFBEPXOMPBE”–|*OUFMMJ+*%z$PNNVOJUZEJUJPOŠk{6MUJNBUFEJUJPOž¿¥òì– 
Ècr£ò¸Ç–êcr[laP} 
4QSJOH5PPM4VJUFDMJQTFžžJcrŽÎò¹©òžö²sYŠeX|Îò¹©òzÚ{*OUFMMJ+*%žJPríPŠe} 
MavenéÜ·Çéz²Ó– 
Îò¹©ò{©Ôè£ò«síPŠe} 
«Pvè£Õè鞣ò¾–ÌÂÇW•¿¥òì–ÈgfåŠ.BWFOéÜ·Çéw²Ó–cŠe} 
	Îò¹©òÇXzê–ÇÔ¨ê¿
SFQPTJUPSZ’Až	Ú–ßÆ¢ë®Çé
NSFQPTJUPSZ’Aw²Ó–cr[laP} 
$ cp -rf (ハンズオン資材のルートフォルダ)/repository/* ~/.m2/repository/ 
overwrite /Users/maki/.m2/repository/antlr/antlr/2.7.2/_maven.repositories? (y/n [n])tPR”RwÖ„Ye—WuRWW˜—Ý{ 
$ cp -rf (ハンズオン資材のルートフォルダ)/repository/* ~/.m2/repository/ 
žöícr[laP} 
?zÀ9	 
˜?s°63-„_´–Ò¸±žUXwÝ£®ì´–Ò¸¡–¬Å®ÀâžÖ¤cŠe} 
?=0wÖ¤e—¡–¬Å®Àâž’AwÜcŠe} 
?s{4QSJOH#PPUžJPrz´z°63-„_´–Ò¸±žfcŠe}
?s{4QSJOH$MPVE$POGJHžJPr°63-„_´–Ò¸±w”0²òÔ¢­äë–¶æòžðHcŠe} 
?s{°63-„_´–Ò¸±z6*žðHc|4QSJOH$MPVE/FUGMJYžJPr°63-„_´–Ò¸±wÝ£®ì´–Ò¸¡–¬Å 
®ÀâzkzF“vо–òžðHcŠe}
˜a{DzݶòžJPrÖ¤cŠeX|˜?s{pzݶòÖsÀrz´–Ò¸žO”cŠe} 
?1 Spring Boots°URL„_´–Ò¸±žf— 
?s{Ý£®ì´–Ò¸‰sz'J[[#V[[þUsN—|°63-„_´–Ò¸±žf–Še} 
bUsConcurrentHashMapžžokö}bUs3FEJTžžoköžíPŠe} 
£òÜ–Çe—Öì·¦®Çw‡tŸuz²–ÈXöa˜rP—zs|bUsöe—²–È{‡ŸzDíse} 
?Öì·¦®Çzf€£òÜ–Ç 
LÖì·¦®Çf 
*OUFMMJ+*%žŽPr°/FX1SPKFDU±sLÖì·¦®ÇžfcŠe}’Az”Rw°NQUZ1SPKFDU±ž¶]cr[la 
P}
’Az–žâ¦cr[laP}ÆÔ¨êÇ–W•/Òe—zs¶cr[laP} 
1SPKFDUOBNF KKVHDDDIBOETPO 
1SPKFDUMPDBUJPO 	Îò¹©òÇXzê–ÇÔ¨ê¿
FYFSDJTF
°1SPKFDU4USVDUVSF±s’Az–žâ¦cr[laP} 
1SPKFDU4%,  
1SPKFDUMBOHVBHFMFWFM  
+%,X¾zÝ{|°/FX±žcr+%,žcr[laP}+7@)0.wö|e—Ԩ꿞¶]e˜| Pse} 
?Öì·¦®Çz£òÜ–Ç 
°'JMF±°*NQPSU.PEVMF±s?Öì·¦®Çž£òÜ–ÇcŠe} 
°	Îò¹©òÇXzê–ÇÔ¨ê¿
FYFSDJTFVSMTIPSUFOFS±ž¶]cr[laP}
°*NQPSUNPEVMFGSPNFYUFSOBMNPEFM±s°.BWFO±ž®cr[laP} 
°4FBSDIGPSQSPKFDUTSFDVSTJWFMZ±t°*NQPSU.BWFOQSPKFDUTBVUPNBUJDBMMZ±wÀ¦Â®žâ˜r|ÕwŸs[l 
aP} 
°/FYU±ž–4et|’Az”Rw?Jz.BWFOÖì·¦®ÇX£òÜ–Ça˜Še}
bU1 TODOž rÖì¯èßžñagr[laP 
demo.UrlShortenerž2Kcr[laP} 
’ATODOó
ž r[laP} 
@RequestMapping(value = /, method = RequestMethod.POST) 
ResponseEntityString save(@RequestParam String url) { 
if (urlValidator.isValid(url)) { 
String hash = /* TODO (1) URLをハッシュ化。ハッシュアルゴリズムには 32-bit murmur3 algorithm を使用する。 */; 
// ヒント: com.google.common.hash.Hashing.murmur3_32()を使う 
// TODO (2) urlMapにhashに紐づくURLを追加する。 
return new ResponseEntity(urlShortenUrl + / + hash, HttpStatus.OK); 
} else { 
return new ResponseEntity(HttpStatus.BAD_REQUEST); 
} 
} 
UrlShortener®è¸žÌ®é®cr|Run UrlShortener.main()ž®é®cr[laP} 
’Az”RwŽöísYŠe} 
$ cd (ハンズオン資材のルートフォルダ)/exercise/01-urlshortener 
$ mvn spring-boot:run -f urlshortener/pom.xml 
’AzHQX4—W±écr[laP}
$ curl -X POST http://localhost:8080 -d url=http://google.com 
http://localhost:8080/58f3ae21 
$ curl -X GET http://localhost:8080/58f3ae21 
http://google.com 
UrlShortenerTest®è¸žÌ®é®cr|Run UrlShortenerTestž®é®cr[laP} 
ŸÇX´ck•bU{ñ’se} 
ŸÇ{’Az”RwŽöísYŠe} 
$ mvn test -f urlshortener/pom.xml 
bU2 RedisžžorConcurrentHashMapžJó
ž„YúTŠc“R 
ÕwConcurrentHashMapzó
ž3FEJTžžJe—”Rw„YúTŠe}4QSJOH#PPUw”—VUPDPOGJHVSBUJPOsPWw
zw 
3FEJT	4QSJOH%BUB3FEJT
žžJsY—W9ncŠe} 
RediszO” 
.BDzÝ
$ cd (ハンズオン資材のルートフォルダ)/software/redis-2.8.17 
$ ./src/redis-server 
[34286] 09 Nov 05:27:07.455 # Warning: no config file specified, using the default config. In order to specify a config file use ./src/redis-server /path/to/redis.[34286] 09 Nov 05:27:07.457 * Increased maximum number of open files to 10032 (it was originally set to 2560). 
_._ 
_.-``__ ''-._ 
_.-`` `. `_. ''-._ Redis 2.8.17 (00000000/0) 64 bit 
.-`` .-```. ```/ _.,_ ''-._ 
( ' , .-` | `, ) Running in stand alone mode 
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 
| `-._ `._ / _.-' | PID: 34286 
`-._ `-._ `-./ _.-' _.-' 
|`-._`-._ `-.__.-' _.-'_.-'| 
| `-._`-._ _.-'_.-' | http://redis.io 
`-._ `-._`-.__.-'_.-' _.-' 
|`-._`-._ `-.__.-' _.-'_.-'| 
| `-._`-._ _.-'_.-' | 
`-._ `-._`-.__.-'_.-' _.-' 
`-._ `-.__.-' _.-' 
`-._ _.-' 
`-.__.-' 
[34286] 09 Nov 05:27:07.465 # Server started, Redis version 2.8.17 
[34286] 09 Nov 05:27:07.466 * DB loaded from disk: 0.001 seconds 
[34286] 09 Nov 05:27:07.466 * The server is now ready to accept connections on port 6379 
8JOEPXTzÝ|SFEJTTFSWFSFYFžöícr[laP} 
¼–¸²–Èz7c 
’Azª}ž„YúTr[laP} 
final ConcurrentHashMapString, String urlMap = new ConcurrentHashMap(); 
// ↓ 
@Autowired StringRedisTemplate redisTemplate; 
w„YúTr[laP} 
urlMap.putIfAbsent(hash, url); 
// ↓ 
redisTemplate.opsForValue().set(hash, url); 
w„YúTr[laP} 
String url = urlMap.get(hash); 
// ↓ 
String url = redisTemplate.opsForValue().get(hash); 
w„YúTr[laP} 
„YúTk w|bU•FwŸÇXó˜|bUŽñ’se} 
O”ck¡Öé°–¶æò{=’crVPr[laP}3FEJT{O”ckŠŠwcr[laP} 
?2 Spring Cloud Configs”0²òÔ¢­äë–¶æò 
?s{4QSJOH$MPVE$POGJHžžok”0²òÔ¢­äë–¶æòž9ncŠe} 
?sR¶¸Åßz¡–¬Å®Àâ.ž’AwÜcŠe}
$POGJH$MJFOUtcr?sfck°63-„_´–Ò¸±žžJc|$POGJH4FSWFS	fI‹
W•ž¤cŠe} 
$POGJH4FSWFS{ÆÔ¨êÇs(JUIVCwŠcŠeX|x{©Ôè£ò«sö²e—k|ì–ªêw€mÖ^k(JUCVDLFUž 
žJcŠe} 
?Öì·¦®Çz£òÜ–Ç 
°'JMF±°*NQPSU.PEVMF±s?Öì·¦®Çž£òÜ–ÇcŠe}°	Îò¹©òÇXzê–ÇÔ¨ê¿
FYFSDJTF 
EJTUSJCVUFEDPOGJH±ž¶]cr[laP} 
DPOGJHTFSWFS{$POGJH4FSWFSžckÖì·¦®Çse} 
VSMTIPSUFOFS{?w$POGJH$MJFOUz•#žðHckÖì·¦®Çse} 
um•Ž=wI‹s|Lw²–Æ¢ò¯e—«P{N–ŠgŸ} 
GitbucketzO”  Config Repositoryzf 
(JCVDLFUžO”cŠc“R}wÜ–ÇžžJe—zs|_zÜ–ÇžžJcrP—¡ÖéXN˜|=’cr[laP} 
$ cd (ハンズオン資材のルートフォルダ)/software 
$ java -jar gitbucket.war 
IUUQMPDBMIPTUw¡®º¸cå–µ–Øиî–ÈtŽw°SPPU±s쯣òcr[laP}
ÌÖzàÊä–W•°/FXSFQPTJUPSZ±ž®é®cr[laP} 
3FQPTJUPSZOBNFw°DPOGJHSFQP±žâ¦c|°*OJUJBMJ[FUIJTSFQPTJUPSZXJUIB3%.±wÀ¦Â®žâ˜|°$SFBUF 
SFQPTJUPSZ±ž®é®cr[laP}
_˜s$POGJH3FTQPTJUPSZXfsYŠck} 
”f±éJz²òÔ¢­äë–¶æòžfcŠc“R}ëÜ·ÇéØzÌw°
±Ý–®ž®é®cr[laP} 
Ô £êØž°GPPQSPQFSUJFT±wc|’AzÆ?žMâc|°$PNNJUDIBOHFT±ž®é®cr[laP} 
foo: 123456 
bar: abcdef
ŽR´pÔ £êžfcŠe}Ô £êØž°GPPEFWFMPQNFOUQSPQFSUJFT±wc|’AzÆ?žMâc|°$PNNJU 
DIBOHFT±ž®é®cr[laP} 
foo: Hello! 
Config ServerO” 
°DPOGJHTFSWFS±zbootstrap.ymlw’AzX훘rP—_tž±écr[laP} 
spring.cloud.config.server.uri: http://localhost:8080/git/root/config-repo.git 
’Az²ÝòÈs$POGJH4FSWFSžO”cr[laP} 
$ cd (ハンズオン資材のルートフォルダ)/exercise/02-distributed-config 
$ mvn spring-boot:run -f configserver/pom.xml 
”f±écŠc“R} 
$ curl http://localhost:8888/admin/env 
’As{KRžžor^ckHQžÜcŠe}
$ curl http://localhost:8888/admin/env | jq . 
{ 
defaultProperties: { 
spring.config.name: configserver 
}, 
applicationConfig: [classpath:/bootstrap.yml]: { 
spring.cloud.config.server.uri: http://localhost:8080/git/root/config-repo.git 
}, 
applicationConfig: [classpath:/configserver.yml]: { 
management.context_path: /admin, 
spring.application.name: configserver, 
server.port: 8888, 
info.component: Config Server, 
spring.jmx.default_domain: cloud.config.server 
}, 
// ... 省略 
} 
spring.cloud.config.server.uriX`ía˜rP—_tž±écr[laP} 
Õw²òÔ¢­äë–¶æòž¤cŠe}BQQØ{GPP|QSPGJMFØ{EFGBVMUwcŠe} 
$ curl http://localhost:8888/foo/default 
’As{KRžžor^ckHQžÜcŠe} 
$ curl http://localhost:8888/foo/default | jq . 
{ 
propertySources: [ 
{ 
source: { 
foo: 123456, 
bar: abcdef 
}, 
name: http://localhost:8080/git/root/config-repo.git/foo.properties 
} 
], 
label: master, 
name: default 
} 
ÕwQSPGJMFž/Òcr¤cŠc“R} 
$ curl http://localhost:8888/foo/development 
’As{KRžžor^ckHQžÜcŠe} 
$ curl http://localhost:8888/foo/development | jq . 
{ 
propertySources: [ 
{ 
source: { 
foo: Hello! 
}, 
name: http://localhost:8080/git/root/config-repo.git/foo-development.properties 
}, 
{ 
source: { 
foo: 123456, 
bar: abcdef 
}, 
name: http://localhost:8080/git/root/config-repo.git/foo.properties 
} 
], 
label: master, 
name: development 
} 
foo-development.propertiessÖ„YcrP—_tX
W–Še} 
°URL„_´–Ò¸±¹]z²òÔ¢­äë–¶æòf 
•Fw|63-„_´–Ò¸¹]z²òÔ¢­äë–¶æòž°VSMTIPSUFOFSZNM±wfcŠe}Æ?{’Azó–se} 
urlshorten: 
url: http://localhost:${server.port} 
spring: 
redis: 
host: localhost # server host 
password: # server password 
port: 6379 # connection port 
pool: 
max-idle: 8 # pool settings ... 
min-idle: 0
max-active: 8 
max-wait: -1 
endpoints.restart: 
enabled: true 
”f±écŠc“R}	$POGJH4FSWFSzO”{ÓPse
 
$ curl http://localhost:8888/urlshortener/default 
’As{KRžžor^ckHQžÜcŠe} 
$ curl http://localhost:8888/urlshortener/default | jq . 
{ 
propertySources: [ 
{ 
source: { 
spring.redis.pool.max-idle: 8, 
spring.redis.password: , 
spring.redis.host: localhost, 
spring.redis.port: 6379, 
urlshorten.url: http://localhost:${server.port}, 
endpoints.restart.enabled: true, 
spring.redis.pool.max-active: 8, 
spring.redis.pool.min-idle: 0, 
spring.redis.pool.max-wait: -1 
}, 
name: http://localhost:8080/git/root/config-repo.git/urlshortener.yml 
} 
], 
label: master, 
name: default 
} 
(JUÖz/ÒX`ía˜rPŠe} 
°URL„_´–Ò¸±(Config Client)zO” 
Õw$POGJH$MJFOUtcr|°63-„_´–Ò¸±žO”cŠe} 
£òÜ–ÇckÖì·¦®Ç	FYFSDJTFEJTUSJCVUFEDPOGJHVSMTIPSUFOFS
zQPNYNMw’Az•#XðHa˜rP—_t 
ž±écr[laP} 
dependency 
groupIdorg.springframework.cloud/groupId 
artifactIdspring-cloud-starter/artifactId 
/dependency 
dependency 
groupIdorg.springframework.boot/groupId 
artifactIdspring-boot-starter-actuator/artifactId 
/dependency 
Šk|VSMTIPSUFOFSzCPPUTUSBQZNMw
spring: 
application: 
name: urlshortener 
Xa˜rP—_tž±écr[laP} 
°63-„_´–Ò¸±žO”cŠc“R}wÜ–Ç{=wO”crP—zs|Öì¯èßÂDw--server.port=8081žp]r 
wÜ–ÇsO”cŠe} 
$ cd (ハンズオン資材のルートフォルダ)/exercise/02-distributed-config 
$ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments=--server.port=8081 
?•Fw’Az鮧¸Çžor[laP}	Ü–ÇØX/Òa˜rP—_twDžp]r[laP
 
$ curl -X POST http://localhost:8081 -d url=http://google.com 
http://localhost:8081/58f3ae21 
$ curl -X GET http://localhost:8081/58f3ae21 
http://google.com 
Õw$POGJH4FSWFS	VSMTIPSUFOFSZNM
z–ž/TŠc“R} 
IUUQMPDBMIPTUSPPUDPOGJHSFQPCMPCNBTUFSVSMTIPSUFOFSZNMw¡®º¸c|°EJU±Û¾òž®é®cr[la 
P} 
urlshorten.urlžhttp://localhost:9999w/Òcr°$PNNJUDIBOHFT±ž®é®cr[laP}	_z{?sžJcŠe
}
/Òž`íe—¼w|$POGJH$MJFOUÖzÖìÐÅ¢ž±écŠc“R} 
$ curl -X GET http://localhost:8081/env/urlshorten.url 
http://localhost:8081 
Õw$POGJH$MJFOUžSFGSFTIcŠe} 
$ curl -X POST http://localhost:8081/refresh 
[urlshorten.url] 
$ curl -X GET http://localhost:8081/env/urlshorten.url 
http://localhost:9999 
/ÒX`ía˜Šck}cWc|’Azó–%*I‹zÖìÐÅ¢w%*{a˜rPŠgŸ} 
$ curl -X POST http://localhost:8081 -d url=http://google.com 
http://localhost:8081/58f3ae21 
_{$POGJH$MJFOUžSFTUBSUcŠe} 
$ curl -X POST http://localhost:8081/restart 
{message:Restarting} 
SFTUBSU {|?zÖìÐÅ¢s%*a˜rP—_tX›W–Še} 
$ curl -X POST http://localhost:8081 -d url=http://google.com 
http://localhost:9999/58f3ae21 
bU3 °URL„_´–Ò¸±(Config Client)žRefresh¸²–Öw/Ò 
°63-„_´–Ò¸	UrlShortener®è¸
±„zÖìÐÅ¢£ò·¦®¶æò`ížSFGSFTIsíT—”Rw|UrlShortener®è¸ž 
3FGSFTI¸²–Öw/Òcr[laP} 
@EnableAutoConfiguration 
@ComponentScan 
@RestController 
@RefreshScope // ここを追加 
public class UrlShortener { 
// 略 
} 
mvn spring-boot:runsO”ck°63-„_´–Ò¸±ž$USM
$s=’cr|_öícr[laP} 
$ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments=--server.port=8081 
x{’Az”RwOW§òÈÜ£òÇw1045e—_ts²òÔ¢­äë–¶æòž/ÒcŠc“R} 
$ curl -X POST http://localhost:8081/env -d urlshorten.url=http://127.0.0.1:9999 
{urlshorten.url:http://127.0.0.1:9999}
_|SFGSFTIžíP|ŽR´_°63-„_´–Ò¸±„鮧¸Çž–Šc“R} 
$ curl -X POST http://localhost:8081/refresh 
[] 
$ curl -X POST http://localhost:8081 -d url=http://google.com 
http://127.0.0.1:9999/58f3ae21 
SFTUBSUe—_tv[|¡Öé°–¶æòwÖìÐÅ¢X`ía˜k_tX›W–Še} 
$POGJH4FSWFS|$POGJH$MJFOUtŽw$USM
$s=’cr[laP}	(JUCVDLFU
3FEJT{O”ckŠŠwcr[laP}¥ 
?3 Spring Cloud NetflixsÝ£®ì´–Ò¸¡–¬Å®ÀâÖ¤ 
?s{4QSJOH$MPVE/FUGMJYžžokF“vо–òž9ncŠe} 
?sR¶¸Åßz¡–¬Å®Àâ.ž’AwÜcŠe} 
?Öì·¦®Çz£òÜ–Ç 
°'JMF±°*NQPSU.PEVMF±s?Öì·¦®Çž£òÜ–ÇcŠe}°	Îò¹©òÇXzê–ÇÔ¨ê¿
FYFSDJTF 
OFUGMJY±ž¶]cr[laP}
DPOGJHTFSWFS{$POGJH4FSWFSžckÖì·¦®Çse}?t•dse} 
FVSFLBTFSWFS{4FSWJDF%JTDPWFSZsN—VSFLBžO”e—Öì·¦®Çse}¿Â¶äÛ–ÈŽŸcŠe} 
IZTUSJYEBTICPBSE{)ZTUSJYz¿Â¶äÛ–ÈžŸe—Öì·¦®Çse} 
VSMTIPSUFOFS{?w$POGJH$MJFOUz•#žðHckÖì·¦®Çse} 
VSMTIPSUFOFSVJ{°63-„_´–Ò¸±zmæse}RestClientt$MJFOU-PBECBMBODFSz3JCCPžžorVSMTIPSUFOFSw¡® 
º¸cŠe} 
u˜Ž=wI‹s|Lw²–Æ¢ò¯e—«P{N–ŠgŸ}ÖW•zwwO”cŠe} 
?sO”ck(JUCVDLFUX«Psezs|=’crcŠokÝ{öícr[laP} 
Config ServerzO” 
?•Fw|’Az²ÝòÈs$POGJH4FSWFSžO”cr[laP} 
$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix 
$ mvn spring-boot:run -f configserver/pom.xml 
Service Discovery (Eureka Server)zO”
’Az²ÝòÈsVSFLB4FSWFSžO”cr[laP} 
$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix 
$ mvn spring-boot:run -f eureka-server/pom.xml 
IUUQMPDBMIPTUsVSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸sYŠe} 
xÔFs{VSFLB4FSWFSwVôa˜rP—£ò¸¾ò¸{N–ŠgŸ} 
Circuit Breaker Monitor (Hystrix Dashboard)zO”
’Az²ÝòÈs)ZTUSJY%BTICPBSEžO”cr[laP} 
$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix 
$ mvn spring-boot:run -f hystrix-dashboard/pom.xml 
O” |Â-ok•VSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸cr[laP} 
)ZTUSJY%BTICPBSEXVSFLBwVôa˜k_tX
W–Še	¡–¬Å®Àâ.wMa˜rPŠgŸX|$JSDVJU#SFBLFS.POJUPS 
W•4FSWJDF%JTDPWFSZ„z¬ö|se
} 
s{)ZTUSJY%BTICPBSEw¡®º¸cŠc“R}IUUQMPDBMIPTUw¡®º¸cr[laP}
¯zâ¦Ô¨–ßw{)ZTUSJYžqJck´–Ò¸záQž¤e—kzFWFOUTUSFBNz63-ž®e—_ts|iz´–Ò 
¸žáʾéò¯e—_tXsYŠe} 
Š l )ZTUSJY ž q J c k ´ – Ò ¸ X v P k  | _ _ s { Æ á J z .PDL 4USFBN ž ž J c Š 
e}IUUQMPDBMIPTUNPDLTUSFBNžâ¦cr|°.POJUPS4USFBN±ž®é®cr[laP} 
)ZTUSJYz£ØòÇžáʾéò¯sYŠe}
 ‡u°63-„_´–Ò¸±zFWFOUTUSFBNžáʾéò¯cŠe} 
°URL„_´–Ò¸±zO” 
Õw?W•žP]rP—°63-„_´–Ò¸±žO”cŠe} 
 ‡u_z°63-„_´–Ò¸±žQO”cŠe}VSFLBw*IPTUOBNFtcréåag—k|N•WdFUDIPTUTw’A 
zžðHcrVYŠe} 
127.0.0.1 urlshortener1 urlshortener2 urlshortener3 
¡|?zVSMTIPSUFOw;cr|’Az/ÒžHTrPŠe} 
UrlShortener®è¸XVSFLBz®è£¡òÇwv—kw@EnableEurekaClientžðHcrPŠe} 
@EnableAutoConfiguration 
@ComponentScan 
@RestController 
@RefreshScope 
@EnableEurekaClient // 追加 
public class UrlShortener { 
// 略 
} 
BQQMJDBUJPOZNMwVSFLBwe—áQžðHcrPŠe} 
eureka:
client: 
serviceUrl: 
defaultZone: http://localhost:8761/eureka/ 
instance: 
hostname: ${APPLICATION_DOMAIN:127.0.0.1} 
nonSecurePort: ${server.port} 
i˜s{°63-„_´–Ò¸±žO”cŠc“R}QPSUtVSFLBwVôe—IPTUOBNFž®cŠe} 
$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix 
$ mvn spring-boot:run -f urlshortener/pom.xml  
-Drun.arguments=--server.port=8081,--eureka.instance.hostname=urlshortener1 
O” |Â-ok•VSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸cr[laP} 
VSMTIPSUFOFSXVSFLBwVôa˜k_tX
W–Še} 
°URL„_´–Ò¸±UIzO” 
? z´–Ò¸tcr°63-„_´–Ò¸±6*žO”cŠe} 
O”e—¼w6*Jz²òÔ¢­äë–¶æòžfcŠe} 
$POGJH3FQPTJUPSZw¡®º¸cr|VSMTIPSUFOFSVJZNMžfc|’AzÆ?žMecr[laP} 
urlshorten.api.url: http://urlshortener
endpoints.restart: 
enabled: true 
6*žwÜ–ÇsO”cŠe} 
$ mvn spring-boot:run -f urlshortener-ui/pom.xml -Drun.arguments=--server.port=9999 
O” |Â-ok•VSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸cr[laP} 
VSMTIPSUFOFSVJXVSFLBwVôa˜k_tX
W–Še} 
i˜s{IUUQMPDBMIPTUw¡®º¸cŠc“R}
VSMâ¦Ô¨–ßw°IUUQHPPHMFDPN±žâ¦cr|ýÛ¾òž®é®cŠc“R} 
Ï®§òÈz°63-„_´–Ò¸±X|˜r„_63-X¼Üa˜Še}

More Related Content

What's hot

Umrah ka tariqah || Australian Islamic Library
Umrah ka tariqah || Australian Islamic LibraryUmrah ka tariqah || Australian Islamic Library
Umrah ka tariqah || Australian Islamic Library
Muhammad Nabeel Musharraf
 
অধিকারীর অধিকার – আব্দুল হামীদ আল মাদানী
অধিকারীর অধিকার – আব্দুল হামীদ আল মাদানীঅধিকারীর অধিকার – আব্দুল হামীদ আল মাদানী
অধিকারীর অধিকার – আব্দুল হামীদ আল মাদানী
rasikulindia
 
187 Takhlees Usoo Le Shashi - brelvi madaris
187 Takhlees Usoo Le Shashi - brelvi madaris187 Takhlees Usoo Le Shashi - brelvi madaris
187 Takhlees Usoo Le Shashi - brelvi madaris
nabeelsahab
 
Tấm nhựa trong A-PET Nan Ya
Tấm nhựa trong A-PET Nan YaTấm nhựa trong A-PET Nan Ya
Tấm nhựa trong A-PET Nan Ya
Công ty TNHH Tân Mỹ Ching Việt Nam
 
Karbala aur sabai sazish
Karbala aur sabai sazishKarbala aur sabai sazish
Karbala aur sabai sazish
Muhammad Nabeel Musharraf
 
تقلید کی حقیقت ؟ | Taqleed ki haqeeqat
تقلید کی حقیقت ؟  | Taqleed ki haqeeqatتقلید کی حقیقت ؟  | Taqleed ki haqeeqat
تقلید کی حقیقت ؟ | Taqleed ki haqeeqat
Quran Juz (Para)
 
Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...
Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...
Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...
Muhammad Nabeel Musharraf
 
غصے کا علاج
غصے کا علاجغصے کا علاج
غصے کا علاج
Ilyas Qadri Ziaee
 
رياضيات سابع دليل المعلم
رياضيات سابع دليل المعلمرياضيات سابع دليل المعلم
رياضيات سابع دليل المعلمMosab Qasem
 
4 سنسی خیز خواب
4 سنسی خیز خواب4 سنسی خیز خواب
4 سنسی خیز خواب
Sunni Shan
 
textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...
textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...
textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...
Muhammad Nabeel Musharraf
 
Asr e-hazir mein ruyate hilaal
Asr e-hazir mein ruyate hilaalAsr e-hazir mein ruyate hilaal
Asr e-hazir mein ruyate hilaal
Muhammad Nabeel Musharraf
 
Usool us sunnah
Usool us sunnahUsool us sunnah
Usool us sunnah
Muhammad Nabeel Musharraf
 
اعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیں
اعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیںاعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیں
اعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیں
Ilyas Qadri Ziaee
 

What's hot (17)

Umrah ka tariqah || Australian Islamic Library
Umrah ka tariqah || Australian Islamic LibraryUmrah ka tariqah || Australian Islamic Library
Umrah ka tariqah || Australian Islamic Library
 
অধিকারীর অধিকার – আব্দুল হামীদ আল মাদানী
অধিকারীর অধিকার – আব্দুল হামীদ আল মাদানীঅধিকারীর অধিকার – আব্দুল হামীদ আল মাদানী
অধিকারীর অধিকার – আব্দুল হামীদ আল মাদানী
 
002 al-baqarah
002 al-baqarah002 al-baqarah
002 al-baqarah
 
187 Takhlees Usoo Le Shashi - brelvi madaris
187 Takhlees Usoo Le Shashi - brelvi madaris187 Takhlees Usoo Le Shashi - brelvi madaris
187 Takhlees Usoo Le Shashi - brelvi madaris
 
Tấm nhựa trong A-PET Nan Ya
Tấm nhựa trong A-PET Nan YaTấm nhựa trong A-PET Nan Ya
Tấm nhựa trong A-PET Nan Ya
 
Karbala aur sabai sazish
Karbala aur sabai sazishKarbala aur sabai sazish
Karbala aur sabai sazish
 
Peshkash baiyate abubakr
Peshkash baiyate abubakrPeshkash baiyate abubakr
Peshkash baiyate abubakr
 
012 yusuf
012 yusuf012 yusuf
012 yusuf
 
تقلید کی حقیقت ؟ | Taqleed ki haqeeqat
تقلید کی حقیقت ؟  | Taqleed ki haqeeqatتقلید کی حقیقت ؟  | Taqleed ki haqeeqat
تقلید کی حقیقت ؟ | Taqleed ki haqeeqat
 
Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...
Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...
Alamaat e-qayamat saymutalliqrasool-e-akramsallallahualaihiwasallamkipeshango...
 
غصے کا علاج
غصے کا علاجغصے کا علاج
غصے کا علاج
 
رياضيات سابع دليل المعلم
رياضيات سابع دليل المعلمرياضيات سابع دليل المعلم
رياضيات سابع دليل المعلم
 
4 سنسی خیز خواب
4 سنسی خیز خواب4 سنسی خیز خواب
4 سنسی خیز خواب
 
textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...
textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...
textsDeeni Madaris Nisab-o-nizam - Maulana Abu Ammar Zahid Al-Rashidia || Aus...
 
Asr e-hazir mein ruyate hilaal
Asr e-hazir mein ruyate hilaalAsr e-hazir mein ruyate hilaal
Asr e-hazir mein ruyate hilaal
 
Usool us sunnah
Usool us sunnahUsool us sunnah
Usool us sunnah
 
اعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیں
اعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیںاعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیں
اعلٰحضرت (رحمۃ اللہ علیہ) کی انفرادی کوششیں
 

Viewers also liked

Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Toshiaki Maki
 
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatformJSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
Takahiro Fujii
 
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_bootGrails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Toshiaki Maki
 
Spring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjugSpring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjug
Toshiaki Maki
 
FiNC DDD第一回勉強会
FiNC DDD第一回勉強会FiNC DDD第一回勉強会
FiNC DDD第一回勉強会
裕紀 重村
 
Spring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsugSpring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsug
Toshiaki Maki
 
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Toshiaki Maki
 
ネイティブ開発アンチパターン
ネイティブ開発アンチパターンネイティブ開発アンチパターン
ネイティブ開発アンチパターン
Yuki Tamura
 
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
Toshiaki Maki
 

Viewers also liked (9)

Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
 
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatformJSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
 
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_bootGrails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
 
Spring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjugSpring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjug
 
FiNC DDD第一回勉強会
FiNC DDD第一回勉強会FiNC DDD第一回勉強会
FiNC DDD第一回勉強会
 
Spring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsugSpring Bootで変わる Javaアプリ開発! #jsug
Spring Bootで変わる Javaアプリ開発! #jsug
 
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
 
ネイティブ開発アンチパターン
ネイティブ開発アンチパターンネイティブ開発アンチパターン
ネイティブ開発アンチパターン
 
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
 

More from Toshiaki Maki

From Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsugFrom Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
Toshiaki Maki
 
Concourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyoConcourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyo
Toshiaki Maki
 
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1tServerless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Toshiaki Maki
 
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
Toshiaki Maki
 
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Toshiaki Maki
 
Spring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & MicrometerSpring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & Micrometer
Toshiaki Maki
 
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpOpen Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Toshiaki Maki
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsug
Toshiaki Maki
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1
Toshiaki Maki
 
BOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoBOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyo
Toshiaki Maki
 
Why PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring BootWhy PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring Boot
Toshiaki Maki
 
Zipkin Components #zipkin_jp
Zipkin Components #zipkin_jpZipkin Components #zipkin_jp
Zipkin Components #zipkin_jp
Toshiaki Maki
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
Toshiaki Maki
 
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyoSpring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Toshiaki Maki
 
Managing your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CIManaging your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CI
Toshiaki Maki
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Toshiaki Maki
 
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoShort Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyo
Toshiaki Maki
 
今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k
Toshiaki Maki
 
Team Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyoTeam Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyo
Toshiaki Maki
 
Spring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyoSpring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyo
Toshiaki Maki
 

More from Toshiaki Maki (20)

From Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsugFrom Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
 
Concourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyoConcourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyo
 
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1tServerless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
 
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
 
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
 
Spring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & MicrometerSpring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & Micrometer
 
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpOpen Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjp
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsug
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1
 
BOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoBOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyo
 
Why PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring BootWhy PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring Boot
 
Zipkin Components #zipkin_jp
Zipkin Components #zipkin_jpZipkin Components #zipkin_jp
Zipkin Components #zipkin_jp
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
 
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyoSpring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
 
Managing your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CIManaging your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CI
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
 
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoShort Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyo
 
今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k
 
Team Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyoTeam Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyo
 
Spring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyoSpring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyo
 

#JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

  • 1. ++6($$$'BMM34QSJOH#PPUÎò¹©ò›4QSJOH#PPUsf—Ý£®ì´–Ò¸¡–¬Å®Àâ„z„KKVH@DDD DDD@S öÕ Ì¼s˜ «Pv¼ÔÇ¥¦¡z£ò¸Ç–ê .BWFOéÜ·Çéz²Ó– ?zÀ9 ?4QSJOH#PPUs°63-„_´–Ò¸±žf— ?Öì·¦®Çzf€£òÜ–Ç bU50%0ž rÖì¯èßžñagr[laP bU3FEJTžžor$PODVSSFOU)BTI.BQžJó ž„YúTŠc“R ?4QSJOH$MPVE$POGJHs”0²òÔ¢­äë–¶æò ?Öì·¦®Çz£òÜ–Ç (JUCVDLFUzO”$POGJH3FQPTJUPSZzf $POGJH4FSWFSO” °63-„_´–Ò¸±¹]z²òÔ¢­äë–¶æòf °63-„_´–Ò¸± $POGJH$MJFOU zO” bU°63-„_´–Ò¸± $POGJH$MJFOU ž3FGSFTI¸²–Öw/Ò ?4QSJOH$MPVE/FUGMJYsÝ£®ì´–Ò¸¡–¬Å®ÀâÖ¤ ?Öì·¦®Çz£òÜ–Ç $POGJH4FSWFSzO” 4FSWJDF%JTDPWFSZ VSFLB4FSWFS zO” $JSDVJU#SFBLFS.POJUPS )ZTUSJY%BTICPBSE zO” °63-„_´–Ò¸±zO” °63-„_´–Ò¸±6*zO” °63-„_´–Ò¸±z¸°–ê¡¥Ç Št ̼s˜ «Pv¼ÔÇ¥¦¡z£ò¸Ç–ê .BD8JOEPXTå–µ–¹]wMecrPŠe}-JOVYsö²e—Ý{•zzžö²cr[laP} Java SE 8 IUUQXXXPSBDMFDPNUFDIOFUXPSLKBWBKBWBTFEPXOMPBETKELEPXOMPBETIUNMW•+BWB 4 %FWFMPQNFOU ,JUV ’ÖsN˜|Vi•[0, ž¿¥òì–Ècr|£ò¸Ç–êcr[laP} «/DJAVA_HOMEztPATHzðHž«fíor[laP} Maven IUUQGUQNFJTFJVBDKQNJSSPSBQBDIFEJTUNBWFONBWFOCJOBSJFTBQBDIFNBWFOCJOUBSH[W•.BWFOž ¿¥òì–Ècr|ŽckÆ¢ë®ÇézCJOԨ꿞«/DPATHwðHcr[laP} ¡| Îò¹©òÇXzê–ÇÔ¨ê¿ TPGUXBSFBQBDIFNBWFOCJOUBSH[w¿¥òì–ÈI‹se} Git Bash (WindowszÝ) 8JOEPXTzÝ| IUUQHJUTDNDPNEPXOMPBEXJOW•(JUž¿¥òì–Ècr£ò¸Ç–êcr[laP} ’Asöíe—²ÝòÈ{Àr(JUwÔcrP—(JU#BTIžJPröícr[laP} jq (©Ö¶æò) «,s{vPseX|+40/c¦z^JwIUUQTUFEPMBOHJUIVCJPKRž£ò¸Ç–êcrV[t Pse} Redis
  • 2. .BDzÝ{|’Ažöícr[laP} P9$PEF $ cd (ハンズオン資材のルートフォルダ)/software/redis-2.8.17 $ tar xzvf redis-2.8.17.tar.gz $ cd redis-2.8.17 $ make 8JOEPXTÒÂÇzÝ{| Îò¹©òÇXzê–ÇÔ¨ê¿ TPGUXBSFSFEJTSFEJT[JQžŽcr[laP} 8JOEPXTÒÂÇzÝ{| Îò¹©òÇXzê–ÇÔ¨ê¿ TPGUXBSFSFEJTFEJTCJO[JQžŽcr[laP} Gitbucket IUUQTHJUIVCDPNUBLF[PFHJUCVDLFUSFMFBTFTEPXOMPBEHJUCVDLFUXBS”–|(JUCVDLFUž¿¥òì–Ècr[la P} ¡| Îò¹©òÇXzê–ÇÔ¨ê¿ TPGUXBSFHJUCVDLFUXBSw¿¥òì–ÈI‹se} IntelliJ IDEA IUUQTXXXKFUCSBJOTDPNJEFBEPXOMPBE”–|*OUFMMJ+*%z$PNNVOJUZEJUJPOŠk{6MUJNBUFEJUJPOž¿¥òì– Ècr£ò¸Ç–êcr[laP} 4QSJOH5PPM4VJUFDMJQTFžžJcrŽÎò¹©òžö²sYŠeX|Îò¹©òzÚ{*OUFMMJ+*%žJPríPŠe} MavenéÜ·Çéz²Ó– Îò¹©ò{©Ôè£ò«síPŠe} «Pvè£Õè鞣ò¾–ÌÂÇW•¿¥òì–ÈgfåŠ.BWFOéÜ·Çéw²Ó–cŠe} Îò¹©òÇXzê–ÇÔ¨ê¿ SFQPTJUPSZ’Až Ú–ßÆ¢ë®Çé NSFQPTJUPSZ’Aw²Ó–cr[laP} $ cp -rf (ハンズオン資材のルートフォルダ)/repository/* ~/.m2/repository/ overwrite /Users/maki/.m2/repository/antlr/antlr/2.7.2/_maven.repositories? (y/n [n])tPR”RwÖ„Ye—WuRWW˜—Ý{ $ cp -rf (ハンズオン資材のルートフォルダ)/repository/* ~/.m2/repository/ žöícr[laP} ?zÀ9 ˜?s°63-„_´–Ò¸±žUXwÝ£®ì´–Ò¸¡–¬Å®ÀâžÖ¤cŠe} ?=0wÖ¤e—¡–¬Å®Àâž’AwÜcŠe} ?s{4QSJOH#PPUžJPrz´z°63-„_´–Ò¸±žfcŠe}
  • 4. ˜a{DzݶòžJPrÖ¤cŠeX|˜?s{pzݶòÖsÀrz´–Ò¸žO”cŠe} ?1 Spring Boots°URL„_´–Ò¸±žf— ?s{Ý£®ì´–Ò¸‰sz'J[[#V[[þUsN—|°63-„_´–Ò¸±žf–Še} bUsConcurrentHashMapžžokö}bUs3FEJTžžoköžíPŠe} £òÜ–Çe—Öì·¦®Çw‡tŸuz²–ÈXöa˜rP—zs|bUsöe—²–È{‡ŸzDíse} ?Öì·¦®Çzf€£òÜ–Ç LÖì·¦®Çf *OUFMMJ+*%žŽPr°/FX1SPKFDU±sLÖì·¦®ÇžfcŠe}’Az”Rw°NQUZ1SPKFDU±ž¶]cr[la P}
  • 6. °1SPKFDU4USVDUVSF±s’Az–žâ¦cr[laP} 1SPKFDU4%, 1SPKFDUMBOHVBHFMFWFM +%,X¾zÝ{|°/FX±žcr+%,žcr[laP}+7@)0.wö|e—Ԩ꿞¶]e˜| Pse} ?Öì·¦®Çz£òÜ–Ç °'JMF±°*NQPSU.PEVMF±s?Öì·¦®Çž£òÜ–ÇcŠe} ° Îò¹©òÇXzê–ÇÔ¨ê¿ FYFSDJTFVSMTIPSUFOFS±ž¶]cr[laP}
  • 8. bU1 TODOž rÖì¯èßžñagr[laP demo.UrlShortenerž2Kcr[laP} ’ATODOó ž r[laP} @RequestMapping(value = /, method = RequestMethod.POST) ResponseEntityString save(@RequestParam String url) { if (urlValidator.isValid(url)) { String hash = /* TODO (1) URLをハッシュ化。ハッシュアルゴリズムには 32-bit murmur3 algorithm を使用する。 */; // ヒント: com.google.common.hash.Hashing.murmur3_32()を使う // TODO (2) urlMapにhashに紐づくURLを追加する。 return new ResponseEntity(urlShortenUrl + / + hash, HttpStatus.OK); } else { return new ResponseEntity(HttpStatus.BAD_REQUEST); } } UrlShortener®è¸žÌ®é®cr|Run UrlShortener.main()ž®é®cr[laP} ’Az”RwŽöísYŠe} $ cd (ハンズオン資材のルートフォルダ)/exercise/01-urlshortener $ mvn spring-boot:run -f urlshortener/pom.xml ’AzHQX4—W±écr[laP}
  • 9. $ curl -X POST http://localhost:8080 -d url=http://google.com http://localhost:8080/58f3ae21 $ curl -X GET http://localhost:8080/58f3ae21 http://google.com UrlShortenerTest®è¸žÌ®é®cr|Run UrlShortenerTestž®é®cr[laP} ŸÇX´ck•bU{ñ’se} ŸÇ{’Az”RwŽöísYŠe} $ mvn test -f urlshortener/pom.xml bU2 RedisžžorConcurrentHashMapžJó ž„YúTŠc“R ÕwConcurrentHashMapzó ž3FEJTžžJe—”Rw„YúTŠe}4QSJOH#PPUw”—VUPDPOGJHVSBUJPOsPWw
  • 11. $ cd (ハンズオン資材のルートフォルダ)/software/redis-2.8.17 $ ./src/redis-server [34286] 09 Nov 05:27:07.455 # Warning: no config file specified, using the default config. In order to specify a config file use ./src/redis-server /path/to/redis.[34286] 09 Nov 05:27:07.457 * Increased maximum number of open files to 10032 (it was originally set to 2560). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 2.8.17 (00000000/0) 64 bit .-`` .-```. ```/ _.,_ ''-._ ( ' , .-` | `, ) Running in stand alone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 34286 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [34286] 09 Nov 05:27:07.465 # Server started, Redis version 2.8.17 [34286] 09 Nov 05:27:07.466 * DB loaded from disk: 0.001 seconds [34286] 09 Nov 05:27:07.466 * The server is now ready to accept connections on port 6379 8JOEPXTzÝ|SFEJTTFSWFSFYFžöícr[laP} ¼–¸²–Èz7c ’Azª}ž„YúTr[laP} final ConcurrentHashMapString, String urlMap = new ConcurrentHashMap(); // ↓ @Autowired StringRedisTemplate redisTemplate; w„YúTr[laP} urlMap.putIfAbsent(hash, url); // ↓ redisTemplate.opsForValue().set(hash, url); w„YúTr[laP} String url = urlMap.get(hash); // ↓ String url = redisTemplate.opsForValue().get(hash); w„YúTr[laP} „YúTk w|bU•FwŸÇXó˜|bUŽñ’se} O”ck¡Öé°–¶æò{=’crVPr[laP}3FEJT{O”ckŠŠwcr[laP} ?2 Spring Cloud Configs”0²òÔ¢­äë–¶æò ?s{4QSJOH$MPVE$POGJHžžok”0²òÔ¢­äë–¶æòž9ncŠe} ?sR¶¸Åßz¡–¬Å®Àâ.ž’AwÜcŠe}
  • 12. $POGJH$MJFOUtcr?sfck°63-„_´–Ò¸±žžJc|$POGJH4FSWFS fI‹ W•ž¤cŠe} $POGJH4FSWFS{ÆÔ¨êÇs(JUIVCwŠcŠeX|x{©Ôè£ò«sö²e—k|ì–ªêw€mÖ^k(JUCVDLFUž žJcŠe} ?Öì·¦®Çz£òÜ–Ç °'JMF±°*NQPSU.PEVMF±s?Öì·¦®Çž£òÜ–ÇcŠe}° Îò¹©òÇXzê–ÇÔ¨ê¿ FYFSDJTF EJTUSJCVUFEDPOGJH±ž¶]cr[laP} DPOGJHTFSWFS{$POGJH4FSWFSžckÖì·¦®Çse} VSMTIPSUFOFS{?w$POGJH$MJFOUz•#žðHckÖì·¦®Çse} um•Ž=wI‹s|Lw²–Æ¢ò¯e—«P{N–ŠgŸ} GitbucketzO” Config Repositoryzf (JCVDLFUžO”cŠc“R}wÜ–ÇžžJe—zs|_zÜ–ÇžžJcrP—¡ÖéXN˜|=’cr[laP} $ cd (ハンズオン資材のルートフォルダ)/software $ java -jar gitbucket.war IUUQMPDBMIPTUw¡®º¸cå–µ–Øиî–ÈtŽw°SPPU±s쯣òcr[laP}
  • 16. ŽR´pÔ £êžfcŠe}Ô £êØž°GPPEFWFMPQNFOUQSPQFSUJFT±wc|’AzÆ?žMâc|°$PNNJU DIBOHFT±ž®é®cr[laP} foo: Hello! Config ServerO” °DPOGJHTFSWFS±zbootstrap.ymlw’AzX훘rP—_tž±écr[laP} spring.cloud.config.server.uri: http://localhost:8080/git/root/config-repo.git ’Az²ÝòÈs$POGJH4FSWFSžO”cr[laP} $ cd (ハンズオン資材のルートフォルダ)/exercise/02-distributed-config $ mvn spring-boot:run -f configserver/pom.xml ”f±écŠc“R} $ curl http://localhost:8888/admin/env ’As{KRžžor^ckHQžÜcŠe}
  • 17. $ curl http://localhost:8888/admin/env | jq . { defaultProperties: { spring.config.name: configserver }, applicationConfig: [classpath:/bootstrap.yml]: { spring.cloud.config.server.uri: http://localhost:8080/git/root/config-repo.git }, applicationConfig: [classpath:/configserver.yml]: { management.context_path: /admin, spring.application.name: configserver, server.port: 8888, info.component: Config Server, spring.jmx.default_domain: cloud.config.server }, // ... 省略 } spring.cloud.config.server.uriX`ía˜rP—_tž±écr[laP} Õw²òÔ¢­äë–¶æòž¤cŠe}BQQØ{GPP|QSPGJMFØ{EFGBVMUwcŠe} $ curl http://localhost:8888/foo/default ’As{KRžžor^ckHQžÜcŠe} $ curl http://localhost:8888/foo/default | jq . { propertySources: [ { source: { foo: 123456, bar: abcdef }, name: http://localhost:8080/git/root/config-repo.git/foo.properties } ], label: master, name: default } ÕwQSPGJMFž/Òcr¤cŠc“R} $ curl http://localhost:8888/foo/development ’As{KRžžor^ckHQžÜcŠe} $ curl http://localhost:8888/foo/development | jq . { propertySources: [ { source: { foo: Hello! }, name: http://localhost:8080/git/root/config-repo.git/foo-development.properties }, { source: { foo: 123456, bar: abcdef }, name: http://localhost:8080/git/root/config-repo.git/foo.properties } ], label: master, name: development } foo-development.propertiessÖ„YcrP—_tX W–Še} °URL„_´–Ò¸±¹]z²òÔ¢­äë–¶æòf •Fw|63-„_´–Ò¸¹]z²òÔ¢­äë–¶æòž°VSMTIPSUFOFSZNM±wfcŠe}Æ?{’Azó–se} urlshorten: url: http://localhost:${server.port} spring: redis: host: localhost # server host password: # server password port: 6379 # connection port pool: max-idle: 8 # pool settings ... min-idle: 0
  • 18. max-active: 8 max-wait: -1 endpoints.restart: enabled: true ”f±écŠc“R} $POGJH4FSWFSzO”{ÓPse $ curl http://localhost:8888/urlshortener/default ’As{KRžžor^ckHQžÜcŠe} $ curl http://localhost:8888/urlshortener/default | jq . { propertySources: [ { source: { spring.redis.pool.max-idle: 8, spring.redis.password: , spring.redis.host: localhost, spring.redis.port: 6379, urlshorten.url: http://localhost:${server.port}, endpoints.restart.enabled: true, spring.redis.pool.max-active: 8, spring.redis.pool.min-idle: 0, spring.redis.pool.max-wait: -1 }, name: http://localhost:8080/git/root/config-repo.git/urlshortener.yml } ], label: master, name: default } (JUÖz/ÒX`ía˜rPŠe} °URL„_´–Ò¸±(Config Client)zO” Õw$POGJH$MJFOUtcr|°63-„_´–Ò¸±žO”cŠe} £òÜ–ÇckÖì·¦®Ç FYFSDJTFEJTUSJCVUFEDPOGJHVSMTIPSUFOFS zQPNYNMw’Az•#XðHa˜rP—_t ž±écr[laP} dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency Šk|VSMTIPSUFOFSzCPPUTUSBQZNMw
  • 19. spring: application: name: urlshortener Xa˜rP—_tž±écr[laP} °63-„_´–Ò¸±žO”cŠc“R}wÜ–Ç{=wO”crP—zs|Öì¯èßÂDw--server.port=8081žp]r wÜ–ÇsO”cŠe} $ cd (ハンズオン資材のルートフォルダ)/exercise/02-distributed-config $ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments=--server.port=8081 ?•Fw’Az鮧¸Çžor[laP} Ü–ÇØX/Òa˜rP—_twDžp]r[laP $ curl -X POST http://localhost:8081 -d url=http://google.com http://localhost:8081/58f3ae21 $ curl -X GET http://localhost:8081/58f3ae21 http://google.com Õw$POGJH4FSWFS VSMTIPSUFOFSZNM z–ž/TŠc“R} IUUQMPDBMIPTUSPPUDPOGJHSFQPCMPCNBTUFSVSMTIPSUFOFSZNMw¡®º¸c|°EJU±Û¾òž®é®cr[la P} urlshorten.urlžhttp://localhost:9999w/Òcr°$PNNJUDIBOHFT±ž®é®cr[laP} _z{?sžJcŠe }
  • 20. /Òž`íe—¼w|$POGJH$MJFOUÖzÖìÐÅ¢ž±écŠc“R} $ curl -X GET http://localhost:8081/env/urlshorten.url http://localhost:8081 Õw$POGJH$MJFOUžSFGSFTIcŠe} $ curl -X POST http://localhost:8081/refresh [urlshorten.url] $ curl -X GET http://localhost:8081/env/urlshorten.url http://localhost:9999 /ÒX`ía˜Šck}cWc|’Azó–%*I‹zÖìÐÅ¢w%*{a˜rPŠgŸ} $ curl -X POST http://localhost:8081 -d url=http://google.com http://localhost:8081/58f3ae21 _{$POGJH$MJFOUžSFTUBSUcŠe} $ curl -X POST http://localhost:8081/restart {message:Restarting} SFTUBSU {|?zÖìÐÅ¢s%*a˜rP—_tX›W–Še} $ curl -X POST http://localhost:8081 -d url=http://google.com http://localhost:9999/58f3ae21 bU3 °URL„_´–Ò¸±(Config Client)žRefresh¸²–Öw/Ò °63-„_´–Ò¸ UrlShortener®è¸ ±„zÖìÐÅ¢£ò·¦®¶æò`ížSFGSFTIsíT—”Rw|UrlShortener®è¸ž 3FGSFTI¸²–Öw/Òcr[laP} @EnableAutoConfiguration @ComponentScan @RestController @RefreshScope // ここを追加 public class UrlShortener { // 略 } mvn spring-boot:runsO”ck°63-„_´–Ò¸±ž$USM
  • 21. $s=’cr|_öícr[laP} $ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments=--server.port=8081 x{’Az”RwOW§òÈÜ£òÇw1045e—_ts²òÔ¢­äë–¶æòž/ÒcŠc“R} $ curl -X POST http://localhost:8081/env -d urlshorten.url=http://127.0.0.1:9999 {urlshorten.url:http://127.0.0.1:9999}
  • 22. _|SFGSFTIžíP|ŽR´_°63-„_´–Ò¸±„鮧¸Çž–Šc“R} $ curl -X POST http://localhost:8081/refresh [] $ curl -X POST http://localhost:8081 -d url=http://google.com http://127.0.0.1:9999/58f3ae21 SFTUBSUe—_tv[|¡Öé°–¶æòwÖìÐÅ¢X`ía˜k_tX›W–Še} $POGJH4FSWFS|$POGJH$MJFOUtŽw$USM
  • 23. $s=’cr[laP} (JUCVDLFU 3FEJT{O”ckŠŠwcr[laP}¥ ?3 Spring Cloud NetflixsÝ£®ì´–Ò¸¡–¬Å®ÀâÖ¤ ?s{4QSJOH$MPVE/FUGMJYžžokF“vо–òž9ncŠe} ?sR¶¸Åßz¡–¬Å®Àâ.ž’AwÜcŠe} ?Öì·¦®Çz£òÜ–Ç °'JMF±°*NQPSU.PEVMF±s?Öì·¦®Çž£òÜ–ÇcŠe}° Îò¹©òÇXzê–ÇÔ¨ê¿ FYFSDJTF OFUGMJY±ž¶]cr[laP}
  • 24. DPOGJHTFSWFS{$POGJH4FSWFSžckÖì·¦®Çse}?t•dse} FVSFLBTFSWFS{4FSWJDF%JTDPWFSZsN—VSFLBžO”e—Öì·¦®Çse}¿Â¶äÛ–ÈŽŸcŠe} IZTUSJYEBTICPBSE{)ZTUSJYz¿Â¶äÛ–ÈžŸe—Öì·¦®Çse} VSMTIPSUFOFS{?w$POGJH$MJFOUz•#žðHckÖì·¦®Çse} VSMTIPSUFOFSVJ{°63-„_´–Ò¸±zmæse}RestClientt$MJFOU-PBECBMBODFSz3JCCPžžorVSMTIPSUFOFSw¡® º¸cŠe} u˜Ž=wI‹s|Lw²–Æ¢ò¯e—«P{N–ŠgŸ}ÖW•zwwO”cŠe} ?sO”ck(JUCVDLFUX«Psezs|=’crcŠokÝ{öícr[laP} Config ServerzO” ?•Fw|’Az²ÝòÈs$POGJH4FSWFSžO”cr[laP} $ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix $ mvn spring-boot:run -f configserver/pom.xml Service Discovery (Eureka Server)zO”
  • 25. ’Az²ÝòÈsVSFLB4FSWFSžO”cr[laP} $ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix $ mvn spring-boot:run -f eureka-server/pom.xml IUUQMPDBMIPTUsVSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸sYŠe} xÔFs{VSFLB4FSWFSwVôa˜rP—£ò¸¾ò¸{N–ŠgŸ} Circuit Breaker Monitor (Hystrix Dashboard)zO”
  • 26. ’Az²ÝòÈs)ZTUSJY%BTICPBSEžO”cr[laP} $ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix $ mvn spring-boot:run -f hystrix-dashboard/pom.xml O” |Â-ok•VSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸cr[laP} )ZTUSJY%BTICPBSEXVSFLBwVôa˜k_tX W–Še ¡–¬Å®Àâ.wMa˜rPŠgŸX|$JSDVJU#SFBLFS.POJUPS W•4FSWJDF%JTDPWFSZ„z¬ö|se } s{)ZTUSJY%BTICPBSEw¡®º¸cŠc“R}IUUQMPDBMIPTUw¡®º¸cr[laP}
  • 27. ¯zâ¦Ô¨–ßw{)ZTUSJYžqJck´–Ò¸záQž¤e—kzFWFOUTUSFBNz63-ž®e—_ts|iz´–Ò ¸žáʾéò¯e—_tXsYŠe} Š l )ZTUSJY ž q J c k ´ – Ò ¸ X v P k  | _ _ s { Æ á J z .PDL 4USFBN ž ž J c Š e}IUUQMPDBMIPTUNPDLTUSFBNžâ¦cr|°.POJUPS4USFBN±ž®é®cr[laP} )ZTUSJYz£ØòÇžáʾéò¯sYŠe}
  • 28.  ‡u°63-„_´–Ò¸±zFWFOUTUSFBNžáʾéò¯cŠe} °URL„_´–Ò¸±zO” Õw?W•žP]rP—°63-„_´–Ò¸±žO”cŠe}  ‡u_z°63-„_´–Ò¸±žQO”cŠe}VSFLBw*IPTUOBNFtcréåag—k|N•WdFUDIPTUTw’A zžðHcrVYŠe} 127.0.0.1 urlshortener1 urlshortener2 urlshortener3 ¡|?zVSMTIPSUFOw;cr|’Az/ÒžHTrPŠe} UrlShortener®è¸XVSFLBz®è£¡òÇwv—kw@EnableEurekaClientžðHcrPŠe} @EnableAutoConfiguration @ComponentScan @RestController @RefreshScope @EnableEurekaClient // 追加 public class UrlShortener { // 略 } BQQMJDBUJPOZNMwVSFLBwe—áQžðHcrPŠe} eureka:
  • 29. client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: hostname: ${APPLICATION_DOMAIN:127.0.0.1} nonSecurePort: ${server.port} i˜s{°63-„_´–Ò¸±žO”cŠc“R}QPSUtVSFLBwVôe—IPTUOBNFž®cŠe} $ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix $ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments=--server.port=8081,--eureka.instance.hostname=urlshortener1 O” |Â-ok•VSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸cr[laP} VSMTIPSUFOFSXVSFLBwVôa˜k_tX W–Še} °URL„_´–Ò¸±UIzO” ? z´–Ò¸tcr°63-„_´–Ò¸±6*žO”cŠe} O”e—¼w6*Jz²òÔ¢­äë–¶æòžfcŠe} $POGJH3FQPTJUPSZw¡®º¸cr|VSMTIPSUFOFSVJZNMžfc|’AzÆ?žMecr[laP} urlshorten.api.url: http://urlshortener
  • 30. endpoints.restart: enabled: true 6*žwÜ–ÇsO”cŠe} $ mvn spring-boot:run -f urlshortener-ui/pom.xml -Drun.arguments=--server.port=9999 O” |Â-ok•VSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸cr[laP} VSMTIPSUFOFSVJXVSFLBwVôa˜k_tX W–Še} i˜s{IUUQMPDBMIPTUw¡®º¸cŠc“R}
  • 35. ? w°63-„_´–Ò¸±žNt£ò¸¾ò¸O”c|3JCCPOw”—ì–ÈÏèò¶ò¯ž9ncŠc“R} í|°63-„_´–Ò¸±žO”cŠc“R} £ò¸¾ò¸{QPSU IPTUOBNFVSMTIPSUFOFSsO”cŠe} $ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix $ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments=--server.port=8082,--eureka.instance.hostname=urlshortener2 £ò¸¾ò¸{QPSU IPTUOBNFVSMTIPSUFOFSsO”cŠe} $ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix $ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments=--server.port=8083,--eureka.instance.hostname=urlshortener3 Í–È|Í–ÈO” Â-ok•|VSFLB4FSWFSz¿Â¶äÛ–Èw¡®º¸cr[laP} VSMTIPSUFOFS´–Ò¸w;crpz£ò¸¾ò¸XVôa˜Šck} 6*s{3JCCPOžqJe—_ts|§z£ò¸¾ò¸w¡®º¸crP—›]s{v[|http://urlshortenertPR”Rw´–Ò¸Ø w;cr¡®º¸crV–|è¥òÈìÒòzì–ÈÏèò¶ò¯X훘Še} PŠzf–lt|uz£ò¸¾ò¸s63-„_X훘rP—W W•vPzs|’Az”Rv/ÒžíPŠc“R} curl -X POST http://localhost:8081/env -d urlshorten.url=http://localhost:${server.port} curl -X POST http://localhost:8081/refresh
  • 36. curl -X POST http://localhost:8082/env -d urlshorten.url=http://localhost:${server.port} curl -X POST http://localhost:8082/refresh curl -X POST http://localhost:8083/env -d urlshorten.url=http://localhost:${server.port} curl -X POST http://localhost:8083/refresh _˜s6*W•D_Žé®§¸Çž—t|©£ò¸¾ò¸XzwwžJa˜rP—_tX W–Še} u˜Wz£ò¸¾ò¸žgtck–|ûŒagk–crDXO_—WÄcr‹r[laP} Í–Ç z”Ô3–z§è–PfxDXcYP–žÝT—t$JSVJUX0QFOæAwv–|´Ôfot§è–ž4e”Rwv –Še} Št ˜?žódr’AzÆ?ž»Šck} ?s{4QSJOH#PPUžžor
  • 37. zwÝ£®ì´–Ò¸žfe—[]ž»Šck}ŠkDís3FEJTw;%e—[]Ž» Šck} ?s{4QSJOH$MPVE$POGJHžžor”0²òÔ¢­äë–¶æòzíP[ž»Šck} ?s{4QSJOH$MPVE/FUGMJYžžorÝ£®ì´–Ò¸¡–¬Å®ÀâwV]—P[pWzо–òžöxcŠck} a•v—»?w{4QSJOH$MPVEz3FGFSFODFžˆ¹cr[laP}