Spring Cloud ve Spring Boot kullanarak Mikro Servis Projesi Hazırlamak

Caner Kaya
5 min readMay 28, 2020

Bu makalede Spring ailesini kullanarak ve çok ayrıntıya girmeden bir mikro servis projesi hazırlayacağız. Başlamadan önce mikro servis nedir neden bu kadar yaygınlaşmaya başlamıştır kısaca ondan bahsetmek istiyorum. Daha ayrıntılı bilgi için microservices.io adresini ziyaret edebilirsiniz.

Mikro servis, bir yazılım geliştirme tekniğidir. Sadece belirli biri işten sorumlu, ölçeklenebilir, “loose-coupled” yapıya sahip servistir.

Faydalar:

  • Modüler: Geliştirilmesi, anlaması ve test edilmesi kolay.
  • Ölçeklendirilebilir: Birbirlerinden bağımsız süreçler olarak çalıştıklarından dolayı ölçeklendirirken daha özgür olabiliriz.
  • Kolay dağıtılabilir: Küçük ve hızlı projeler oldukları için deploy edilmesi de daha kolay.

Şimdi projemize geçelim. Projemiz aşağıdakiler bileşenleri içermektedir. Yeri geldikçe bileşenler hakkında biraz bilgi ve projedeki görevlerini anlatmaya çalışacağım.

  • Discovery Server (Spring Eureka)
  • Config Server (Spring Cloud Config)
  • API Gateway (Spring Cloud Netflix-Zuul)
  • Product Service
  • Shopping-Cart Service

Proje sonlandığı zaman elimizde böyle bir ekosistem olacak.

1. Discovery Server

Discovery Server için Spring Eureka projesini kullanacağız.

Discovery Server’ın amacı kendisine kayıt yapmış servislerin bilgisini tutmaktır. Bir mikro servis ekosistemde birden fazla servis ve bu servislerin birden fazla kopyası bulunabilir. Bu servislerin birbirleriyle bir noktada iletişim kurması gerekecektir. Ama bir servis başka bir servisin hangi ip ve portta çalıştığını bilemez. Discovery servis bu sorunu çözmektedir.

Çalışan her servis, Discovery Server’a kayıt olur. Ve böylelikle Discovery Server hangi servislerin ayakta olduğunu, onların ip ve port bilgileri gibi çeşitli veriyi kendinde saklar.

Spring initializr (start.spring.io) sayfasına girerek projemizi oluşturuyoruz.

Spring Initialzr

Projeyi oluşturduktan sonra bootstrap.properteis dosyasının içine bazı ayarlar eklememiz gerekiyor.

Daha sonra DiscoveryServerApplication.java içine girip. Class’ımıza @EnableEurekaServer annotation’ını eklememiz gerekiyor. Böylelikle projemizi bir Eureka Server haline getiriyoruz.

Sorunsuz bir şekilde çalıştırdıktan sonra http://localhost:5858 adresinden Discovery Server arayüzüne ulaşabiliriz.

Eureka Server UI

Buradaki “Instances currently registered with Eureka” bölümünün altında serverımıza kayıt olmuş servisleri görebiliriz.

Projemizdeki diğer servislerimizi yazmaya başladıktan sonra, burada ekranda servislerimizi göremeye başlayacağız.

2. Config Server

Spring initializr ile projemizi oluşturuyoruz.

Oluşturduktan sonra bootstrap.properties dosyasına ayarlarımızı gireceğiz.

spring.profiles.active: Config dosyalarının nasıl sunulacağını gösterir. Native diyerek configlerimizin local’de olduğunu söylüyoruz.

eureka.client.serviceUrl.defaultZone: Kayıt olacağımız Discovery Server’in adresi

ConfigServerApplication.java dosyamıza girip @EnableConfigServer ve @EnableEurekaClient anotasyonlarını ekliyoruz. Böylece Spring Cloud Config Server özelliğini açıyoruz ve Discovery Server’imize kayıt oluyoruz.

Daha sonra config dosyalarımız ekliyoruz. Resources klasörünün altına config isminde bir klasör açıyoruz ve config dosyalarımız ekliyoruz. İçerilerine şimdilik sadece Discovery Server’imizin adresini giriyoruz.

shopping-cart-service.yml:

product-service.yml:

api-gateway.yml:

Projemizi çalıştırıyoruz ve Daha sonra Dicovery Server’imizi kontrol ediyoruz.

Config Server’a istek atarak configlerimiz fetch edebiliriz. Formatın bu şekilde olması gerekir:

http://localhost:5859/{application-name}/{profile}/{label}

Biz default profili kullanacağız: Bu durum şöyle bir istek atarak configlerimize ulaşabiliriz:

3. API Gateway

Spring initializr ile projemizi oluşturuyoruz.

bootstrap.properties ayarlarını ekliyoruz.

spring.cloud.config.uri: Config dosyalarını çekeceğimiz Config Server’in adresi.

ApiGatewayApplication.java classımıza @EnableEurekaClient ve @EnableZuulProxy anotasyonlarımız ekliyoruz. Böylelikle projemiz birAPI gateway özelliği kazacanak ve yapılan istekleri Discovery Server’a kayıt yaptırmış servislere yönlendirebilecek.

Projemizi ayağa kaldırıyoruz.

Artık isteklerimizi API Gateway üzerinden yönlendireceğiz. Daha önce test amacıyla Config Server’a istek yollamıştık. Şimdi aynı isteği gateway üzerinden deneyelim.

4. Product Service

Spring initialzr ile projemizi oluşturuyoruz.

Config Server’daki product-service.yml dosyasına yeni configler ekliyoruz.

bootstrap.properties dosyamızı ekliyoruz.

ProductServiceApplication.java dosyamıza @EnableEurekaClient anotasyonunu ekliyoruz.

Product entity’mizi oluşturuyoruz.

Database bağlantısını repository ile yapacağız. Repository’mizi oluşturuyoruz.

Servisimizi oluşturuyoruz.

Controller’lerimizi de oluşturup micro servisimizi dışarıya açıyoruz.

Projeyi çalıştırıp Discovery Server’i kontrol edelim.

Şimdi api gateway üzerinden bir ürün oluşturmayı deneyelim.

Gördüğünüz gibi id’si 1 olan bir ürün oluşturduk. Bir sonraki aşamada bu ürünleri Shopping-Cart servisimiz ile oluşturacağımız sepetimize ekleyeceğiz.

5. Shopping-Cart Service

Spring initializr ile projemizi oluşturuyoruz.

Config Server’daki shopping-cart-service.yml dosyasına yeni configler ekliyoruz.

bootstrap.properties dosyamızı oluşturuyoruz.

ShoppingCartServiceApplication.java dosyamıza @EnableEurekaClient anotasyonunu ekliyoruz.

Entityler’imizi oluşturuyoruz. Product tablomuzu oluştururken ücret kısmını boş bırakacağız. Ücret bilgisine ihtiyacımız olduğu zaman id bilgisi ile product service’e soracağız.

Product.java

ShoppingCart.java

Repository’lerimizi oluşturuyoruz.

Servisimizi oluşturuyoruz.

Controller’emizi oluşturuyoruz.

Projeyi çalıştıralarım ve Discovery Server’i kontrol edelim.

Artık her şey hazır. Şimdi bir kaç ürün oluşturalım ve ürünü oluşturacağımız sepete ekleyelim. Daha sonra bu sepetin tutarını öğrenelim.

Ürünleri oluşturduk. Şimdi bir sepet oluşturalım.

Sepete ürünlerimizi ekleyelim.

Şimdi de sepetimizin tutarını öğrenelim.

Projemiz burada sonlanıyor. Zaman ayırıp yazımı okuduğunuz için teşekkür ederim. Projeyi geliştirirken performanslı ve best-practice bir kod yazmadığımı farketmişsiniz. Buradaki amacım basitçe bir mikro servis ekosistemi nasıl yaratılır onu göstermekti. Kodun tamamına buradan ulaşabilirsiniz. https://github.com/canerky96/microservice-ecosystem

Not: Yazım hataları varsa özür dilerim. :D

--

--