1. Giriş
Neden monolitik uygulamadan mikro hizmet mimarisine geçiş yapmalısınız? Uygulamaları mikro hizmetlere ayırmanın sunduğu avantajlar aşağıda verilmiştir ve bunların çoğu, mikro hizmetlerin serbest bağlantılı olmasından kaynaklıdır.
- Mikro hizmetler bağımsız olarak test edilebilir ve dağıtılabilir. Dağıtım birimi ne kadar küçükse dağıtım o kadar kolay olur.
- Farklı dillerde ve çerçevelerde uygulanabilir. Her bir mikro hizmetin kendine özgü kullanım alanı için en iyi teknolojiyi seçebilirsiniz.
- Farklı ekipler tarafından yönetilebilir. Mikro hizmetler arasındaki sınır, bir veya birkaç mikro hizmete özel ekip atanmasını kolaylaştırır.
- Mikro hizmetlere geçiş yaparak ekiplerin birbirine olan bağımlılığını azaltabilirsiniz. Her ekip yalnızca bağımlı olduğu mikro hizmetlerin API'leriyle ilgilenir. Böylece bu mikro hizmetlerin uygulanma şekli, sürüm döngüleri vb. ile uğraşmasına gerek kalmaz.
- Arıza durumu için daha kolay planlama yapmanıza olanak tanır. Hizmetler arasında net sınırlar çizildiğinde bir hizmetin çökmesi durumunda ne yapacağınızı belirlemek kolaylaşır.
Monolitlere kıyasla bazı dezavantajlar ise şunlardır:
- Mikro hizmet tabanlı uygulamalar, çoğu zaman kolaylıkla ayırt edilemeyecek şekilde birbiriyle etkileşime geçen farklı hizmetler arasında bir ağ oluşturduğu için sistemin genel karmaşıklığı da artar.
- Monolitin dahili işleyişinin aksine mikro hizmetler bir ağ üzerinden iletişim kurar. Bazı durumlarda bu bir güvenlik endişesi oluşturabilir. Istio, mikro hizmetler arasındaki trafiği otomatik olarak şifreleyerek bu sorunu çözer.
- Hizmetler arasındaki gecikmeler nedeniyle monolitik yaklaşımla aynı performans düzeyine ulaşmak zor olabilir.
- Sisteminizin davranışı tek bir hizmetten değil, pek çok hizmetten ve bunların arasındaki etkileşimlerden kaynaklanır. Bu nedenle sisteminizin üretimde nasıl davrandığını anlamak (yani sisteminizin gözlemlenebilirliği) daha zordur. Istio bu soruna da çözüm getirir.
Bu laboratuvarda, mikro hizmetleri Google Kubernetes Engine'de (GKE) çalıştıracağız. Kubernetes, container'ları yönetme, barındırma, ölçeklendirme ve dağıtma amaçlı bir platformdur. Container'lar ise kodu taşınabilir bir şekilde paketleme ve çalıştırma yoludur. Her mikro hizmetin kendi container'ını çalıştırabildiği mikro hizmet kalıbına uygundur.
Bu laboratuvarda, Google Kubernetes Engine kümesine mevcut bir monolitik uygulamayı dağıtacak ve daha sonra mikro hizmetlere ayıracağız.
Mikro Hizmetlerin Mimari Şeması
Bu işlem için monolitimizi tek seferde bir tane olacak şekilde üç mikro hizmete ayırarak başlayacağız. Mikro hizmetler şunlardır: Siparişler, Ürünler ve Ön Uç. Cloud Shell'den tetiklediğimiz Cloud Build'i kullanarak her mikro hizmet için bir Docker görüntüsü oluştururuz. Ardından, mikro hizmetlerimizi LoadBalancer türü bir Kubernetes hizmetiyle Google Kubernetes Engine'de (GKE) dağıtıp erişime açacağız. Hizmetleri yeniden düzenleyerek monolitimizden çıkarırken bu işlemi her hizmet için tekrarlayacağız. İşlem sırasında, monolitimizi silebileceğimiz en son aşamaya gelene kadar hem monolitimizi hem de mikro hizmetlerimizi çalıştırmaya devam edeceğiz.

Neler öğreneceksiniz?
- Monoliti mikro hizmetlere ayırma
- Google Kubernetes Engine kümesi oluşturma
- Docker görüntüsü oluşturma
- Docker görüntülerini Kubernetes'e dağıtma
Ön koşullar
- Proje oluşturmak için yönetim erişimine sahip bir Google Cloud Platform hesabı veya Proje Sahibi rolüne sahip olduğunuz bir proje
- Docker ve Kubernetes'e dair genel bilgi
2. Ortam Kurulumu
Yönlendirmesiz ortam kurulumu
Google Hesabınız (Gmail veya Google Apps) yoksa hesap oluşturmanız gerekir. Google Cloud Platform Console'da ( console.cloud.google.com) oturum açın ve yeni bir proje oluşturun:


Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.
Ardından, Google Cloud kaynaklarını kullanmak için Developers Console'da faturalandırmayı etkinleştirmeniz ve Container Engine API'yi etkinleştirmeniz gerekir.
Bu codelab'i tamamlamak size birkaç dolardan fazla maliyet getirmemelidir. Ancak daha fazla kaynak kullanmaya veya kaynakları çalışır durumda bırakmaya karar verirseniz maliyet artabilir (bu belgenin sonundaki "temizleme" bölümüne bakın). Google Kubernetes Engine fiyatlandırması burada belgelenmiştir.
Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme sürümünden yararlanabilir.
Google Cloud Shell
Google Cloud ve Kubernetes, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu codelab'de bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.
Bu Debian tabanlı sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu nedenle, bu codelab için ihtiyacınız olan tek şey bir tarayıcıdır (Chromebook'ta da çalışır).
- Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir 'i
tıklamanız yeterlidir (ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer).
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, PROJECT_ID'nize ayarlandığını görürsünüz.
gcloud auth list
Komut çıkışı
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Herhangi bir nedenle proje ayarlanmamışsa şu komutu verin:
gcloud config set project <PROJECT_ID>
PROJECT_ID cihazınızı mı arıyorsunuz? Kurulum adımlarında hangi kimliği kullandığınızı kontrol edin veya Cloud Console kontrol panelinde arayın:
Cloud Shell, gelecekteki komutları çalıştırırken faydalı olabilecek bazı ortam değişkenlerini de varsayılan olarak ayarlar.
echo $GOOGLE_CLOUD_PROJECT
Komut çıkışı
<PROJECT_ID>
- Son olarak, varsayılan alt bölgeyi ve proje yapılandırmasını ayarlayın.
gcloud config set compute/zone us-central1-f
Çeşitli bölgeler arasından seçim yapabilirsiniz. Daha fazla bilgi için Bölgeler ve Alt Bölgeler başlıklı makaleyi inceleyin.
3. Kaynak Deposunu Klonlama
Basit bir karşılama sayfası, ürünler sayfası ve sipariş geçmişi sayfası olan hayali bir e-ticaret web sitesinin mevcut monolitik uygulamasını kullanıyoruz. Kaynağı Git depomuzdan klonladıktan sonra yalnızca mikro hizmetlere ayırmaya ve Google Kubernetes Engine'e (GKE) dağıtmaya odaklanabileceğiz.
Git deposunu Cloud Shell örneğinize klonlamak için aşağıdaki komutları çalıştırın ve uygun dizin değişikliğini yapın. Dağıtım öncesinde monolitimizi test edebilmemiz için NodeJS bağımlılarını da yükleyeceğiz. Bu komut dosyasının çalışması birkaç dakika sürebilir.
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices ./setup.sh
Bu işlem, GitHub depomuzu klonlar, dizine geçer ve uygulamamızı yerel olarak çalıştırmak için gereken bağımlılıkları yükler. Bu komut dosyasının çalışması birkaç dakika sürebilir.
4. GKE Kümesi oluşturma
Geliştirme ortamınız çalışır durumda olduğuna göre şimdi, monolitimizi ve son olarak mikro hizmetlerimizi dağıtacağımız bir Kubernetes kümesine ihtiyacımız var. Küme oluşturabilmemiz için önce gerekli API'lerin etkin olduğundan emin olmamız gerekir. Google Kubernetes Engine'i kullanabilmek için Containers API'yi etkinleştirmek üzere aşağıdaki komutu çalıştırın:
gcloud services enable container.googleapis.com
Artık kümemizi oluşturmaya hazırız. fancy-cluster adlı ve 3 düğüme sahip bir GKE kümesi oluşturmak için aşağıdaki komutu çalıştırın.
gcloud container clusters create fancy-cluster --num-nodes 3
Kümenin oluşturulması birkaç dakika sürebilir. Bu komut tamamlandıktan sonra, kümenin üç çalışan sanal makine örneğini görmek için aşağıdaki komutu çalıştırın:
gcloud compute instances list
Çıkış:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS gke-fancy-cluster-default-pool-ad92506d-1ng3 us-east4-a n1-standard-1 10.150.0.7 XX.XX.XX.XX RUNNING gke-fancy-cluster-default-pool-ad92506d-4fvq us-east4-a n1-standard-1 10.150.0.5 XX.XX.XX.XX RUNNING gke-fancy-cluster-default-pool-ad92506d-4zs3 us-east4-a n1-standard-1 10.150.0.6 XX.XX.XX.XX RUNNING
Kubernetes kümenizi ve ilgili bilgileri Google Cloud Console'da da görüntüleyebilirsiniz. Sol üstteki menü düğmesini tıklayın, Kubernetes Engine'e gidin ve Kümeler'i tıklayın. fancy-cluster adlı kümenizi göreceksiniz.


Tebrikler! İlk Kubernetes kümenizi oluşturdunuz.
5. Mevcut Monoliti Dağıtma
Bu laboratuvarın odak noktası monoliti mikro hizmetlere ayırma sürecini adım adım incelemek olduğundan öncelikle bir monolitik uygulamayı çalışır duruma getirmeniz gerekir. Bu laboratuvar kapsamında GKE kümemize bir monolitik uygulama dağıtmak için aşağıdaki komut dosyasını çalıştırın:
cd ~/monolith-to-microservices ./deploy-monolith.sh
Monolite erişme
Monolitik uygulamamızın harici IP adresini bulmak için aşağıdaki komutu çalıştırın.
kubectl get service monolith
Şuna benzer bir çıkış alırsınız:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE monolith 10.3.251.122 203.0.113.0 80:30877/TCP 3d
NOT: Bu işlem için harici bir yük dengeleyici ve IP sağlanması gerekir. Bu nedenle, işlemin tamamlanması biraz zaman alacaktır. Çıkışınızda harici IP olarak listeleniyorsa kısa bir süre bekleyin ve komutu yeniden çalıştırın.
<pending> Birkaç dakika bekleyip tekrar deneyin.
Monolitinizin harici IP adresini belirledikten sonra kopyalayın. Monolitinizin erişilebilir durumda olup olmadığını kontrol etmek için tarayıcınızı bu URL'ye (örneğin http://203.0.113.0) yönlendirin.

Tıpkı yukarıdaki resimde olduğu gibi bir monolitik web sitesi karşılama sayfası göreceksiniz. Karşılama sayfası, daha sonra Ön Uç mikro hizmeti tarafından sunulacak olan statik bir sayfadır. Artık monolitiniz tümüyle Kubernetes üzerinde çalışıyor.
6. Siparişleri mikro hizmete taşıma
Mevcut monolitik web sitemiz GKE'de çalıştığına göre artık her hizmeti mikro hizmetlere ayırmaya başlayabiliriz. Genellikle, hangi hizmetlerin daha küçük parçalara ayrılacağı konusunda planlama yapılması gerekir. Bu planlama çoğu zaman uygulamanın iş alanı gibi belirli kısımları etrafında yapılır. Gösterim amacıyla basit bir örnek oluşturduk ve her hizmeti iş alanına göre ayırdık: Siparişler, Ürünler ve Ön Uç. Kod önceden taşındı. Hizmetleri Google Kubernetes Engine'de (GKE) derleyip dağıtmaya odaklanacağız.
Yeni Siparişler Mikro Hizmeti Oluşturma
Ayrılacak ilk hizmet Siparişler hizmetidir. Sağlanan bağımsız kod tabanından faydalanarak bu hizmet için ayrı bir Docker container'ı oluşturacağız.
Google Cloud Build ile Docker container'ı oluşturma
Kod tabanını sizin için zaten taşıdığımızdan, ilk adımımız Google Cloud Build'i kullanarak Sipariş hizmetimizin Docker kapsayıcısını oluşturmak olacak.
Normalde bu süreç iki adımda tamamlanır: Bir Docker container'ı derlenir ve görüntünün, GKE'nin çekebileceği şekilde depolanması için bu container bir kayıt defterine aktarılır. Ancak işimizi kolaylaştırabiliriz. Docker container'ı oluşturmak ve görüntüyü tek bir komutla Google Cloud Container Registry'ye yerleştirmek için Google Cloud Build'i kullanabiliriz. Böylece tek bir komut vererek görüntümüzü derleyebilir ve Container Registry'ye taşıyabiliriz. Docker dosyasını oluşturup push etmeyi sağlayan manuel işlemi buradan görüntüleyebilirsiniz.
Google Cloud Build, dizindeki dosyaları sıkıştırır ve bir Google Cloud Storage paketine taşır. Ardından, derleme işlemi sırasında paketteki tüm dosyalar alınır ve Dockerfile üzerinden Docker derleme işlemi çalıştırılır. Docker görüntüsü için ana makineyi gcr.io olarak ayarladığınız ve --tag işaretini belirttiğinizden, elde edilen Docker görüntüsü Google Cloud Container Registry'ye aktarılır.
Docker container'ınızı derlemek ve Google Container Registry'ye aktarmak için aşağıdaki komutları kullanın:
cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .
Bu işlem birkaç dakika sürer ve tamamlandıktan sonra terminalde aşağıdakine benzer bir çıkış alınır:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 1ae295d9-63cb-482c-959b-bc52e9644d53 2019-08-29T01:56:35+00:00 33S gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz gcr.io/<PROJECT_ID>/orders:1.0.0 SUCCESS
Derleme geçmişinizi görüntülemek veya işlemi gerçek zamanlı olarak izlemek için Google Cloud Console'a gidebilirsiniz. Sol üstteki menü düğmesini tıklayın ve Araçlar → Cloud Build'e gidip Geçmiş'i tıklayın. Burada, önceki tüm derlemelerinizin listesini görebilirsiniz. Şimdilik yalnızca az önce oluşturduğunuz derleme vardır.

Derleme kimliğini tıklarsanız derlemenin günlük çıkışı da dahil olmak üzere tüm ayrıntılarını görebilirsiniz.
Derleme ayrıntıları sayfasındaki derleme bilgileri bölümünde, oluşturulan container görüntüsünü görüntülemek için görüntü adını tıklayın.

Container'ı GKE'ye dağıtma
Web sitemizi container mimarisine aldığımıza ve container'ımızı Google Container Registry'ye aktardığımıza göre sıra Kubernetes'e dağıtım yapmaya geldi.
Kubernetes'te uygulamalar kapsüller olarak temsil edilir. Kapsüller, bir container'ı (veya birbirlerine sıkı sıkıya bağlı bir grup container'ı) temsil eden birimlerdir. Kapsül, Kubernetes'teki en küçük dağıtılabilir birimdir. Bu eğiticideki her kapsülde yalnızca mikro hizmetler container'ınız yer almaktadır.
Uygulamaları bir GKE kümesinde dağıtıp yönetmek için Kubernetes küme yönetimi sistemiyle iletişim kurmanız gerekir. Bunun için genellikle Cloud Shell içinden kubectl komut satırı aracı kullanılır.
İlk olarak bir Deployment kaynağı oluşturacağız. Dağıtım, uygulamanızın replika adı verilen birden fazla kopyasını yönetir ve bu kopyaların her birinin kümenizdeki ayrı birer düğümde çalıştırılmasını planlar. Bu laboratuvarda, Dağıtım tarafından uygulamanızın yalnızca bir kapsülü çalıştırılacaktır. Dağıtımlar bu iş için bir ReplicaSet oluşturur. ReplicaSet, belirtilen sayıda replikanın her zaman çalışmasını sağlamaktan sorumludur.
Aşağıdaki kubectl create deployment komutu, Kubernetes'in kümenizde 1 replikaya sahip orders (siparişler) adlı bir Dağıtım oluşturmasını sağlar.
Uygulamanızı dağıtmak için aşağıdaki komutu çalıştırın:
kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0
Dağıtımı doğrulama
Dağıtımın başarıyla oluşturulduğunu doğrulamak için aşağıdaki komutu çalıştırın. Kapsül durumunun Çalışıyor olması birkaç dakika sürebilir:
kubectl get all
Çıkış:
NAME READY STATUS RESTARTS AGE pod/monolith-779c8d95f5-dxnzl 1/1 Running 0 15h pod/orders-5bc6969d76-kdxkk 1/1 Running 0 21s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.39.240.1 <none> 443/TCP 19d service/monolith LoadBalancer 10.39.241.130 34.74.209.57 80:30412/TCP 15h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/monolith 1/1 1 1 15h deployment.apps/orders 1/1 1 1 21s NAME DESIRED CURRENT READY AGE replicaset.apps/monolith-779c8d95f5 1 1 1 15h replicaset.apps/orders-5bc6969d76 1 1 1 21s
Bu çıkışta birkaç şey gösterilir. Geçerli dağıtımımızı, istenen kapsül sayısı 1 olan ReplicaSet'imizi ve çalışmakta olan kapsülümüzü görebiliriz. Bu durumda tüm öğeler başarıyla oluşturulmuş demektir.
GKE container'ını kullanıma sunun:
Uygulamamızı GKE'de dağıttık ancak buna küme dışından erişmemiz mümkün değil. Varsayılan olarak, GKE'de çalıştırılan container'ların harici bir IP adresi bulunmadığından bu container'lara internet üzerinden erişilemez. İnternet trafiği alabilmesi için uygulamanızı bir Hizmet kaynağı üzerinden açıkça erişime açmanız gerekir. Hizmetler, uygulamanızın Kapsüllerine ağ ve IP desteği sağlar. GKE, uygulamanız için harici bir IP adresi ve bir Yük Dengeleyici (faturalandırmaya tabidir) oluşturur.
Siparişler hizmetimizi dağıttığımızda bir Kubernetes dağıtımı aracılığıyla bağlantı noktası 8081'de dahili olarak kullanıma sunduk. Bu hizmeti harici olarak erişime açmak için trafiği harici bağlantı noktası 80'den Siparişler hizmetinin dahili bağlantı noktası 8081'e yönlendirmek üzere LoadBalancer türünde bir Kubernetes hizmeti oluşturmamız gerekir. Web sitenizi internet üzerinden kullanıma sunmak için aşağıdaki komutu çalıştırın:
kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081
Hizmete Erişim
GKE, harici IP adresini Dağıtım'a değil Hizmet kaynağına atar. GKE tarafından uygulamanıza sağlanan harici IP adresini öğrenmek istiyorsanız hizmeti incelemek için kubectl get service komutunu kullanabilirsiniz:
kubectl get service orders
Çıkış:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE orders 10.3.251.122 203.0.113.0 80:30877/TCP 3d
Uygulamanızın harici IP adresini belirledikten sonra kopyalayın. Monolitimizi yeni Siparişler hizmetimize işaret edecek şekilde değiştireceğimiz sonraki adım için bu adresi saklayın.
Monoliti yeniden yapılandırma
Siparişler hizmetini monolitten kaldırdığımız için artık monoliti yeni harici Siparişler mikro hizmetine işaret edecek şekilde değiştirmemiz gerekir.
Monolitleri ayırırken tek bir kod tabanındaki kod parçalarını birden çok yere böler ve ayrı ayrı dağıtırız. Mikro hizmet ayrı bir sunucuda çalıştığından artık hizmet URL'lerimizi mutlak yollar olarak referans veremeyiz. Siparişler mikro hizmetimizin yeni sunucu adresine yönlendirme yapmamız gerekir. Bunun için monolit hizmetin bir süre kapalı kalması ve ayrılan her bir hizmetin URL'sini güncellemesi gerekir. Mikro hizmetleri taşıma sürecinde mikro hizmetlerinizi ve monolitinizi üretime taşımayı planlarken bunu göz önünde bulundurmalısınız.
Monolitteki yapılandırma dosyamızı, yeni Siparişler mikro hizmetinin IP adresine işaret edeceği şekilde güncellememiz gerekir. Yerel URL'yi yeni Siparişler mikro hizmetimizin IP adresiyle değiştirmek için nano düzenleyiciyi kullanın. Dosyayı düzenlemek için aşağıdaki komutu çalıştırın:
cd ~/monolith-to-microservices/react-app nano .env.monolith
Düzenleyici açıldığında dosyanız şu şekilde görünmelidir:
REACT_APP_ORDERS_URL=/service/orders REACT_APP_PRODUCTS_URL=/service/products
REACT_APP_ORDERS_URL kısmını yeni biçimle değiştirin ve Siparişler mikro hizmetinizin IP adresini aşağıdakiyle eşleşecek şekilde değiştirin:
REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders REACT_APP_PRODUCTS_URL=/service/products
Dosyayı nano düzenleyicide kaydetmek için CTRL+O, ENTER ve ardından CTRL+X tuşlarına basın.
Bu dosyada ayarladığınız URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Siparişler mikro hizmetimizden bir JSON yanıtı döndürmelidir.
Ardından, monolit ön ucumuzu yeniden oluşturmamız, monolit için kapsayıcıyı oluşturmak üzere derleme işlemini tekrarlamamız ve GKE kümemize yeniden dağıtım yapmamız gerekir. Bu adımları tamamlamak için aşağıdaki komutları çalıştırın:
Monolit Yapılandırma Dosyalarını Yeniden Derleme
npm run build:monolith
Google Cloud Build ile Docker container'ı oluşturma
cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .
Container'ı GKE'ye dağıtma
kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0
Tarayıcınızda monolitik uygulamaya gidip Siparişler sayfasına bakarak uygulamanızın yeni Siparişler mikro hizmetine işaret ettiğini doğrulayabilirsiniz. Tüm sipariş kimlikleri, aşağıda gösterildiği gibi -MICROSERVICE son ekiyle bitmelidir:

7. Ürünleri Mikro Hizmete taşıma
Yeni Ürünler Mikro Hizmeti Oluşturma
Şimdi hizmetleri ayırmaya devam ederek Ürünler hizmetini taşıyabiliriz. Önceki adımla aynı süreci izleyeceğiz. Docker container'ı derlemek, container'ınızı dağıtmak ve Kubernetes hizmeti aracılığıyla kullanıma sunmak için aşağıdaki komutları çalıştırın.
Google Cloud Build ile Docker container'ı oluşturma
cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .
Container'ı GKE'ye dağıtma
kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0
GKE container'ını kullanıma sunun:
kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082
Aşağıdaki komutu kullanarak Siparişler hizmetimiz için yaptığımız şekilde Ürünler hizmetimizin herkese açık IP'sini bulun:
kubectl get service products
Çıkış:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE products 10.3.251.122 203.0.113.0 80:30877/TCP 3d
Monolitimizi yeni Ürünler mikro hizmetimize işaret edecek şekilde yeniden yapılandıracağımız bir sonraki adım için IP adresini kaydedin.
Monoliti yeniden yapılandırma
Yerel URL'yi yeni Ürünler mikro hizmetlerimizin IP adresiyle değiştirmek için nano düzenleyiciyi kullanın:
cd ~/monolith-to-microservices/react-app nano .env.monolith
Düzenleyici açıldığında dosyanız şu şekilde görünmelidir:
REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders REACT_APP_PRODUCTS_URL=/service/products
REACT_APP_PRODUCTS_URL kısmını yeni biçimle değiştirin ve Ürünler mikro hizmetinizin IP adresini aşağıdakiyle eşleşecek şekilde değiştirin:
REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products
Dosyayı nano düzenleyicide kaydetmek için CTRL+O, ENTER ve ardından CTRL+X tuşlarına basın.
Bu dosyada ayarladığınız URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Ürünler mikro hizmetimizden bir JSON yanıtı döndürmelidir.
Ardından, monolit ön ucumuzu yeniden oluşturmamız, monolit için kapsayıcıyı oluşturmak üzere derleme işlemini tekrarlamamız ve GKE kümemize yeniden dağıtım yapmamız gerekir. Bu adımları tamamlamak için aşağıdaki komutları çalıştırın:
Monolit Yapılandırma Dosyalarını Yeniden Derleme
npm run build:monolith
Google Cloud Build ile Docker container'ı oluşturma
cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .
Container'ı GKE'ye dağıtma
kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0
Tarayıcınızda monolitik uygulamaya gidip Ürünler sayfasına bakarak uygulamanızın yeni Ürünler mikro hizmetine işaret ettiğini doğrulayabilirsiniz. Tüm ürün adları, aşağıda gösterildiği gibi MS- ön ekiyle başlamalıdır:

8. Ön ucu mikro hizmete taşıma
Taşıma sürecinin son adımı, Ön Uç kodunu bir mikro hizmete taşımak ve monoliti kapatmaktır. Bu adım tamamlandıktan sonra monolitimizi mikro hizmet mimarisine başarıyla taşımış olacağız.
Yeni Ön Uç Mikro Hizmeti Oluşturma
Yeni bir ön uç mikro hizmeti oluşturmak için son iki adımdaki prosedürü uygulayalım.
Daha önce monolitimizi yeniden oluşturduğumuzda yapılandırmamızı monolitimize işaret edecek şekilde güncelliyorduk ancak artık ön uç mikro hizmetimiz için aynı yapılandırmayı kullanmamız gerekiyor. Mikro hizmetler URL'sinin yapılandırma dosyalarını ön uç mikro hizmet kod tabanına kopyalamak için aşağıdaki komutları çalıştırın:
cd ~/monolith-to-microservices/react-app cp .env.monolith .env npm run build
Bu işlem tamamlandıktan sonra, önceki adımlarla aynı süreci izleriz. Docker container'ı derlemek, container'ınızı dağıtmak ve Kubernetes hizmeti aracılığıyla kullanıma sunmak için aşağıdaki komutları çalıştırın.
Google Cloud Build ile Docker container'ı oluşturma
cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .
Container'ı GKE'ye dağıtma
kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0
GKE container'ını kullanıma sunun:
kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080
Monoliti Silme
Tüm hizmetlerimiz mikro hizmet olarak çalıştığına göre artık monolitik uygulamamızı silebiliriz. Gerçek bir taşıma işleminde bu adımı gerçekleştirirken mevcut alan adlarımızın uygulamamızdaki yeni ön uç mikro hizmetlere işaret etmesini sağlamak için DNS değişiklikleri vb. gerekeceğini unutmayın. Monolitimizi silmek için aşağıdaki komutları çalıştırın:
kubectl delete deployment monolith kubectl delete service monolith
Çalışmanızı Test Etme
Her şeyin çalıştığını doğrulayın: Monolit hizmetinize ait eski IP adresiniz artık çalışmıyor olmalı ve ön uç hizmetinize ait yeni IP adresiniz yeni uygulamayı barındırıyor olmalıdır. Tüm hizmetlerin ve IP adreslerinin listesini görmek için aşağıdaki komutu kullanın:
kubectl get services
Şuna benzer bir çıkış alırsınız:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend LoadBalancer 10.39.246.135 35.227.21.154 80:32663/TCP 12m kubernetes ClusterIP 10.39.240.1 <none> 443/TCP 18d orders LoadBalancer 10.39.243.42 35.243.173.255 80:32714/TCP 31m products LoadBalancer 10.39.250.16 35.243.180.23 80:32335/TCP 21m
Ön uç mikro hizmetinizin harici IP adresini belirledikten sonra kopyalayın. Ön ucunuzun erişilebilir durumda olup olmadığını kontrol etmek için tarayıcınızı bu URL'ye (örneğin http://203.0.113.0) yönlendirin. Web siteniz, monoliti mikro hizmetlere ayırmadan önce nasılsa yine o şekilde görünmelidir.
9. Temizleme
Hazır olduğunuzda, gerçekleştirilen tüm etkinlikleri temizlemenin en kolay yolu projeyi silmektir. Projenin silinmesi, beklenmedik yinelenen ücretlerin oluşmaması için bu Codelab'de oluşturulan tüm kaynakları siler. Cloud Shell'de aşağıdakileri çalıştırın. Burada PROJECT_ID, yalnızca proje adı değil, tam proje kimliğidir.
gcloud projects delete [PROJECT_ID]
İstendiğinde "Y" girerek silme işlemini onaylayın.
10. Tebrikler!
Monolitik uygulamanızı Google Kubernetes Engine'de başarıyla mikro hizmetlere ayırdınız ve dağıttınız.
Sonraki Adımlar
Kubernetes hakkında daha fazla bilgi edinmek için aşağıdaki kod laboratuvarlarına göz atın:
- Web Sitenizi Google Kubernetes Engine'de Dağıtma, Ölçeklendirme ve Güncelleme
- Kubernetes'te Node.js ile Slack botu oluşturma
- Spinnaker'ı kullanarak Kubernetes'e sürekli teslim
- Google Kubernetes Engine'deki Kubernetes'e Java uygulaması dağıtma
Ek Kaynaklar
- Docker: https://docs.docker.com/
- Kubernetes: https://kubernetes.io/docs/home/
- Google Kubernetes Engine (GKE): https://cloud.google.com/kubernetes-engine/docs/
- Google Cloud Build: https://cloud.google.com/cloud-build/docs/
- Google Container Registry: https://cloud.google.com/container-registry/docs/
- Monolitleri Mikro Hizmetlere Taşıma: https://cloud.google.com/solutions/migrating-a-monolithic-app-to-microservices-gke