Shopify Entegrasyon Süreçleri

Hakan Can İpek
Ebebek Tech
Published in
5 min readSep 8, 2021

Merhabalar,

Bu yazımda sizlere ebebek içerisinde, şirketin yurtdışı satışlarında kullanmak üzere kullanmak istediği e-ticaret platformu olan Shopify dan bahsedeceğim. Yazı içerisinde yer yer diagramlar, method, sınıf örnekleri ve uyguladığımız çözümler hakkında bilgilenmenizi umut ediyorum. İyi okumalar diliyorum ve her yazının geleneksel başlıklarından biri ile devam ediyorum.

Shopify Nedir?

Shopify kişiye online mağaza kurmakta ve ürünlerini satmakta yardımcı olan abonelik temelli bir yazılımdır. Kullanıcılarına Shopify POS aracılığı ile fiziksel olarak satış yapma imkanıda sunan Shopify, bu hizmetleri sunarken fiziksel ve online satışlar sırasındaki depo ve envanter miktarının senkron bir şekilde azalmasını/artmasını sağlamaktadır.

Shopify hakkında dikkat edilmesi önemli konulardan biri de Shopify’ın tekil bir ürün olmadığı, bir dükkan kurucu veya ürün satmak için kullanılan bir araçtan öte, Shopify’ın bir ticaret platformu olduğudur. Size hızlı bir şekilde hayalinizdeki işi kurmanıza yardımcı olmak ve müşterilerinize, nerede olduklarından bağımsız, satış yapmaya başlamanıza olanak sunar. Shopify App Store ve Shopify API yardımı ile özelleştirilmiş mağazalar oluşturmanızı sağlar.

Shopify hakkındaki bu kısa tanıtım ardından Shopify Entegrasyonu sırasında neler yaptığımızdan bahsetmeye başlayabiliriz.

Shopify Entegrasyonu, Nasıl?

Shopify’a entegre olmak isteyenler için Shopify 2 seçenek sunmaktadır.

  • REST Entegrasyonu
  • GraphQL Entegrasyonu

Bu iki entegrasyon seçeneği için Shopify kendi modüllerine ait API lar sunmaktadır. Yazılım ekibi olarak verilen kararda REST ile entegre olmaya karar verildi. Entegrasyon adımları şu şekilde olacaktı.

  1. Şirkete ait varlıkların REST ile mikroservise alınması,
  2. Bu varlıkların Shopify REST API ı tarafından kabul edilen formata uygun hale getirilmesi,
  3. Shopify’ın açtığı entegre noktaları kullanılarak bu varlıkların Shopify’a REST ile gönderilmesi,
  4. Shopify tarafında oluşturulan nesnelerin alınıp NoSQL veritabanında saklanması.

Entegrasyon şekli ve entegrasyon adımları belirlendikten sonra bu işlemleri ne yolla yapıp hangi teknolojilerden yararlanacağımıza karar verdik. Kullanılan teknolojiler şu şekildedir.

  • Java 16
  • Spring Boot 2
  • Couchbase
  • Apache Kafka
  • Docker
  • Consul
  • Portainer
  • Zipkin

Teknolojilerden bahsettiğimize göre mikro-servis yapısına geçelim.

Mikro-servis yapısı

Shopify modüllerinin her biri için mikro-servis yazılmıştır. Bazı modüller asenkron çalışacak şekilde dizayn edilmişken bazıları senkron çalışmaktadır. Senkron çalışan servisler tek bir proje modülünde toparlanırken asenkron servisler kendi içerisinde 3 farklı mikro-servisin bir araya gelmesinden oluşurlar. Servisleri bu 4 konsept üzerinden inceleyeceğiz.

Senkron Servisler — Single Module Syncron Services

Bu servisler adından anlaşılacağı üzere senkron çalışırlar. Bunun sebebi genel olarak bu servisler üzerinde çok bir yük olmayacağından ötürü asenkron çalışmaya ihtiyaç duymamalarından kaynaklanır. Şimdi senkron servis örneğini Discount Service e ait Create methodunun Sequence Diagramı üzerinden inceleyelim.

DiscountService Create metodu
  • Dış kaynaktan sorgu alınır,
  • DiscountController bu sorgu ile gelen objeyi DiscountFacade a iletir.
  • DiscountFacade yollanan sorguyu Shopify üzerinde yaratabilmek için ShopifyDiscountCodeService in createDiscountCode methoduna iletir.(Shopify Api üzerinde)
  • createDiscountCode üzerinden alınan cevap DiscountFacade a iletilir.
  • DiscountFacade gelen sorgu içerisindeki DiscountCode objesini veritabanına CRUD işlemi yapmakla sorumlu DiscountCoreFacade a iletir.
  • Burada veritabanına basılacak obje, Shopify dan gelen DiscountCode kullanılarak oluşturulur.
  • CrudRepository üzerinden oluşturulan obje Couchbase veritabanına basılır.
  • Basılan obje DiscountFacade a geri dönülür.
  • Bu obje cevap olarak dış kaynağa gönderilir.

Senkron servislerin akış üzerinden göreceğiniz üzere yaptıkları iş, sorguyu alıp Shopify üzerinde üretmek ve bu üretilen objenin Couchbase veritabanı üzerine kayıt etme güncelleme görevlerinden sorumludur.

Asenkron Servisler — Multi Module Asyncron Services

Asenkron servisler temel olarak 3 mikro-servisin birleşmesinden oluşur. Bu servisler;

  1. Producer Service
  2. Consumer Service
  3. Database Operations Service

Asenkron Servisler — Producer Service

Producer servislerin görevi dış kaynaktan alınacak sorguyu alır, gerekli validasyonları yaparak Shopify da üretilmeye uygunluğunu onaylar, işlem kaydını yapar, Kafka ile ilgili topic e JSON objesini basar ve dış kaynağa işlemin başarılı bir şekilde tamamlandığını iletir. Product Producer Service in Create method akışı üzerinden bakalım.

ProductProducerService Create metodu
  • ProductController dış kaynaktan sorguyu alır
  • Alınan objeyi ProductFacade a iletir
  • ProductFacade bu sorgunun içeriğini validasyondan geçirir. Eksik veya hatalı bir giriş varsa hata fırlatır.
  • Validasyondan geçen objeyi ProductService in createUpdateOperations methoduna yollar.
  • Sorgunun işlem kaydı yapılır ve kafka ile bildirim işlemini yapacak handleProductOperations methoduna iletir. Burada kafka üzerinde produce işlemi yapılır.
  • Başarılı bildirim sonrası işlem kaydının statusu işlendi yapılır ve Product Producer Service in görevi tamamlanır.

Asenkron Servisler — Consumer Service

Consumer Servisler, Producer Servisler tarafından Kafka topiclerinde yayınlanan mesajları dinleyip bunları Shopify üzerinde üretmek ve üretilen objelerin Kafka ile Database Operation Servislerinin dinlediği topiclerde yayınlamakla görevli servislerdir. Bu servislerin adı Consumer olarak geçse de aynı zamanda Producer görevi de yaparlar. Bu görevleri akış üzerinden görelim.

ProductConsumerService notify metodu

SapProductKafkaListenerService üzerindeki listenForCreateProductSuccess methodu ile ilgili Topici dinlemektedir. Topice mesaj düştüğünde bu mesajı çekerek, ProductNotifyService e yollar. ProductNotifyService gelen bu mesajın işlem kaydını hazırlar. Ardından ilgili objeyi Shopify üzerinde oluşturur. Burada belirtmek gerekir ki bu Asenkron bir işlem olduğu için herhangi bir hatayı dış kaynak bilemeyecektir. Bu sebepten bu işlemlerin Shopify bazlı bir sorun olmadığı sürece başarılı olması gerekmektedir. Producer Servisten yapılan validasyonların meyvesi burada alınır, çünkü oradaki validasyon sonucu herhangi yanlış isteği dış kaynağa bildirerek, doğru sorgu atmaları sağlanıyor. Bu sayede, hatalı sorgularla uğraşma yükünü servislerin üzerinden atıp büyük oranda dış kaynağın bunu yapması sağlanıyor. Shopify tarafından oluşturulan obje kafka ile produce edilerek veritabanı servis listenerlarının dinlemesi gereken topice atılır.

Generic notify metodu
Shopify üzerinde create işlemi yapan generic metod

Asenkron Servisler — Database Operations Service

Asenkron akışın son servisine geldik. Dinlediği kafka topiclere mesaj düştükçe işlem yapmaktadır. Consumer Servis tarafından produce edilen mesajlar bu servisin topicleri dinleyen methodları tarafından alınıp veritabanına basılır. Akışına bakalım.

Shopify Kafka topiclerini dinleyen listenForShopifyCreate metodu
Database üzerindeki create işlemlerinden sorumlu createShopifyFields metodu

Mesaj topicten alındıktan sonra ProductFacade üzerindeki createShopifyFields methodu çağrılır. Burada bu objenin kaydı yapılmış mı diye bakılır, yapılmadı ise Create edilecek Product Document üretilir ve Couchbase e upsert edilir.

createShopifyFields metodunun Java kodları

Bu servisle beraber mikro-servislerin görevlerini ve nasıl çalıştıklarına dair kısmı bitirmiş oluyoruz.

Evet dostlar, Shopify Entegrasyonu sırasında kullanmış olduğumuz mikroservislerden bahsettik. Gelecek yazımda ise Shopify üzerindeki operasyonları yaptığımız Shopify Shared Library yada projedeki adı ile Shopify Api den bahsedeceğim. Tekrar görüşene dek, hoşçakalın.

--

--

Hakan Can İpek
Ebebek Tech

There are endless possibilities and creativity has no limits. So do I. My goal is try to be better and knowing there will be always more I can achieve.