1. Giriş
Neden monolitik uygulamadan mikro hizmet mimarisine geçiş yapmalısınız? Bir uygulamayı mikro hizmetlere ayırmanın sunduğu avantajlar şunlardır: Bunların çoğu, mikro hizmetlerin serbest bağlantılı olmasından kaynaklanı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 Google Kubernetes Engine'de (GKE) mikro hizmetler ç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ı
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 Build'i kullanarak her mikro hizmet için bir Docker görüntüsü oluştururuz. Bu işlemi Cloud Shell içinden tetikleriz. Ardından mikro hizmetlerimizi LoadBalancer türünde bir Kubernetes hizmetiyle Google Kubernetes Engine'de (GKE) dağıtıp kullanıma sunacağız. Hizmetleri yeniden düzenleyerek monolitimizden çıkarırken bu işlemi her hizmet için gerçekleştireceğiz. Süreç boyunca hem monolitimiz hem de mikro hizmetlerimiz, monolitimizi silebileceğimiz en sonuna kadar çalışır durumda kalacak.
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
Kendi hızınızda ortam kurulumu
Google Hesabınız (Gmail veya Google Apps) yoksa bir hesap oluşturmanız gerekir. Google Cloud Platform konsolunda oturum açın ( console.cloud.google.com) ve yeni bir proje oluşturun:
Tüm Google Cloud projelerinde benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad zaten alınmış ve size uygun olmayacaktır!). Bu kod laboratuvarın ilerleyen bölümlerinde PROJECT_ID
olarak adlandırılacaktır.
Ardından, Google Cloud kaynaklarını kullanmak ve Container Engine API'yi etkinleştirmek için Developers Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i çalıştırmanın maliyeti birkaç dolardan fazla değildir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bu kaynakları çalışır durumda bırakırsanız daha yüksek ücret ödemeniz gerekebilir (bu belgenin sonundaki "temizlik" bölümüne bakın). Google Kubernetes Engine fiyatlandırması hakkında bilgiyi burada bulabilirsiniz.
Yeni Google Cloud Platform kullanıcıları 300 ABD doları değerinde ücretsiz denemeden yararlanabilir.
Google Cloud Shell
Google Cloud ve Kubernetes, dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.
Bu Debian tabanlı sanal makine, ihtiyacınız olan tüm geliştirme araçlarıyla yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Yani bu codelab'de ihtiyacınız olan tek şey bir tarayıcıdır (Evet, Chromebook'ta çalışır).
- Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir simgesini tıklamanız yeterlidir (sağlanması ve ortama bağlanması yalnızca birkaç dakika sürer).
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin PROJECT_ID
olarak ayarlanmış olduğunu göreceksiniz.
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 vermeniz yeterlidir:
gcloud config set project <PROJECT_ID>
PROJECT_ID
cihazınızı mı arıyorsunuz? Kurulum adımlarında kullandığınız kimliği kontrol edin veya Cloud Console kontrol panelinden arayın:
Cloud Shell bazı ortam değişkenlerini de varsayılan olarak ayarlar. Bu değişkenler, gelecekte komut çalıştırdığınızda işinize yarayabilir.
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 farklı alt bölgeler seçebilirsiniz. Daha fazla bilgi için Bölgeler ve Bölgeler.
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 edebilmek için NodeJS bağımlılarını 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 klonlayacak, dizin değiştirecek ve uygulamamızı yerel olarak çalıştırmak için gereken bağımlılıkları yükleyecektir. 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şturabilmek için önce uygun API'lerin etkinleştirildiğinden emin olmamız gerekir. Google Kubernetes Engine'i kullanabilmemiz için container'lar API'sini 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 aşağıdaki komutu çalıştırarak kümedeki üç çalışan sanal makine örneğini görüntüleyin:
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 ilerleyin 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 konusunda bilgi edinmektir. Bu nedenle, bir monolitik uygulamayı çalışır duruma getirmemiz gerekir. Bu laboratuvarın amaçları doğrultusunda GKE kümemize monolit 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
Monolit 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 dengeleyicinin ve IP'nin temel hazırlığının yapılması gerekir. Bu nedenle, bu işlem biraz zaman alabilir. Çıkışınızda harici IP şu şekilde listeleniyorsa:
<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
Artık GKE'de çalışan mevcut monolitik web sitemiz olduğuna göre hizmetleri 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 küçük bir örnek oluşturduk ve her hizmeti işletme alan adı, Siparişler, Ürünler ve Ön Uç ile ilgili ayrıntıları paylaştık. Bu kod daha önce taşındı. Hizmetleri Google Kubernetes Engine'de (GKE) derleyip dağıtmaya odaklanacağız.
Yeni Siparişler Mikro Hizmeti Oluşturma
Ayrılacağımız ilk hizmet Siparişler hizmetidir. Sağlanan ayrı kod tabanından yararlanıp 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şler hizmetimizin bir Docker container'ı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. İşinizi kolaylaştırabiliriz. Google Cloud Build'i kullanarak Docker container'ını derleyebilir ve görüntüyü tek bir komutla Google Cloud Container Registry'ye yerleştirebiliriz. Böylece tek bir komut vererek görüntümüzü derleyip 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 --tag
işaretini belirttiğimizden, 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 konsoluna gidebilirsiniz. Sol üstteki menü düğmesini tıklayın ve aşağı kaydırarak 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ında, derleme bilgileri bölümünde görüntü adını tıklayarak oluşturulan container görüntüsünü görebilirsiniz.
Container'ı GKE'ye dağıtma
Web sitemizi container mimarisine aldığımıza ve container'ı 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 Dağıtım 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 durumda, 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 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 çeşitli bilgiler sunulmaktadır. Mevcut Dağıtımımızı, istenen kapsül sayısı 1 olan ReplicaSet'i ve çalışan 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 kullanıma sunmanı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 kullanıma sunmak için trafiği Siparişler hizmeti için harici bağlantı noktası 80'den 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 monoliti yeni harici Siparişler mikro hizmetine işaret edecek şekilde değiştirmemiz gerekiyor.
Monolitleri ayırırken tek bir kod tabanındaki kod parçalarını birden çok kod tabanına ayırır ve ayrı ayrı dağıtırız. Mikro hizmet farklı bir sunucuda çalıştığından artık hizmet URL'lerimize mutlak yollar olarak referans veremiyoruz. Bu nedenle, Siparişler mikro hizmetinin yeni sunucu adresine yönlendirme yapmamız gerekiyor. Bunun, ayrılan her bir hizmetin URL'sini güncellemek için monolit hizmetin bir süre kapalı kalması gerekeceğini unutmayın. Mikro hizmetleri taşıma sürecinde mikro hizmetlerinizi ve monolitinizi üretime taşımayı planlarken bunu göz önünde bulundurmalısınız.
Monolitimizdeki yapılandırma dosyamızı, yeni Siparişler mikro hizmetleri IP adresine işaret edecek şekilde güncellememiz gerekiyor. Yerel URL'yi yeni Siparişler mikro hizmetimizin IP adresiyle değiştirmek için nano düzenleyiciyi kullanın. Aşağıdaki komutu çalıştırarak
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
değerini Siparişler mikro hizmetinizin IP adresiyle değiştirirken aşağıdakiyle eşleşecek şekilde yeni biçimle değiştirin:
REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders REACT_APP_PRODUCTS_URL=/service/products
Dosyayı nano düzenleyiciye kaydetmek için CTRL+O
, ENTER
ve ardından CTRL+X
tuşlarına basın.
Bu dosyada ayarlamış olduğunuz URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Siparişler mikro hizmetimizden bir JSON yanıtı döndürecektir.
Şimdi monolit ön ucumuzu yeniden derleyip monolit container'ını derlemek ve GKE kümemize yeniden dağıtım yapmak için derleme işlemini tekrarlamamız gerekiyor. 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 giderek 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
Bir sonraki adımda Ürünler hizmetini taşıyarak hizmetlerimizin kapsamını genişletmeye devam edebiliriz. Bir önceki adımla 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/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 gibi, Ürün hizmetlerimizin de 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üzenleyiciye kaydetmek için CTRL+O
, ENTER
ve ardından CTRL+X
tuşlarına basın.
Bu dosyada ayarlamış olduğunuz URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Ürünler mikro hizmetimizden bir JSON yanıtı döndürecektir.
Şimdi monolit ön ucumuzu yeniden derleyip monolit container'ını derlemek ve GKE kümemize yeniden dağıtım yapmak için derleme işlemini tekrarlamamız gerekiyor. 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 giderek 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ü izleyelim.
Önceden monolitimizi yeniden derlediğimizde yapılandırmamızı monolitimize işaret edecek şekilde güncelledik. Ancak şimdi, Ön Uç mikro hizmetimiz için de aynı yapılandırmayı kullanmamız gerekiyor. Mikro hizmetler URL'sinin yapılandırma dosyalarımızı Ö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ğrulamak için monolit hizmetinize ait eski IP adresiniz çalışmamalı 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ğıdaki kodu yürütün. Burada PROJECT_ID yalnızca Proje Adı değil, tam Proje Kimliğidir.
gcloud projects delete [PROJECT_ID]
"Y" yazarak silme işlemini onaylayın sorulduğunda.
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 codelab'lere göz atın:
- Web Sitenizi Google Kubernetes Engine'de Dağıtma, Ölçeklendirme ve Güncelleme
- Kubernetes'te Node.js ile Slack Bot'u derleme
- Spinnaker Kullanarak Kubernetes'e Sürekli Teslim
- Google Kubernetes Engine'de 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