Ocelot – Docker Compose Konfigürasyonu

Ocelot API Gateway’in Docker Compose Konfigürasyonu Nasıl Yapılır?

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.

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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir