Estimated reading time: 11 minute(s)
Merhaba, bu yazıyı okuyorsanız Ocelot’un mikroservis mimarisi veya servis tabanlı projeler için kullanılan bir API gateway olduğunu biliyorsunuzdur.
Bu yazımda local’de sorunsuz çalışan projenizi, canlıya nasıl taşımanız gerektiğinden bahsedeceğim.
Gateway projenize ocelot’u dahil ettiğinizde, ocelot.json dosyasını eklemeniz gerekir. Aşağıda bir development birde production config dosyaları oluşturacağız.
Bir adet gateway ve iki adet api(a-service, b-service) üzerinden uygulamamızı yapacağız.
Gateway Api’mize yapılan “/api/sa/{everything}” route’una uygun tüm istekler A servisimizin “/api/{everything}” route’una yönlendirilecek
Gateway Api’mize yapılan “/api/sb/{everything}” route’una uygun tüm istekler B servisimizin “/api/{everything}” route’una yönlendirilecek
Eğer isterseniz endpoint’leri teker tekerde tanımlayabilirsiniz. Detaylı routing yönetimi için aşağıdan Ocelot dokümantasyonunu inceleyebilirsiniz.
this could be any transport mechanism).
Konfigürasyonumuzda iki servisi Routes’a dahil ediyoruz. Hatırlatmak gerekirse;
DownstreamPathTemplate: Hangi url’e yönlendireceğiz.
DownstreamScheme: Yönlendirilen url’in protokolü “http, https” nedir? DownstreamHostAndPorts: İstek yapılan host ve port bilgisi.
UpstreamPathTemplate: İstek yapılan url nedir? Host bilgisinden sonra gelen kısım.
UpstreamHttpMethod: Hangi methodlar bu route’umuza yönlenebilir?
GlobalConfiguration: BaseUrl bilgisi ile gateway’imizin hangi adreste yayınlandığını belirtiyoruz.
ocelot.development.json
{ "Routes": [ { "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9051 } ], "UpstreamPathTemplate": "/api/sa/{everything}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete", "Patch" ] }, { "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9052 } ], "UpstreamPathTemplate": "/api/sb/{everything}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete", "Patch" ] } ], "GlobalConfiguration": { "BaseUrl": "http://localhost:8050" } }
ocelot.production.json
{ "Routes": [ { "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "service-a-api", "Port": 80 } ], "UpstreamPathTemplate": "/api/sa/{everything}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete", "Patch" ] }, { "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "service-b-api", "Port": 80 } ], "UpstreamPathTemplate": "/api/sb/{everything}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete", "Patch" ] }, ], "GlobalConfiguration": { "BaseUrl": "http://localhost:8050" } }
docker-compose.yml
Environment bilgisinde “ServiceConfig__serviceName” bilgilerine dikkat ederseniz, ocelot.production dosyasında belirttiğimiz “DownstreamHostAndPorts:Host” bilgileriyle aynı tanımlıyoruz.
version: "3.4" services: api_gateway: image: gateway-api ports: - 8050:80 networks: - my_network - int_network environment: - ServiceConfig__serviceName=gateway-api service_a_api: container_name: service-a-api-registry image: service-a-api networks: - int_network environment: - ServiceConfig__serviceName=service-a-api service_b_api: container_name: service-b-api-registry image: service-b-api networks: - int_network environment: - ServiceConfig__serviceName=service-b-api networks: int_network: driver: overlay internal: true my_network: driver: bridge
Okuduğunuz için teşekkür ederim, umarım faydalı olmuştur.