API Gateway - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
REST Link μ£Όμμ ν΅ν©κ³Ό 보μμ μν API proxy
μμ μμ μμ λ€μν λ§μ΄ν¬λ‘μλΉμ€λ€μ΄ κ°μμ μ£Όμλ‘ linkκ° λ§λ€μ΄μ§κ² λλ€. μ΄λ μ¬λ¬λΆμ ν΄λΌμ΄μΈνΈ μ½λμμ μ§μ μ μΈ μ£Όμμ κΈ°μ
μ μ§μνκ³ link μμ μ£Όμ΄μ§ μ£Όμλ₯Ό ajax λ‘ νμνλλ‘ κ΅¬ννλ―λ‘μ νλ‘ νΈμλμ λ°±μλ κ°μ κ°μμ μ΅μν ν΄μ€λ€.
μ΄μ λ°λΌ μΌλ§λ μ§ μ£Όμ΄μ§ μ£Όμμ host κ° λ°λλλΌλ μΉλΈλΌμ°μ λ μμμ μ¬λ¬κ°μ λ°±μλ λ§μ΄ν¬λ‘μλΉμ€λ€μ μμμ λ°©λ¬Έν κ²μ΄λ€.
νμ§λ§, μ¬λ¬κ°μ λ°±μλλ₯Ό μΉλΈλΌμ°μ κ° μ μνλλ°λ λΉμ©μ΄ λ°λΌμ¨λ€. κ° λ°±μλμ Cross Resource Sharingμ νκΈ° μν΄μ λ°±μλ κ°μμ κ΄κ³λ₯Ό λ§Ίμ΄μΌ νλ€. λ¬Όλ‘ , μμ λ³κ°μ λ°±μλλ€μ ν΅ν©ν λλ νΌν μ μλ λΉμ©μ΄μ§λ§ νλμ ν΅ν©λ μλΉμ€λ΄μ μΈλΆ λ§μ΄ν¬λ‘ μλΉμ€ λ§λ€ λ°±μλ μ£Όμλ₯Ό λ€λ₯΄κ² κ΄λ¦¬νκΈ°λ μ΄λ ΅λ€. λν λ§μ΄ν¬λ‘μλΉμ€λ€μ μΈλΆ μΉλΈλΌμ°μ μμ€μμ μ§μ μ μΌλ‘ νΈμΆνκ² νλ κ²μ 보μμμΌλ‘ μνμ΄λ€.
μ΄λ¬ν λ¬Έμ λ₯Ό νλ²μ μ²λ¦¬νκΈ° μν΄μ API proxy λ₯Ό μ¬μ©νλ€.
- API Gateway Instance μ μμ± Order μλΉμ€μ Customer μλΉμ€λ₯Ό λ¬Άμ΄μ νλμ host μ£Όμμμ μ¬μ©ν μ μλλ‘ ν΄μ£Όλ μΈ‘λ©΄μμ API Gateway λ μΌμ’ μ Composite Service λΌ ν μ μλ€. OCE μμλ API Gateway λν μΌμ’ μ Spring Boot κΈ°λ° λ§μ΄ν¬λ‘ μλΉμ€λ‘ λ°λΌλ³Έλ€. λ°λΌμ API Gateway λ₯Ό μμ±νκ³ μ ν λλ κΈ°μ‘΄μ App μΆκ°νλ λ°©μκ³Ό λμΌνκ² Apps λ©λ΄μ App μΆκ° λ²νΌμ ν΄λ¦νκ³ Zuul API Gateway μ νμ μ νν΄μ£Όλ©΄ λλ€:
Zuul API μ μ€μ μμ λ€μ router μ€μ μ ν΄μ€λ€:
- μ±μ΄λ¦: e-shop-api
- μΈλΆ μ μ μ£Όμ(νλ‘λμ ): e-shop-api.pas-mini.io
μλΉμ€κ° μμ±λκ³ μλμΌλ‘ κΈ°λλλ λμ, λ°νμ λ° νκ²½ > Zuul νκ²½ μ€μ μμ λ€μμ μ€μ μ μ λ ₯νλ€:
zuul:
ignored-headers: Access-Control-Allow-Credentials, Access-Control-Allow-Origin
addProxyHeaders: true
routes:
order:
path: /orders/**
serviceId: order-service
stripPrefix: false
customer:
path: /customers/**
serviceId: customer-service
stripPrefix: false
μ΄ μ€μ μΌλ‘ Zuul server λ‘ λ€μ΄μ€λ orders/** μ΄νμ URI 리νμ€νΈλ order-service λ‘, customers/** μ΄νμ URI μμ²μ customer-service λ‘ ν¬μλνκ² λλ€.
μ€μ μ λ§μΉν, μ μ₯λ²νΌμ ν΄λ¦ν΄μ£Όκ³ , μλ¨μ μ ν리μΌμ΄μ μ¬κΈ°λ λ²νΌ (리νλμ λ²νΌ)μ ν΄λ¦νλ©΄ λ°μλλ€. [μ£Όμ] μ΄λ order-service μ customer-service λ μμ€μ½λλ₯Ό 컀λ°ν΄μ£Όμ΄ 미리 κ°λ°κΈ° μλ²μμ μλΉμ€κ° μ¬λΌμ μλλ‘ μλλ‘ ν΄μ€λ€.
- λ§μ΄ν¬λ‘ μλΉμ€λ€μ host μ£Όμ ν΅μΌ μ΄μ ν΄λΉ μλΉμ€λ‘ host μ£Όμκ° ν΅μΌλμμΌλ, μ΄λ₯Ό κΈ°λ°μΌλ‘ μ£Όλ¬Έ 리νμ€νΈλ₯Ό 보λ΄λ³΄μ:
http http://e-shop-api-dev.pas-min.io/customers firstName="jinyoung"
$ http http://e-shop-api-dev.pas-min.io/orders customer="http://e-shop-api-dev.pas-min.io/customers/1" qty=5
{
"_links": {
"customer": {
"href": "http://172.31.7.160:27223/customers/1"
},
"item": {
"href": "http://e-shop-api-dev.pas-mini.io/orders/3/item"
},
"order": {
"href": "http://e-shop-api-dev.pas-mini.io/orders/3"
},
"self": {
"href": "http://e-shop-api-dev.pas-mini.io/orders/3"
}
},
"customer": {
"firstName": null,
"lastName": null
},
"customerId": 1,
"qty": 5
}
λκ°μ κ°μ²΄κ° 릴리μ΄μ μΌλ‘ μ μ°κ²° λμλ€. κ·Έλ°λ° μ°κ²°λ μ£Όμλ₯Ό 보면 λ΄λΆ μ£Όμλ‘ μ°κ²°λμκΈ° λλ¬Έμ (λ§μ΄ν¬λ‘μλΉμ€κ°μ ν΅μ μμλ λ¬Έμ κ° λμ§ μμΌλ, μΈλΆ ν΄λΌμ΄μΈνΈ, νΉν νλ‘ νΈμλμμ μ°κ²°λ λλ μ κ·Όμ΄ λΆκ°νλ€) μ΄λ₯Ό λΌμ°ν° μ£ΌμμΈ "ttp://e-shop-api-dev.pas-mini.io/customers/1" λ‘ μ°κ²°λλ©΄ μ’κ² λ€.
μ΄ μμ μ μκ°λ³΄λ€ κ°λ¨νλ€. @RestAssociation μ΅μ κ° μ€ serviceId λ₯Ό "self"λ‘ μ£Όλ©΄ νΈμΆλ URI μ μ°κ²°νμ¬ λ€λ₯Έ λ§μ΄ν¬λ‘ μλΉμ€ μΌμ§λΌλ κ°μ host μ£Όμλ‘ link λ₯Ό λ§λ λ€:
@RestAssociation(serviceId = "self", path="/customers/{customerId}", joinColumn = "customerId")
μ΄λ κ² ν΄μ 컀λ°ν ν, λ³κ²½λ μλΉμ€λ‘ νΈμΆνλ©΄ λ€μκ³Ό κ°μ΄ λμΌν νΈμ€νΈλͺ μ μ μ§ν μ±λ‘ linkλ€μ΄ μμ±λκ³ μΈλΆμ μν ν΄λΌμ΄μΈνΈμμλ 리μμ€λ€μ νλμ νΈμ€νΈλ΄μμ νμκ°λ₯νλ€:
{
"_links": {
"customer": {
"href": "http://e-shop-api-dev.pas-mini.io/customers/1"
},
"item": {
"href": "http://e-shop-api-dev.pas-mini.io/orders/3/item"
},
"order": {
"href": "http://e-shop-api-dev.pas-mini.io/orders/3"
},
"self": {
"href": "http://e-shop-api-dev.pas-mini.io/orders/3"
}
},
"customer": {
"firstName": null,
"lastName": null
},
"customerId": 1,
"qty": 5
}