Comparison with monolith and microservices - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
์ด๋ฒ ํ์ด์ง๋ monolith ๋ก ๊ตฌ์ฑ๋์ด์๋ Public Education Example ํ์ด์ง๋ฅผ microservices ๋ก ๋ณํ์ ํ๋ ์์
์ ํตํ์ฌ monolith์ microservices๋ฅผ ๋น๊ตํ๋ค.
Public Education Example ์์๋ monolith ๊ตฌ์กฐ๋ก ํ๋์ ํ๋ก์ ํธ์์ ๊ฐ ์๋น์ค ๊ฐ์ ํต์ ์ URL๋งํฌ๋ก relationํ๋ ๋ชจ์ต์ ๋ณด์ฌ์ฃผ์๋๋ฐ, microservices ๊ตฌ์กฐ์์๋ ์๋น์ค ๋ณ๋ก ํ๋ก์ ํธ๋ฅผ ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ , ๋์ผ URL๋ก relationํ๋ ๋ชจ์ต์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ์ฌ API GateWay์ Resistry Service๊ฐ ํ์ํ๋ค.
https://github.com/uengine-oss ์ผ๋ก ๋ค์ด๊ฐ์
https://github.com/uengine-oss/msa-tutorial-class-management-msa ๋ฅผ git clone ํ๋ค
$ git clone https://github.com/uengine-oss/msa-tutorial-class-management-msa.git
$ cd msa-tutorial-class-management-msa
ํด๋น ํ๋ก์ ํธ๋ฅผ ๋ค์ด๋ฐ๊ณ intellij๋ก ์ด์์๋, ์๋์ ๊ฐ์ด ํ๋ก์ ํธ ๊ตฌ์กฐ๊ฐ ๋์จ๋ค.
- 1๊ฐ์ shared-model ํ๋ก์ ํธ์
- 5๊ฐ์ domain
- 2๊ฐ์ general services
๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค
shared-model์ด ํ์ํ ์ด์ ๋ ์๋ก ๋ค๋ฅธ ์๋น์ค์์ ๊ณตํต์ผ๋ก ์ฐ์ด๋ ๊ฐ์ฒด๊ฐ ์์ ์ ์๊ธฐ์ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ณตํต์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ฃผ๊ธฐ ์ํ์ฌ ํ์ํ๋ค.
์๋ฅผ ๋ค๋ฉด, customer๊ฐ clazz์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ์๋ customer ์๋น์ค์์ clazz์ ์ ๋ณด๋ฅผ ๋ด๋ถ์ ๊ตฌํ์ ํด๋์์๋ ์์ง๋ง, ๊ณต์ฉ์ผ๋ก ๊ด๋ฆฌํ์ฌ ๊ฐ์ฒด ๋ชจํ์ด ๋ฐ๋๋ ๊ฒ์ ๋ฐฉ์ง ํ ์ ์๋ค.
ํด๋น ํ๋ก์ ํธ๋ฅผ Buildํ์ฌ ์ ์์ ์ผ๋ก ๋์๊ฐ๋์ง ํ์ธ ํด ๋ณธ๋ค.
$ mvn clean package
[INFO] Shared Model 1.0.0-SNAPSHOT ........................ SUCCESS [ 1.287 s]
[INFO] Course Sub-domain 1.0.0-SNAPSHOT ................... SUCCESS [ 1.600 s]
[INFO] Class Sub-domain 1.0.0-SNAPSHOT .................... SUCCESS [ 0.701 s]
[INFO] Subject Matter Experts Sub-domain 1.0.0-SNAPSHOT ... SUCCESS [ 0.623 s]
[INFO] Customer Sub-domain 1.0.0-SNAPSHOT ................. FAILURE [ 0.293 s]
[INFO] Shared Calendar Service 1.0.0-SNAPSHOT ............. SKIPPED
[INFO] zuul-proxy-server 0.0.1-SNAPSHOT ................... SKIPPED
[INFO] eureka-registry-server 1.0-SNAPSHOT ................ SKIPPED
[INFO] hello-class MSA-version ............................ SKIPPED
์์ ๊ฐ์ด Customer ํ๋ก์ ํธ๋ฅผ Build๋ฅผ ํ๋ ์์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ Customer ์๋น์ค ์์์ Clazz๋ฅผ ์ฌ์ฉํ๋๋ฐ, ํด๋น ํด๋ ์ค๋ฅผ ์ฐพ์ง ๋ชปํ๋ค๋ ์๋ฌ์ด๋ค.
์ด ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ณ ์ Customer ์๋น์ค์ dependency์ shared-model ์ ์ถ๊ฐํ์ฌ ์ฃผ์.
์์ ํ๋ก์ ํธ ๋ค์ spring-boot ์์์ ๊ธฐ๋์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ microservice ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ์ฌ microservice๋ฅผ ์ ๊ตฌํํด ๋์
spring-cloud library๋ฅผ ์ฌ์ฉํ์๋ค.
๊ทธ ์ค์ registry service ๋ spring-cloud library์ eureka๋ฅผ ์ฌ์ฉํ์๊ณ , ํด๋น ์๋น์ค๋ ๋ง์ ์์ ์๋น์ค๋ค๊ฐ์ ์ค๋ํฌ์ธํธ๋ฅผ ์ฐพ๊ณ , ์๋น์ค์ ์ํ๋ฅผ ์ด๋๊ฐ์ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ์ ํ๋ค.
registry service๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํ์ฌ mvn spring-boot:run
์ ์คํํ๊ณ , ๋ธ๋ผ์ฐ์ ์์ http://localhost:8761/
๋ก ์ ๊ทผํ์ฌ ํ์ธํ๋ค.
์์ง ์ฌ๋ผ์จ instance๊ฐ ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
์ด์ ๋๊ฐ์ microservice ๋ฅผ ๊ตฌ๋ ์ํฌ ๊ฒ์ด๋ค. ์ญ์๋ ํ๋ก์ ํธ ๊ตฌ๋์ mvn spring-boot:run
์ ์คํ ํ ํ
์ง๋ง
์๋ก ๋ค๋ฅธ port๋ก ๊ตฌ๋์ ์์ผ์ ๊ฐ ์๋น์ค๊ฐ์ URL relation์ ํ์ธ ํ ๊ฒ์ด๋ค.
ํ์ฌ๋ ๋ชจ๋ 8080 ์ผ๋ก ์ค์ ์ด ๋์ด์๋ค.
๊ฐ ํ๋ก์ ํธ์ application.ymlํ์ผ์ ์ด์ด์ server.port ๋ถ๋ถ์ ์๋ก ๋ค๋ฅธ ํฌํธ๋ก ์ค์ ํ๋ค.
mvn spring-boot:run -Dserver.port=8081 ์ผ๋ก ๊ตฌ๋ํด๋ ๋๋ค.
spring:
profiles: local
server:
port: 8081
servletPath: /
- clazz 8081
- course 8082
์ด์ brower์ http://localhost:8761/
๋ก ์ ๊ทผํ์ฌ ๋๊ฐ์ ์๋น์ค๊ฐ ๊ตฌ๋ ๋ ๊ฒ์ ํ์ธ ํ๋ค.
์ด์ Public Education Example ์ Sample project ๊ตฌ๋ํ๊ธฐ ์ ๊ฐ์ ์์
์ ํด ๋ณผ ๊ฒ์ด๋ค.
์ฐจ์ด์ ์ ์ด์ ์๋ ๋ชจ๋ ๊ฐ์ url์ธ localhost:8080 ์ผ๋ก ํธ์ถ์ ํ์๋ค๋ฉด, ์ด๋ฒ์๋ ์๋ก ๋ค๋ฅธ port๋ก ํธ์ถ์ ํ ๊ฒ์ด๋ค
console์ฐฝ์ ์ด์ด์ ๊ฐ ์๋น์ค์ profile์ ํ์ธํ๋ค.
$ http http://localhost:8081/
$ http http://localhost:8082/
## ๊ณผ์ ๋ฑ๋ก
$ http localhost:8082/courses title="software modeling lecture" duration=5 maxEnrollment=5 minEnrollment=1
$ http PATCH "http://localhost:8082/courses/1" description="MSA ๊ต์ฑ๊ณผ์ ์
๋๋ค"
{
"_links": {
"course": {
"href": "http://localhost:8082/courses/1"
},
"self": {
"href": "http://localhost:8082/courses/1"
}
},
"clazzes": [],
"courseId": 1,
"description": "MSA ๊ต์ฑ๊ณผ์ ์
๋๋ค",
"duration": 5,
"maxEnrollment": 5,
"minEnrollment": 1,
"title": "software modeling lecture",
"unitPrice": null
}
## ํด๋์ค 1 ๋ฑ๋ก
## "http://localhost:8082/courses/1" ์ด๊ฒ์ด ๋ฌธ์์ด์ฒ๋ผ ๋์ด๊ฐ์ง๋ง HATEOAS์์๋ ๋ฌธ์์ด์ด ์๋๊ณ , ๋ฆฌ์์ค๋ฅผ ์ง์นญํ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค
$ http localhost:8081/clazzes course="http://localhost:8082/courses/1"
{
"_links": {
"clazz": {
"href": "http://localhost:8081/clazzes/1"
},
"clazzDays": {
"href": "http://localhost:8081/clazzes/1/clazzDays"
},
"course": {
"href": "http://localhost:8081/courses/1"
},
"instructor": {
"href": "http://localhost:8081/instructors/"
},
"self": {
"href": "http://localhost:8081/clazzes/1"
}
},
...
์์ ๊ฐ์ด ์๋ก ๋ค๋ฅธ port๋ก ๊ตฌ๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง, ์ค์ ์ด์์ ํ๊ฑฐ๋, ํธ์ถ์ด ๋ง์ ์ง ๊ฒฝ์ฐ์๋ url๊ณผ port๊ฐ ์ํฌ์๊ฐ ์๋ค.
์ด๋ ํ์ํ ๊ฒ์ด zuul proxy์ด๋ค. URL์ ํ๋์ธ ๊ฒ์ฒ๋ผ ๋ฌถ์ด ์ฃผ๋ ์ญํ ์ ํ๋ค. ๋ณดํต API Gateway๋ผ๊ณ ๋ ๋ถ๋ฆฌ์ด๋ค.
8080 ์ผ๋ก ๋์ด ํ, localhost:8082/courses
, localhost:8081/clazzes
๋ก ํธ์ถํ URL์ localhost:8080/clazzes
์ผ๋ก ํธ์ถ ํ์ฌ ๋ณด๊ฒ ๋ค.
proxy service ํ๋ก์ ํธ๋ก ์ด๋ํ์ฌ mvn spring-boot:run
์ผ๋ก ์คํ ํ๊ณ ,
brower์ http://localhost:8761/
๋ก ์ ๊ทผํ์ฌ 'ZUUL-ROUTER' ์๋น์ค๊ฐ ์คํ ๋ ๊ฒ์ ํ์ธํ๋ค.
## ๊ณผ์ ๋ฑ๋ก
$ http localhost:8080/courses title="software modeling lecture2" duration=3 maxEnrollment=5 minEnrollment=1
$ http PATCH "http://localhost:8080/courses/2" description="MSA2๊ต์ฑ๊ณผ์ ์
๋๋ค"
## ํด๋์ค 2 ๋ฑ๋ก
$ http localhost:8080/clazzes course="http://localhost:8080/courses/2"