1. مقدمه
چرا از یک برنامه یکپارچه به معماری میکروسرویس مهاجرت کنیم؟ تجزیه یک برنامه کاربردی به میکروسرویس دارای مزایای زیر است: بسیاری از اینها از این واقعیت ناشی می شوند که میکروسرویس ها به طور ضعیف جفت شده اند.
- میکروسرویس ها می توانند به طور مستقل آزمایش و اجرا شوند. هرچه واحد استقرار کوچکتر باشد، استقرار آسان تر است.
- آنها را می توان در زبان ها و چارچوب های مختلف پیاده سازی کرد. برای هر میکروسرویس، شما مختار هستید که بهترین فناوری را برای موارد استفاده خاص آن انتخاب کنید.
- آنها می توانند توسط تیم های مختلف مدیریت شوند. مرز بین میکروسرویس ها اختصاص دادن یک تیم به یک یا چند ریزسرویس را آسان تر می کند.
- با انتقال به میکروسرویس ها، وابستگی بین تیم ها را کاهش می دهید. هر تیم باید فقط به API های میکروسرویس هایی که به آنها وابسته هستند اهمیت دهد. تیم نیازی به فکر کردن در مورد نحوه پیاده سازی آن میکروسرویس ها، چرخه انتشار آنها و غیره ندارد.
- شما راحت تر می توانید برای شکست طراحی کنید. با داشتن مرزهای مشخص بین سرویس ها، تشخیص اینکه در صورت قطع شدن سرویس چه کاری باید انجام دهید آسان تر است.
برخی از معایب در مقایسه با یکپارچه ها عبارتند از:
- از آنجایی که یک اپلیکیشن مبتنی بر میکروسرویس شبکهای از سرویسهای مختلف است که اغلب به روشهایی با هم تعامل دارند که واضح نیست، پیچیدگی کلی سیستم رو به افزایش است.
- برخلاف اجزای داخلی یکپارچه، میکروسرویس ها از طریق یک شبکه ارتباط برقرار می کنند. در برخی شرایط، این می تواند به عنوان یک نگرانی امنیتی دیده شود. ایستیو این مشکل را با رمزگذاری خودکار ترافیک بین میکروسرویس ها حل می کند.
- به دلیل تأخیر بین سرویسها، دستیابی به همان سطح عملکرد با رویکرد یکپارچه میتواند دشوار باشد.
- رفتار سیستم شما توسط یک سرویس منفرد نیست، بلکه توسط بسیاری از آنها و تعامل آنها ایجاد می شود. به همین دلیل، درک نحوه رفتار سیستم شما در تولید (قابل مشاهده بودن آن) دشوارتر است. ایستیو راه حلی برای این مشکل نیز هست.
در این آزمایشگاه ما میکروسرویس ها را در موتور Google Kubernetes (GKE) اجرا خواهیم کرد. Kubernetes یک پلت فرم برای مدیریت، میزبانی، مقیاس و استقرار کانتینرها است. کانتینرها روشی قابل حمل برای بسته بندی و اجرای کد هستند. آنها به خوبی با الگوی میکروسرویس ها مناسب هستند، جایی که هر میکروسرویس می تواند در ظرف خود کار کند.
برای این آزمایشگاه، ما یک برنامه یکپارچه موجود را در یک خوشه Google Kubernetes Engine مستقر می کنیم، سپس آن را به میکروسرویس ها تقسیم می کنیم!
نمودار معماری میکروسرویس های ما
ما با تقسیم یکپارچه خود به سه میکروسرویس، یکی در یک زمان، شروع خواهیم کرد. ریزسرویس ها شامل سفارشات، محصولات و فرانت اند هستند. ما یک تصویر Docker برای هر میکروسرویس با استفاده از Cloud Build میسازیم که آن را از داخل Cloud Shell فعال میکنیم. سپس میکروسرویس های خود را در موتور Google Kubernetes (GKE) با نوع سرویس Kubernetes LoadBalancer مستقر کرده و در معرض دید قرار می دهیم. ما این کار را برای هر سرویس انجام خواهیم داد در حالی که به طور همزمان آنها را از یکپارچگی خود خارج می کنیم. در طول این فرآیند، ما هم مونولیت و هم میکروسرویسهایمان را تا پایانی که بتوانیم یکپارچه خود را حذف کنیم، در حال اجرا خواهیم بود.
چیزی که یاد خواهید گرفت
- چگونه یک Monolith را به Microservices تجزیه کنیم
- چگونه یک خوشه Google Kubernetes Engine ایجاد کنیم
- نحوه ایجاد یک تصویر داکر
- نحوه استقرار تصاویر Docker در Kubernetes
پیش نیازها
- یک حساب Google Cloud Platform با دسترسی مدیریتی برای ایجاد پروژهها یا پروژهای با نقش مالک پروژه
- درک اولیه از Docker و Kubernetes
2. تنظیم محیط
تنظیم محیط خود به خود
اگر قبلاً یک حساب Google (Gmail یا Google Apps) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و یک پروژه جدید ایجاد کنید:
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های 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 اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. این بدان معنی است که تمام چیزی که برای این کد لبه نیاز دارید یک مرورگر است (بله، روی کروم بوک کار می کند).
- برای فعال کردن Cloud Shell از Cloud Console، کافی است روی Activate Cloud Shell کلیک کنید. (تهیه و اتصال به محیط فقط چند لحظه طول می کشد).
پس از اتصال به 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 جستجو کنید:
Cloud Shell همچنین برخی از متغیرهای محیطی را به صورت پیشفرض تنظیم میکند که ممکن است هنگام اجرای دستورات آینده مفید باشند.
echo $GOOGLE_CLOUD_PROJECT
خروجی فرمان
<PROJECT_ID>
- در نهایت، منطقه پیش فرض و پیکربندی پروژه را تنظیم کنید.
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 ببینید.
تبریک می گویم! شما به تازگی اولین خوشه 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) نشان دهید تا بررسی کنید که آیا یکپارچه شما در دسترس است یا خیر.
شما باید صفحه خوش آمدگویی برای وب سایت یکپارچه را درست مانند تصویر بالا ببینید. صفحه خوش آمدگویی یک صفحه ثابت است که بعداً توسط میکروسرویس 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 مورد وجود داشته باشد که به تازگی ایجاد کرده اید.
اگر روی شناسه ساخت کلیک کنید، میتوانید تمام جزئیات آن بیلد از جمله خروجی گزارش را ببینید.
از صفحه جزئیات ساخت می توانید تصویر کانتینری که با کلیک بر روی نام تصویر در قسمت اطلاعات ساخت ایجاد شده را مشاهده کنید.
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 مانند شکل زیر ختم شود:
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- مطابق شکل زیر باشد:
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، کدهای زیر را بررسی کنید:
- وب سایت خود را در موتور Google Kubernetes مستقر، مقیاس و به روز کنید
- با Node.js در Kubernetes یک Slack Bot بسازید
- تحویل مداوم به Kubernetes با استفاده از Spinnaker
- یک برنامه جاوا را در Kubernetes در موتور Google Kubernetes مستقر کنید
منابع اضافی
- داکر - 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/
- انتقال تک سنگ ها به Microservices - https://cloud.google.com/solutions/migrating-a-monolithic-app-to-microservices-gke