مهاجرت یک وب سایت یکپارچه به میکروسرویس ها در موتور Google Kubernetes

1. مقدمه

چرا از یک برنامه یکپارچه به معماری میکروسرویس مهاجرت کنیم؟ تجزیه یک برنامه کاربردی به میکروسرویس دارای مزایای زیر است: بسیاری از اینها از این واقعیت ناشی می شوند که میکروسرویس ها به طور ضعیف جفت شده اند.

  • میکروسرویس ها می توانند به طور مستقل آزمایش و اجرا شوند. هرچه واحد استقرار کوچکتر باشد، استقرار آسان تر است.
  • آنها را می توان در زبان ها و چارچوب های مختلف پیاده سازی کرد. برای هر میکروسرویس، شما مختار هستید که بهترین فناوری را برای موارد استفاده خاص آن انتخاب کنید.
  • آنها می توانند توسط تیم های مختلف مدیریت شوند. مرز بین میکروسرویس ها اختصاص دادن یک تیم به یک یا چند ریزسرویس را آسان تر می کند.
  • با انتقال به میکروسرویس ها، وابستگی بین تیم ها را کاهش می دهید. هر تیم باید فقط به API های میکروسرویس هایی که به آنها وابسته هستند اهمیت دهد. تیم نیازی به فکر کردن در مورد نحوه پیاده سازی آن میکروسرویس ها، چرخه انتشار آنها و غیره ندارد.
  • شما راحت تر می توانید برای شکست طراحی کنید. با داشتن مرزهای مشخص بین سرویس ها، تشخیص اینکه در صورت قطع شدن سرویس چه کاری باید انجام دهید آسان تر است.

برخی از معایب در مقایسه با یکپارچه ها عبارتند از:

  • از آنجایی که یک اپلیکیشن مبتنی بر میکروسرویس شبکه‌ای از سرویس‌های مختلف است که اغلب به روش‌هایی با هم تعامل دارند که واضح نیست، پیچیدگی کلی سیستم رو به افزایش است.
  • برخلاف اجزای داخلی یکپارچه، میکروسرویس ها از طریق یک شبکه ارتباط برقرار می کنند. در برخی شرایط، این می تواند به عنوان یک نگرانی امنیتی دیده شود. ایستیو این مشکل را با رمزگذاری خودکار ترافیک بین میکروسرویس ها حل می کند.
  • به دلیل تأخیر بین سرویس‌ها، دستیابی به همان سطح عملکرد با رویکرد یکپارچه می‌تواند دشوار باشد.
  • رفتار سیستم شما توسط یک سرویس منفرد نیست، بلکه توسط بسیاری از آنها و تعامل آنها ایجاد می شود. به همین دلیل، درک نحوه رفتار سیستم شما در تولید (قابل مشاهده بودن آن) دشوارتر است. ایستیو راه حلی برای این مشکل نیز هست.

در این آزمایشگاه ما میکروسرویس ها را در موتور Google Kubernetes (GKE) اجرا خواهیم کرد. Kubernetes یک پلت فرم برای مدیریت، میزبانی، مقیاس و استقرار کانتینرها است. کانتینرها روشی قابل حمل برای بسته بندی و اجرای کد هستند. آنها به خوبی با الگوی میکروسرویس ها مناسب هستند، جایی که هر میکروسرویس می تواند در ظرف خود کار کند.

برای این آزمایشگاه، ما یک برنامه یکپارچه موجود را در یک خوشه Google Kubernetes Engine مستقر می کنیم، سپس آن را به میکروسرویس ها تقسیم می کنیم!

نمودار معماری میکروسرویس های ما

ما با تقسیم یکپارچه خود به سه میکروسرویس، یکی در یک زمان، شروع خواهیم کرد. ریزسرویس ها شامل سفارشات، محصولات و فرانت اند هستند. ما یک تصویر Docker برای هر میکروسرویس با استفاده از Cloud Build می‌سازیم که آن را از داخل Cloud Shell فعال می‌کنیم. سپس میکروسرویس های خود را در موتور Google Kubernetes (GKE) با نوع سرویس Kubernetes LoadBalancer مستقر کرده و در معرض دید قرار می دهیم. ما این کار را برای هر سرویس انجام خواهیم داد در حالی که به طور همزمان آنها را از یکپارچگی خود خارج می کنیم. در طول این فرآیند، ما هم مونولیت و هم میکروسرویس‌هایمان را تا پایانی که بتوانیم یکپارچه خود را حذف کنیم، در حال اجرا خواهیم بود.

636a2d58588b2b87.png

چیزی که یاد خواهید گرفت

  • چگونه یک Monolith را به Microservices تجزیه کنیم
  • چگونه یک خوشه Google Kubernetes Engine ایجاد کنیم
  • نحوه ایجاد یک تصویر داکر
  • نحوه استقرار تصاویر Docker در Kubernetes

پیش نیازها

  • یک حساب Google Cloud Platform با دسترسی مدیریتی برای ایجاد پروژه‌ها یا پروژه‌ای با نقش مالک پروژه
  • درک اولیه از Docker و Kubernetes

2. تنظیم محیط

تنظیم محیط خود به خود

اگر قبلاً یک حساب Google (Gmail یا Google Apps) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و یک پروژه جدید ایجاد کنید:

53dad2cefdae71da.png

اسکرین شات از 10/02/2016 12:45:26.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID نامیده خواهد شد.

در مرحله بعد، برای استفاده از منابع Google Cloud و فعال کردن Container Engine API، باید صورتحساب را در Developers Console فعال کنید .

گذراندن این کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد (به بخش "پاکسازی" در انتهای این سند مراجعه کنید). قیمت موتور Google Kubernetes در اینجا مستند شده است.

کاربران جدید Google Cloud Platform واجد شرایط استفاده آزمایشی رایگان 300 دلاری هستند.

Google Cloud Shell

در حالی که Google Cloud و Kubernetes را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

این ماشین مجازی مبتنی بر دبیان با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. این بدان معنی است که تمام چیزی که برای این کد لبه نیاز دارید یک مرورگر است (بله، روی کروم بوک کار می کند).

  1. برای فعال کردن Cloud Shell از Cloud Console، کافی است روی Activate Cloud Shell کلیک کنید. fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7P6XFNqNqVB7p6FQNqNqVBQ7P6XfNqSw P-X3Q (تهیه و اتصال به محیط فقط چند لحظه طول می کشد).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1NYAd

Screen Shot 2017-06-14 at 10.13.43 PM.png

پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی PROJECT_ID شما تنظیم شده است.

gcloud auth list

خروجی فرمان

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

خروجی فرمان

[core]
project = <PROJECT_ID>

اگر به دلایلی پروژه تنظیم نشد، به سادگی دستور زیر را صادر کنید:

gcloud config set project <PROJECT_ID>

به دنبال PROJECT_ID خود هستید؟ بررسی کنید از چه شناسه ای در مراحل راه اندازی استفاده کرده اید یا آن را در داشبورد Cloud Console جستجو کنید:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93DrxZHQ4PhZ5

Cloud Shell همچنین برخی از متغیرهای محیطی را به صورت پیش‌فرض تنظیم می‌کند که ممکن است هنگام اجرای دستورات آینده مفید باشند.

echo $GOOGLE_CLOUD_PROJECT

خروجی فرمان

<PROJECT_ID>
  1. در نهایت، منطقه پیش فرض و پیکربندی پروژه را تنظیم کنید.
gcloud config set compute/zone us-central1-f

شما می توانید مناطق مختلفی را انتخاب کنید. برای اطلاعات بیشتر، به مناطق و مناطق مراجعه کنید.

3. کلون منبع مخزن

ما از یک برنامه یکپارچه موجود از یک وب سایت تجارت الکترونیک خیالی، با یک صفحه خوش آمدگویی ساده، یک صفحه محصولات و یک صفحه تاریخچه سفارش استفاده می کنیم. ما فقط باید منبع را از مخزن git خود شبیه سازی کنیم، بنابراین می توانیم بر تجزیه آن به میکروسرویس ها و استقرار در Google Kubernetes Engine (GKE) تمرکز کنیم.

دستورات زیر را اجرا کنید تا git repo را به نمونه Cloud Shell خود شبیه سازی کنید و به دایرکتوری مناسب تغییر دهید. ما همچنین وابستگی های NodeJS را نصب خواهیم کرد تا بتوانیم قبل از استقرار یکپارچه خود را آزمایش کنیم. ممکن است چند دقیقه طول بکشد تا این اسکریپت اجرا شود.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

این کار مخزن Github ما را کلون می کند، به دایرکتوری تغییر می دهد و وابستگی های مورد نیاز برای اجرای برنامه ما به صورت محلی را نصب می کند. ممکن است چند دقیقه طول بکشد تا این اسکریپت اجرا شود.

4. یک خوشه GKE ایجاد کنید

اکنون که محیط توسعه‌دهنده کاری خود را دارید، ما به یک خوشه Kubernetes نیاز داریم تا یکپارچه و در نهایت ریزسرویس‌های ما را در آن مستقر کنیم! قبل از اینکه بتوانیم یک خوشه ایجاد کنیم، باید مطمئن شویم که APIهای مناسب فعال هستند. دستور زیر را برای فعال کردن Containers api اجرا کنید تا بتوانیم از Google Kubernetes Engine استفاده کنیم:

gcloud services enable container.googleapis.com

اکنون ما آماده ایم تا خوشه خود را ایجاد کنیم! دستور زیر را اجرا کنید تا یک خوشه GKE با نام fancy-cluster با 3 گره ایجاد کنید.

gcloud container clusters create fancy-cluster --num-nodes 3

ممکن است چند دقیقه طول بکشد تا خوشه ایجاد شود. پس از تکمیل دستور، دستور زیر را اجرا کنید و سه نمونه VM کارگر کلاستر را ببینید:

gcloud compute instances list

خروجی:

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 و اطلاعات مربوط به آن را در کنسول Google Cloud مشاهده کنید. روی دکمه منو در بالا سمت چپ کلیک کنید، به موتور Kubernetes بروید و روی Clusters کلیک کنید. باید خوشه خود را با نام fancy-cluster ببینید.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

تبریک می گویم! شما به تازگی اولین خوشه Kubernetes خود را ایجاد کرده اید!

5. یکپارچه موجود را مستقر کنید

از آنجایی که تمرکز این آزمایشگاه بر تجزیه یک مونولیت به میکروسرویس ها است، ما باید یک برنامه یکپارچه را راه اندازی و اجرا کنیم. اسکریپت زیر را برای استقرار یک برنامه monolith در خوشه GKE ما برای اهداف این آزمایشگاه اجرا کنید:

cd ~/monolith-to-microservices
./deploy-monolith.sh

دسترسی به یکپارچه

برای پیدا کردن آدرس IP خارجی برنامه monolith خود، دستور زیر را اجرا کنید.

kubectl get service monolith

شما باید خروجی مشابه زیر را ببینید:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

توجه: برای این کار باید یک بار متعادل کننده خارجی و IP تهیه شود، بنابراین مدتی طول می کشد تا این اتفاق بیفتد. اگر خروجی شما IP خارجی را به عنوان فهرست می کند

<pending> چند دقیقه به آن فرصت دهید و دوباره امتحان کنید.

هنگامی که آدرس IP خارجی را برای یکپارچه خود تعیین کردید، آدرس IP را کپی کنید. مرورگر خود را به این URL (مانند http://203.0.113.0) نشان دهید تا بررسی کنید که آیا یکپارچه شما در دسترس است یا خیر.

9ed25c3f0cbe62fa.png

شما باید صفحه خوش آمدگویی برای وب سایت یکپارچه را درست مانند تصویر بالا ببینید. صفحه خوش آمدگویی یک صفحه ثابت است که بعداً توسط میکروسرویس Frontend ارائه می شود. اکنون یکپارچه خود را به طور کامل در Kubernetes در حال اجرا دارید!

6. انتقال سفارشات به Microservice

اکنون که وب‌سایت مونولیتی موجود خود را در GKE اجرا می‌کنیم، می‌توانیم هر سرویس را به یک میکروسرویس تبدیل کنیم. به طور معمول، یک تلاش برنامه ریزی باید انجام شود که کدام سرویس ها به بخش های کوچکتر تقسیم شوند، معمولاً در اطراف بخش های خاصی از برنامه مانند دامنه تجاری. برای اهداف نمایشی، ما یک نمونه بی اهمیت ایجاد کرده ایم و هر سرویس را در حوزه کسب و کار، سفارشات، محصولات و Frontend تقسیم کرده ایم. کد قبلاً منتقل شده است و ما روی ساخت و استقرار خدمات در Google Kubernetes Engine (GKE) تمرکز خواهیم کرد.

Microservice سفارشات جدید ایجاد کنید

اولین سرویسی که به آن دست خواهیم یافت، سرویس Orders است. ما از پایگاه کد جداگانه ارائه شده استفاده خواهیم کرد و یک Docker Container جداگانه برای این سرویس ایجاد خواهیم کرد.

با Google Cloud Build کانتینر Docker ایجاد کنید

از آنجایی که ما قبلاً پایگاه کد را برای شما منتقل کرده‌ایم، اولین گام ما ایجاد یک ظرف Docker از سرویس Order خود با استفاده از Google Cloud Build است.

به طور معمول شما باید یک رویکرد دو مرحله ای را در پیش بگیرید که مستلزم ساخت یک داکر کانتینر و هل دادن آن به یک رجیستری برای ذخیره تصویر برای GKE است تا از آن خارج شود. اما می‌توانیم زندگی را آسان‌تر کنیم، می‌توانیم از Google Cloud Build برای ساخت کانتینر Docker استفاده کنیم و با یک دستور تصویر را در Google Cloud Container Registry قرار دهیم! این به ما امکان می دهد یک فرمان واحد را برای ساخت و انتقال تصویر خود به رجیستری کانتینر صادر کنیم. برای مشاهده مراحل دستی ایجاد فایل docker و فشار دادن آن می توانید به اینجا بروید.

Google Cloud Build فایل‌ها را از فهرست فشرده فشرده می‌کند و آنها را به سطل Google Cloud Storage منتقل می‌کند. سپس فرآیند ساخت تمام فایل‌ها را از سطل می‌گیرد و از Dockerfile برای اجرای فرآیند ساخت Docker استفاده می‌کند. از آنجایی که ما پرچم --tag با میزبان به‌عنوان gcr.io برای تصویر Docker مشخص کردیم، تصویر Docker به‌دست‌آمده به رجیستری Google Cloud Container منتقل می‌شود.

دستورات زیر را برای ساختن کانتینر Docker خود اجرا کنید و آن را به رجیستری کانتینر Google فشار دهید:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .

این فرآیند چند دقیقه طول می کشد، اما پس از تکمیل، خروجی مشابه زیر در ترمینال وجود دارد:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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

برای مشاهده تاریخچه ساخت خود یا تماشای فرآیند در زمان واقعی، می توانید به کنسول Google Cloud بروید. روی دکمه منو در بالا سمت چپ کلیک کنید و به Tools → Cloud Build پایین بروید و روی History کلیک کنید. در اینجا می توانید لیستی از تمام بیلدهای قبلی خود را مشاهده کنید، فقط باید 1 مورد وجود داشته باشد که به تازگی ایجاد کرده اید.

4c753ede203255f6.png

اگر روی شناسه ساخت کلیک کنید، می‌توانید تمام جزئیات آن بیلد از جمله خروجی گزارش را ببینید.

از صفحه جزئیات ساخت می توانید تصویر کانتینری که با کلیک بر روی نام تصویر در قسمت اطلاعات ساخت ایجاد شده را مشاهده کنید.

6e88ed1643dfe629.png

Container را در GKE مستقر کنید

اکنون که وب‌سایت خود را کانتینر کرده‌ایم و کانتینر خود را به رجیستری کانتینر Google منتقل کرده‌ایم، زمان آن رسیده است که در Kubernetes مستقر شویم!

Kubernetes برنامه‌ها را به‌عنوان Pods نشان می‌دهد، که واحدهایی هستند که یک ظرف (یا گروهی از کانتینرهای محکم جفت شده) را نشان می‌دهند. Pod کوچکترین واحد قابل استقرار در Kubernetes است. در این آموزش، هر Pod فقط حاوی ظرف میکروسرویس شماست.

برای استقرار و مدیریت برنامه ها در یک خوشه GKE، باید با سیستم مدیریت خوشه Kubernetes ارتباط برقرار کنید. شما معمولاً این کار را با استفاده از ابزار خط فرمان kubectl از داخل Cloud Shell انجام می دهید.

ابتدا یک منبع Deployment ایجاد می کنیم. Deployment چندین نسخه از برنامه شما را که Replica نامیده می شوند، مدیریت می کند و آنها را برای اجرا بر روی گره های جداگانه در خوشه شما برنامه ریزی می کند. در این حالت، Deployment تنها یک پاد از برنامه شما را اجرا خواهد کرد. Deployments با ایجاد ReplicaSet این امر را تضمین می کنند. ReplicaSet وظیفه دارد اطمینان حاصل کند که تعداد کپی های مشخص شده همیشه در حال اجرا هستند.

دستور kubectl create deployment زیر باعث می شود Kubernetes یک Deployment به نام سفارشات را با 1 replica در خوشه شما ایجاد کند.

دستور زیر را برای استقرار برنامه خود اجرا کنید:

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

تأیید استقرار

برای تأیید اینکه Deployment با موفقیت ایجاد شده است، دستور زیر را اجرا کنید، ممکن است چند لحظه طول بکشد تا وضعیت pod در حال اجرا باشد:

kubectl get all

خروجی:

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

این خروجی چندین چیز را به ما نشان می دهد. ما می توانیم Deployment خود را که در حال اجرا است، ReplicaSet خود را با تعداد غلاف مورد نظر 1، و Pod خود را که در حال اجرا است، ببینیم. به نظر می رسد همه چیز با موفقیت ایجاد شده است!

ظرف GKE را در معرض دید قرار دهید

ما برنامه خود را در GKE مستقر کرده ایم، اما راهی برای دسترسی به آن در خارج از خوشه نداریم. به طور پیش فرض، کانتینرهایی که در GKE اجرا می کنید از طریق اینترنت قابل دسترسی نیستند، زیرا آدرس IP خارجی ندارند. شما باید به صراحت برنامه خود را از طریق یک منبع سرویس در معرض ترافیک اینترنت قرار دهید. A Service پشتیبانی شبکه و IP را برای Pods برنامه شما فراهم می کند. GKE یک IP خارجی و یک Load Balancer ( با توجه به صورتحساب ) برای برنامه شما ایجاد می کند.

هنگامی که سرویس Orders خود را مستقر کردیم، آن را در پورت 8081 به صورت داخلی از طریق استقرار Kubernetes در معرض دید قرار دادیم. برای نمایش خارجی این سرویس، باید یک سرویس Kubernetes از نوع LoadBalancer ایجاد کنیم تا ترافیک را از پورت 80 به صورت خارجی به پورت داخلی 8081 برای سرویس Orders هدایت کند. دستور زیر را اجرا کنید تا وب سایت خود را در معرض اینترنت قرار دهید:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

دسترسی به سرویس

GKE آدرس IP خارجی را به منبع Service اختصاص می دهد نه Deployment. اگر می‌خواهید IP خارجی را که GKE برای برنامه شما ارائه کرده است، پیدا کنید، می‌توانید سرویس را با دستور kubectl get service بررسی کنید:

kubectl get service orders

خروجی:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

هنگامی که آدرس IP خارجی برنامه خود را تعیین کردید، آدرس IP را کپی کنید. هنگامی که ما یکپارچه خود را تغییر می دهیم تا به سرویس سفارشات جدید خود اشاره کنیم، آن را برای مرحله بعدی ذخیره کنید!

Monolith را دوباره پیکربندی کنید

از آنجایی که ما سرویس Orders را از یکپارچه حذف کردیم، باید یکپارچه را تغییر دهیم تا به میکروسرویس جدید Orders خارجی اشاره کند.

هنگام شکستن یک مونولیت، ما در حال حذف تکه‌های کد از یک پایگاه کد واحد به چندگانه و استقرار آنها به طور جداگانه هستیم. از آنجایی که میکروسرویس روی سرور دیگری اجرا می‌شود، دیگر نمی‌توانیم نشانی‌های وب سرویس خود را به‌عنوان مسیرهای مطلق ارجاع دهیم، ما به مسیری به آدرس سرور جدید میکروسرویس سفارش خود نیاز داریم. توجه داشته باشید که برای به روز رسانی URL برای هر سرویسی که خراب شده است، به مدتی از کار افتادن سرویس monolith نیاز دارد. این باید هنگام برنامه ریزی برای انتقال ریزسرویس ها و مونولیت به تولید در طول فرآیند مهاجرت میکروسرویس ها در نظر گرفته شود.

ما باید فایل پیکربندی خود را در یکپارچه خود به روز کنیم تا به آدرس IP جدید Orders microservices اشاره کنیم. از ویرایشگر نانو برای جایگزینی URL محلی با آدرس IP میکروسرویس سفارشات جدید ما استفاده کنید. دستور زیر را برای ویرایش اجرا کنید

cd ~/monolith-to-microservices/react-app
nano .env.monolith

وقتی ویرایشگر باز می شود، فایل شما باید به شکل زیر باشد:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

REACT_APP_ORDERS_URL با فرمت جدید جایگزین کنید و آدرس IP میکروسرویس سفارشات را جایگزین کنید تا با زیر مطابقت داشته باشد:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

CTRL+O را فشار دهید، ENTER و سپس CTRL+X فشار دهید تا فایل در ویرایشگر نانو ذخیره شود.

می توانید میکروسرویس جدید خود را با پیمایش URL که در این فایل تنظیم کرده اید، آزمایش کنید. صفحه وب باید پاسخ JSON را از ریزسرویس سفارشات ما ارسال کند.

در مرحله بعد، ما نیاز داریم که frontend monolith خود را دوباره بسازیم و فرآیند ساخت را برای ساختن کانتینر برای monolith و مجدداً در کلاستر GKE خود تکرار کنیم. دستورات زیر را اجرا کنید این مراحل را کامل کنید:

فایل های پیکربندی Monolith را بازسازی کنید

npm run build:monolith

با Google Cloud Build کانتینر Docker ایجاد کنید

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Container را در GKE مستقر کنید

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

با رفتن به برنامه monolith در مرورگر خود و پیمایش به صفحه سفارشات، می‌توانید تأیید کنید که برنامه شما اکنون به میکروسرویس سفارشات جدید دسترسی دارد. تمام شناسه های سفارش باید به پسوند -MICROSERVICE مانند شکل زیر ختم شود:

1cdd60bb0d4d1148.png

7. انتقال محصولات به Microservice

میکروسرویس محصولات جدید ایجاد کنید

می‌توانیم با انتقال سرویس محصولات در مرحله بعد، به ارائه خدمات خود ادامه دهیم. ما همان روند مرحله قبل را دنبال می کنیم. دستورات زیر را برای ساختن کانتینر داکر اجرا کنید، کانتینر خود را مستقر کرده و از طریق سرویس Kubernetes در معرض آن قرار دهید.

با Google Cloud Build کانتینر Docker ایجاد کنید

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

Container را در GKE مستقر کنید

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

ظرف GKE را در معرض دید قرار دهید

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

IP عمومی خدمات محصولات ما را به همان روشی که برای سرویس سفارشات خود با دستور زیر انجام دادیم پیدا کنید:

kubectl get service products

خروجی:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

هنگامی که یکپارچه خود را برای اشاره به میکروسرویس محصولات جدیدمان پیکربندی مجدد می کنیم، آدرس IP را برای مرحله بعدی ذخیره کنید.

Monolith را دوباره پیکربندی کنید

از ویرایشگر نانو برای جایگزینی URL محلی با آدرس IP میکروسرویس های محصولات جدید ما استفاده کنید:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

وقتی ویرایشگر باز می شود، فایل شما باید به شکل زیر باشد:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

REACT_APP_PRODUCTS_URL در قالب جدید جایگزین کنید، در حالی که آدرس IP میکروسرویس محصول خود را جایگزین می‌کنید تا با زیر مطابقت داشته باشد:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

CTRL+O را فشار دهید، ENTER و سپس CTRL+X فشار دهید تا فایل در ویرایشگر نانو ذخیره شود.

می توانید میکروسرویس جدید خود را با پیمایش URL که در این فایل تنظیم کرده اید، آزمایش کنید. صفحه وب باید یک پاسخ JSON از میکروسرویس محصولات ما ارائه دهد.

در مرحله بعد، ما نیاز داریم که frontend monolith خود را دوباره بسازیم و فرآیند ساخت را برای ساختن کانتینر برای monolith و مجدداً در کلاستر GKE خود تکرار کنیم. دستورات زیر را اجرا کنید این مراحل را کامل کنید:

فایل های پیکربندی Monolith را بازسازی کنید

npm run build:monolith

با Google Cloud Build کانتینر Docker ایجاد کنید

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

Container را در GKE مستقر کنید

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

با رفتن به برنامه monolith در مرورگر خود و پیمایش به صفحه محصولات، می‌توانید تأیید کنید که برنامه شما اکنون به میکروسرویس محصولات جدید دسترسی دارد. تمام نام های محصول باید با پیشوند MS- مطابق شکل زیر باشد:

5389b29f4b8c7c69.png

8. Frontend را به Microservice منتقل کنید

آخرین مرحله در فرآیند مهاجرت، انتقال کد فرانت اند به یک میکروسرویس و خاموش کردن مونولیت است! پس از تکمیل این مرحله، ما با موفقیت یکپارچه خود را به معماری میکروسرویس منتقل خواهیم کرد!

Microservice New Frontend ایجاد کنید

بیایید همان روال دو مرحله آخر را برای ایجاد یک میکروسرویس frontend جدید دنبال کنیم.

قبلاً وقتی یکپارچه خود را بازسازی می کردیم، پیکربندی خود را برای اشاره به یکپارچه خود به روز می کردیم، اما اکنون باید از همان پیکربندی برای میکروسرویس Frontend خود استفاده کنیم. دستورات زیر را برای کپی کردن فایل های پیکربندی URL میکروسرویس در پایگاه کد میکروسرویس Frontend اجرا کنید:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

پس از تکمیل، ما همان روند مراحل قبلی را دنبال می کنیم. دستورات زیر را برای ساختن کانتینر داکر اجرا کنید، کانتینر خود را مستقر کرده و از طریق سرویس Kubernetes در معرض آن قرار دهید.

با Google Cloud Build کانتینر Docker ایجاد کنید

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

Container را در GKE مستقر کنید

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

ظرف GKE را در معرض دید قرار دهید

kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080

یکپارچه را حذف کنید

اکنون که همه سرویس‌های ما به صورت میکروسرویس اجرا می‌شوند، می‌توانیم اپلیکیشن monolith خود را حذف کنیم! توجه داشته باشید، در یک انتقال واقعی، این همچنین مستلزم تغییرات DNS و غیره است تا نام دامنه موجود ما به میکروسرویس‌های frontend جدید برای برنامه ما اشاره کند. دستورات زیر را برای حذف یکپارچه ما اجرا کنید:

kubectl delete deployment monolith
kubectl delete service monolith

کار خود را تست کنید

برای تأیید اینکه همه چیز کار می کند، آدرس IP قدیمی شما از سرویس monolith شما نباید کار کند و آدرس IP جدید شما از سرویس frontend شما باید میزبان برنامه جدید باشد. برای مشاهده لیستی از تمام سرویس ها و آدرس های IP، از دستور زیر استفاده کنید:

kubectl get services

خروجی شما باید شبیه شکل زیر باشد:

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

هنگامی که آدرس IP خارجی میکروسرویس Frontend خود را تعیین کردید، آدرس IP را کپی کنید. مرورگر خود را به این URL (مانند http://203.0.113.0) نشان دهید تا بررسی کنید که آیا ظاهر شما در دسترس است یا خیر. وب سایت شما باید همان چیزی باشد که قبل از اینکه یکپارچه را به میکروسرویس ها تقسیم کنیم!

9. پاکسازی

پس از آماده شدن، ساده ترین راه برای پاکسازی تمام فعالیت های انجام شده، حذف پروژه است. حذف پروژه، تمام منابعی را که در این Codelab ایجاد شده‌اند حذف می‌کند تا اطمینان حاصل شود که هزینه‌های تکراری غیرمنتظره‌ای رخ نمی‌دهد. موارد زیر را در Cloud Shell اجرا کنید، جایی که PROJECT_ID شناسه کامل پروژه است و نه فقط نام پروژه.

gcloud projects delete [PROJECT_ID]

در صورت درخواست، با وارد کردن "Y" حذف را تأیید کنید.

10. تبریک می گویم!

شما با موفقیت برنامه یکپارچه خود را به میکروسرویس ها تقسیم کردید و آنها را در موتور Google Kubernetes مستقر کردید!

مراحل بعدی

برای کسب اطلاعات بیشتر در مورد Kubernetes، کدهای زیر را بررسی کنید:

منابع اضافی