1. مقدمه
Eventarc اتصال سرویس های Cloud Run را با رویدادها از منابع مختلف آسان می کند. این به شما امکان میدهد معماریهای رویداد محور بسازید که در آن ریزسرویسها بهطور سست کوپل شده و توزیع میشوند. از انتقال رویداد، تحویل، امنیت، مجوز، و رسیدگی به خطا برای شما مراقبت می کند.
Workflows یک پلت فرم ارکستراسیون کاملاً مدیریت شده است که خدمات را به ترتیبی که شما تعریف می کنید اجرا می کند: گردش کار. این گردشهای کاری میتوانند سرویسهای میزبانی شده در Cloud Run یا Cloud Function، سرویسهای Google Cloud مانند Cloud Vision AI و BigQuery و هر API مبتنی بر HTTP را ترکیب کنند.
در این نرم افزار کد، شما یک ارکستراسیون رویداد محور از میکروسرویس ها برای پردازش تصاویر ایجاد خواهید کرد. شما از Workflows برای هماهنگ کردن ترتیب، ورودیها و خروجیهای 4 عملکرد Cloud پردازش تصویر استفاده خواهید کرد. سپس ارکستراسیون را فعال میکنید تا با Eventarc به رویدادهای Cloud Storage پاسخ دهد.
در پایان، شما به یک معماری بدون سرور انعطاف پذیر و در عین حال ساختار یافته برای پردازش تصاویر خواهید رسید.
چیزی که یاد خواهید گرفت
- مروری بر Eventarc و Workflows
- نحوه استقرار خدمات Cloud Functions
- چگونه خدمات را با استفاده از Workflow ها هماهنگ کنیم
- چگونه با Eventarc کاری کنیم که Workflow ها به رویدادهای Cloud Storage پاسخ دهند
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، می توانید منابعی را که ایجاد کرده اید حذف کنید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.
gcloud را راه اندازی کنید
در Cloud Shell، شناسه پروژه و منطقه ای را که می خواهید برنامه خود را در آن مستقر کنید، تنظیم کنید. آنها را به عنوان متغیرهای PROJECT_ID
و REGION
ذخیره کنید. برای مناطق موجود، مکانهای عملکردهای ابری را ببینید.
PROJECT_ID=your-project-id gcloud config set project $PROJECT_ID
کد منبع را دریافت کنید
کد منبع برنامه در پوشه processing-pipelines
مخزن eventtarc-samples قرار دارد.
کلون کردن مخزن:
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
به پوشه eventarc-samples/processing-pipelines
بروید:
cd eventarc-samples/processing-pipelines
3. نمای کلی معماری
معماری اپلیکیشن به شرح زیر است:
- یک تصویر در یک سطل ورودی ذخیره می شود که یک رویداد ایجاد فضای ذخیره سازی ابری ایجاد می کند.
- رویداد ایجاد Cloud Storage توسط Eventarc از طریق یک راهانداز Cloud Storage خوانده میشود و به عنوان یک CloudEvent به Workflows ارسال میشود.
- در مرحله اول گردش کار، Filter ، یک سرویس Cloud Function، از Vision API برای تعیین ایمن بودن تصویر استفاده می کند. اگر تصویر ایمن باشد، Workflows با مراحل بعدی ادامه مییابد.
- در مرحله دوم گردش کار، Labeler ، یک سرویس Cloud Function، برچسبهای تصویر را با Vision API استخراج میکند و برچسبها را در سطل خروجی ذخیره میکند.
- در مرحله سوم، Resizer ، یکی دیگر از سرویسهای Cloud Function، اندازه تصویر را با استفاده از ImageSharp تغییر داده و اندازه تصویر را در سطل خروجی ذخیره میکند.
- در مرحله آخر، Watermarker ، یکی دیگر از خدمات Cloud Function، یک واترمارک از برچسبها از Labeler را با استفاده از ImageSharp به تصویر تغییر اندازه میدهد و تصویر را در سطل خروجی ذخیره میکند.
برنامه توسط یک رویداد Cloud Storage راه اندازی می شود، از این رو رویداد محور است. پردازش تصاویر در یک گردش کار اتفاق می افتد، بنابراین یک ارکستراسیون است. در پایان، این یک ارکستراسیون رویداد محور برای یک معماری بدون سرور انعطاف پذیر و در عین حال ساختار یافته برای پردازش تصاویر است.
4. سطل ایجاد کنید
یک سطل ورودی برای آپلود تصاویر توسط کاربران و یک سطل خروجی برای خط لوله پردازش تصویر برای ذخیره تصاویر پردازش شده ایجاد کنید.
موارد زیر را در Cloud Shell اجرا کنید:
REGION=us-central1 BUCKET1=$PROJECT_ID-images-input BUCKET2=$PROJECT_ID-images-output gsutil mb -l $REGION gs://$BUCKET1 gsutil mb -l $REGION gs://$BUCKET2
5. استقرار سرویس فیلتر
بیایید با استقرار اولین سرویس شروع کنیم. این سرویس Cloud Functions اطلاعات سطل و فایل را دریافت می کند، تعیین می کند که آیا تصویر با Vision API ایمن است یا خیر و نتیجه را برمی گرداند.
ابتدا خدمات مورد نیاز را برای Cloud Functions gen2 و Vision API فعال کنید:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ run.googleapis.com \ vision.googleapis.com
در داخل پوشه processing-pipelines
سطح بالا، سرویس را مستقر کنید:
SERVICE_NAME=filter gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --entry-point Filter.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp
هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
6. سرویس برچسب زنی را مستقر کنید
دومین سرویس Cloud Functions اطلاعات سطل و فایل را دریافت می کند، برچسب های تصویر را با Vision API استخراج می کند و برچسب ها را در سطل خروجی ذخیره می کند.
در داخل پوشه processing-pipelines
سطح بالا، سرویس را مستقر کنید:
SERVICE_NAME=labeler gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Labeler.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp
هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
7. سرویس resizer را مستقر کنید
این سرویس Cloud Functions اطلاعات سطل و فایل را دریافت می کند، اندازه تصویر را با استفاده از ImageSharp تغییر می دهد و تصویر را در سطل خروجی ذخیره می کند.
در داخل پوشه processing-pipelines
سطح بالا، سرویس را مستقر کنید:
SERVICE_NAME=resizer gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Resizer.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \ --timeout=120s
به مقدار timeout
2 دقیقه توجه کنید تا به عملکرد تغییر اندازه زمان اضافی برای پردازش اجازه دهید.
هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
8. سرویس واترمارکر را مستقر کنید
این سرویس Cloud Functions اطلاعات سطل، فایل و برچسب ها را دریافت می کند، فایل را می خواند، برچسب ها را به عنوان واترمارک به تصویر با استفاده از ImageSharp اضافه می کند و تصویر را در سطل خروجی ذخیره می کند.
در داخل پوشه processing-pipelines
سطح بالا، سرویس را مستقر کنید:
SERVICE_NAME=watermarker gcloud functions deploy $SERVICE_NAME \ --gen2 \ --allow-unauthenticated \ --runtime dotnet3 \ --trigger-http \ --region=$REGION \ --set-env-vars BUCKET=$BUCKET2 \ --entry-point Watermarker.Function \ --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp
هنگامی که تابع مستقر شد، URL سرویس را در یک متغیر تنظیم کنید، بعداً به آن نیاز خواهیم داشت:
WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
در این مرحله، هر چهار تابع ابری باید مستقر و اجرا شوند:
9. تعریف و استقرار گردش کار
از Workflows استفاده کنید تا خدمات فیلتر، برچسب، تغییر اندازه و واترمارکر را در یک گردش کار گرد هم بیاورید. گردش کار فراخوانی این سرویس ها را به ترتیب و با پارامترهایی که ما تعریف می کنیم هماهنگ می کند.
ابتدا خدمات مورد نیاز را برای Workflows فعال کنید:
gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com
تعریف کنید
Workflows یک CloudEvent را به عنوان پارامتر دریافت می کند. هنگامی که ما یک ماشه ایجاد کنیم، این از Eventarc می آید. در دو مرحله اول، Workflows رویداد را ثبت می کند و اطلاعات سطل و فایل را از رویداد استخراج می کند:
main: params: [event] steps: - log_event: call: sys.log args: text: ${event} severity: INFO - extract_bucket_and_file: assign: - bucket: ${event.data.bucket} - file: ${event.data.name}
در مرحله filter
، Workflows با سرویس فیلتری که قبلا مستقر کرده بودیم تماس می گیرد. سپس لاگ می کند و ایمنی فایل را بررسی می کند:
- filter: call: http.post args: url: FILTER_URL # TODO: Replace auth: type: OIDC body: bucket: ${bucket} file: ${file} result: filterResponse - log_safety: call: sys.log args: text: ${filterResponse.body.safe} severity: INFO - check_safety: switch: - condition: ${filterResponse.body.safe == true} next: label next: end
در مرحله label
، Workflows با سرویس برچسبگذار تماس میگیرد و پاسخ را دریافت میکند (3 برچسب برتر):
- label: call: http.post args: url: LABELER_URL # TODO: Replace auth: type: OIDC body: bucket: ${bucket} file: ${file} result: labelResponse
در مرحله resize
، Workflows با سرویس تغییر اندازه تماس می گیرد و پاسخ را می گیرد (سطل و فایل تصویر تغییر اندازه):
- resize: call: http.post args: url: RESIZER_URL # TODO: Replace auth: type: OIDC body: bucket: ${bucket} file: ${file} result: resizeResponse
در مرحله watermark
، Workflows سرویس واترمارکر را با تصویر تغییر اندازه و برچسب گذاری می کند و نتیجه را می گیرد (تصویر تغییر اندازه و واترمارک شده):
- watermark: call: http.post args: url: WATERMARKER_URL # TODO: Replace auth: type: OIDC body: bucket: ${resizeResponse.body.bucket} file: ${resizeResponse.body.file} labels: ${labelResponse.body.labels} result: watermarkResponse
در مرحله final
، Workflows کد وضعیت HTTP را از سرویسهای برچسبگذار، تغییر اندازهدهنده و واترمارکر برمیگرداند:
- final: return: label: ${labelResponse.code} resize: ${resizeResponse.code} watermark: ${watermarkResponse.code}
مستقر کنید
قبل از استقرار گردش کار، مطمئن شوید که URL های سرویس با آدرس های توابع مستقر شده به صورت دستی یا با استفاده از sed
جایگزین شده اند:
در داخل پوشه processing-pipelines
سطح بالا، به پوشه image-v3
که فایل workflows.yaml
در آن قرار دارد بروید:
cd image-v3/
sed
را اجرا کنید تا نشانیهای اینترنتی جایبانی را با نشانیهای اینترنتی واقعی سرویسهای مستقر جایگزین کنید:
sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml
گسترش گردش کار:
WORKFLOW_NAME=image-processing gcloud workflows deploy $WORKFLOW_NAME \ --source=workflow.yaml \ --location=$REGION
در عرض چند ثانیه، باید گردش کار مستقر در کنسول را مشاهده کنید:
10. ایجاد ماشه
اکنون که گردش کار مستقر شده است، آخرین مرحله اتصال آن به رویدادهای Cloud Storage با یک ماشه Eventarc است.
راه اندازی یکباره
ابتدا خدمات مورد نیاز را برای Eventarc فعال کنید:
gcloud services enable \ eventarc.googleapis.com
یک حساب کاربری ایجاد کنید که از آن در تریگر Eventarc استفاده خواهید کرد.
SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Eventarc trigger image processing service account"
نقش workflows.invoker
را اعطا کنید، بنابراین از حساب سرویس میتوان برای فراخوانی گردشهای کاری از Eventarc استفاده کرد:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/workflows.invoker \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
نقش eventarc.eventReceiver
را اعطا کنید، o حساب سرویس را می توان در یک استفاده کرد
راهانداز ذخیرهسازی ابری:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/eventarc.eventReceiver \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
نقش pubsub.publisher
را به حساب سرویس Cloud Storage اعطا کنید. این مورد برای راهانداز ذخیرهسازی ابری Eventarc مورد نیاز است:
STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$STORAGE_SERVICE_ACCOUNT \ --role roles/pubsub.publisher
ایجاد کنید
برای ایجاد تریگر موارد زیر را اجرا کنید. این راهانداز رویدادهای ایجاد فایل جدید را از سطل ذخیرهسازی ابری ورودی فیلتر میکند و آنها را به جریان کاری که قبلاً تعریف کردیم ارسال میکند:
TRIGGER_NAME=trigger-image-processing gcloud eventarc triggers create $TRIGGER_NAME \ --location=$REGION \ --destination-workflow=$WORKFLOW_NAME \ --destination-workflow-location=$REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET1" \ --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
می توانید ببینید که ماشه در بخش Eventarc در Cloud Console ایجاد و آماده است:
11. خط لوله را آزمایش کنید
خط لوله پردازش تصویر آماده دریافت رویدادها از Cloud Storage است. برای آزمایش خط لوله، یک تصویر را در سطل ورودی آپلود کنید:
gsutil cp beach.jpg gs://$BUCKET1
به محض آپلود تصویر، باید اجرای Workflows را در حالت فعال مشاهده کنید:
بعد از یک دقیقه یا بیشتر، باید ببینید که اعدام با موفقیت انجام شده است. همچنین می توانید ورودی و خروجی گردش کار را مشاهده کنید:
اگر محتویات سطل خروجی را فهرست کنید، باید اندازه تصویر تغییر سایز، تصویر تغییر اندازه و واترمارک شده و برچسب های تصویر را ببینید:
gsutil ls gs://$BUCKET2 gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg gs://$PROJECT_ID-images-output/beach-400x400.png gs://$PROJECT_ID-images-output/beach-labels.txt
برای بررسی دوبار، می توانید تصویر تغییر اندازه و واترمارک شده را باز کنید تا نتیجه را ببینید:
12. تبریک می گویم
تبریک می گویم، شما نرم افزار کد را تمام کردید!
آنچه را پوشش داده ایم
- مروری بر Eventarc و Workflows
- نحوه استقرار خدمات Cloud Functions
- چگونه خدمات را با استفاده از Workflow ها هماهنگ کنیم
- چگونه با Eventarc کاری کنیم که Workflow ها به رویدادهای Cloud Storage پاسخ دهند