Extensible Service Proxy (ESP) הוא פרוקסי מבוסס NGINX שמאפשר ל-Cloud Endpoints לספק תכונות של ניהול API. כדי להגדיר את ESP, מציינים אפשרויות כשמפעילים את קונטיינר ה-Docker של ESP. כשהקונטיינר של ESP מתחיל, הוא מריץ סקריפט בשם start_esp, שכותב את קובץ ההגדרות של NGINX באמצעות האפשרויות שציינתם ומפעיל את ESP.
מציינים את אפשרויות ההפעלה של ה-ESP בפקודה docker run, לדוגמה:
sudo docker run \
--detach \
DOCKER_ARGUMENTS \
gcr.io/endpoints-release/endpoints-runtime:1 \
--service=SERVICE_NAME \
--rollout_strategy=managed \
--backend=YOUR_API_CONTAINER_NAME:8080
אם פורסים את ESP ב-Kubernetes, מציינים את אפשרויות ההפעלה בקובץ המניפסט של הפריסה בשדה args, לדוגמה:
containers:
- name: esp
image: gcr.io/endpoints-release/endpoints-runtime:1
args: [
"--http_port=8081",
"--backend=127.0.0.1:8080",
"--service=SERVICE_NAME",
"--rollout_strategy=managed"
]
בטבלה הבאה מתוארות אפשרויות ההפעלה של ESP.
| אפשרות קצרה | אפשרות ארוכה | תיאור |
|---|---|---|
-s SERVICE_NAME |
--service SERVICE_NAME |
מגדיר את השם של שירות Endpoints. |
-R ROLLOUT_STRATEGY |
--rollout_strategy ROLLOUT_STRATEGY |
האפשרות זמינה ב-ESP מגרסה 1.7.0 ואילך. צריך לציין |
-v CONFIG_ID |
--version CONFIG_ID |
מגדיר את מזהה תצורת השירות שבו ESP ישתמש. במאמר איך מקבלים את שם השירות ואת מזהה ההגדרה מוסבר איך מגדירים את האפשרות הזו.
כשמציינים --rollout_strategy=fixed או כשלא כוללים את האפשרות --rollout_strategy, צריך לכלול את האפשרות --version ולציין מזהה הגדרה. במקרה כזה, בכל פעם שמפעילים הגדרה חדשה של Endpoints, צריך להפעיל מחדש את ESP עם מזהה ההגדרה החדש.
|
-p HTTP1_PORT |
--http_port HTTP1_PORT |
הגדרת היציאות ש-ESP חושף לחיבורים מסוג HTTP/1.x.1 |
-P HTTP2_PORT |
--http2_port HTTP2_PORT |
הגדרת היציאות ש-ESP חושף לחיבורי HTTP/2.1 |
-S SSL_PORT |
--ssl_port SSL_PORT |
הגדרת היציאות ש-ESP חושף לחיבורי HTTPS.1 |
-a BACKEND |
--backend BACKEND |
מגדירה את הכתובת של שרת העורף של אפליקציית HTTP/1.x. ערך ברירת המחדל של כתובת הקצה העורפי הוא http://127.0.0.1:8081.אפשר לציין קידומת פרוטוקול, למשל: --backend=https://127.0.0.1:8000אם לא מציינים קידומת פרוטוקול, ברירת המחדל היא http.אם שרת הקצה העורפי פועל ב-Compute Engine בתוך קונטיינר, אפשר לציין את שם הקונטיינר ואת היציאה, לדוגמה: --backend=my-api-container:8000כדי לציין שהקצה העורפי מקבל תנועת gRPC, מוסיפים את התחילית grpc://. לדוגמה:--backend=grpc://127.0.0.1:8000אם שרת הקצה העורפי פועל ב-Compute Engine בתוך קונטיינר, והוא מקבל תנועה מסוג gRPC, אפשר לציין את שם הקונטיינר ואת היציאה, לדוגמה: --backend=grpc://my-api-container:8000
|
-N STATUS_PORT |
--status_port STATUS_PORT |
הגדרת יציאת הסטטוס (ברירת מחדל: 8090).
|
| ללא | --disable_cloud_trace_auto_sampling |
כברירת מחדל, ESP דוגם בקשה אחת מתוך כל 1,000 בקשות או בקשה אחת מתוך כל 10 שניות, ומופעל עם Cloud Trace. כדי להשבית את הדגימה האוטומטית הזו, מגדירים את הדגל הזה. עדיין אפשר להפעיל את Cloud Trace מכותרות HTTP של בקשות עם הקשר מעקב, ללא קשר לערך של הדגל הזה. מידע נוסף זמין במאמר בנושא מעקב אחר ה-API. |
-n NGINX_CONFIG |
--nginx_config NGINX_CONFIG |
מגדיר את המיקום של קובץ ההגדרות בהתאמה אישית של NGINX. אם מציינים את האפשרות הזו, ESP מאחזר את קובץ ההגדרות שצוין ואז מפעיל מיד את NGINX עם קובץ ההגדרות המותאם אישית שסופק. מידע נוסף זמין במאמר שימוש בהגדרת nginx מותאמת אישית ב-GKE. |
-k SERVICE_ACCOUNT_KEY |
--service_account_key SERVICE_ACCOUNT_KEY |
מגדיר את קובץ ה-JSON של פרטי הכניסה לחשבון השירות. אם מסופק חשבון שירות, ESP משתמש בו כדי ליצור אסימון גישה לקריאה ל-Service Infrastructure APIs. צריך לציין את האפשרות הזו רק אם ESP פועל בפלטפורמות אחרות מלבד Google Cloud, כמו מחשב מקומי, Kubernetes או ספק שירותי ענן אחר. מידע נוסף זמין במאמר יצירת חשבון שירות. |
-z HEALTHZ_PATH |
--healthz HEALTHZ_PATH |
מגדירים נקודת קצה לבדיקת תקינות באותן יציאות כמו ה-backend של האפליקציה. לדוגמה, -z healthz גורם ל-ESP להחזיר קוד 200 למיקום /healthz, במקום להעביר את הבקשה אל ה-backend. ברירת מחדל: לא בשימוש.
|
| ללא | --dns DNS_RESOLVER |
מציינים מקודד DNS. לדוגמה, --dns 169.254.169.254 משתמש בשרת המטא-נתונים של GCP כמפענח DNS. אם לא מציינים ערך, ברירת המחדל היא
8.8.8.8.
|
1 הפורטים האלה הם אופציונליים וחייבים להיות שונים זה מזה.
אם לא מציינים אפשרות יציאה, ESP מקבל חיבורים מסוג HTTP/1.x ביציאה 8080.
בחיבורי HTTPS, שרת ה-ESP מצפה שהסודות של TLS יהיו במיקומים /etc/nginx/ssl/nginx.crt ו-/etc/nginx/ssl/nginx.key.
דוגמאות להפעלות משורת הפקודה
בדוגמאות הבאות אפשר לראות איך משתמשים בחלק מארגומנטי שורת הפקודה:
כדי להפעיל את ESP לטיפול בבקשות שמגיעות ביציאת HTTP/1.x 80
וביציאת HTTPS 443 ולשלוח את הבקשות לעורף ה-API בכתובת
127.0.0.1:8000:
sudo docker run \
--detach \
DOCKER_ARGUMENTS \
gcr.io/endpoints-release/endpoints-runtime:1
--service=echo-api.endpoints.example-project-12345.cloud.goog \
--rollout_strategy=managed \
--http_port=80 \
--ssl_port=443 \
--backend=127.0.0.1:8000
כדי להפעיל את ESP עם הגדרות NGINX בהתאמה אישית באמצעות קובץ פרטי הכניסה של חשבון השירות כדי לאחזר את הגדרות השירות ולהתחבר לבקרת השירות:
sudo docker run \
--detach \
--volume=$HOME/Downloads:/esp \
DOCKER_ARGUMENTS \
gcr.io/endpoints-release/endpoints-runtime:1 \
--service=echo-api.endpoints.example-project-12345.cloud.goog \
--rollout_strategy=managed \
--service_account_key=/esp/serviceaccount.json \
--nginx_config=/esp/nginx.conf
שימו לב: כדי לטעון את קובץ ה-JSON שמכיל את המפתח הפרטי של חשבון השירות ואת קובץ ההגדרות המותאם אישית של NGINX כנפחים בתוך קונטיינר Docker של ESP, צריך להשתמש בדגלי Docker --volume או --mount. בדוגמה שלמעלה, הספרייה $HOME/Downloads במחשב המקומי ממופה לספרייה esp בקונטיינר. כששומרים את קובץ המפתח הפרטי של חשבון השירות, הוא בדרך כלל מורד לספרייה Downloads. אם רוצים, אפשר להעתיק את קובץ המפתח הפרטי לספרייה אחרת. מידע נוסף זמין במאמר בנושא ניהול נתונים ב-Docker.
הוספת תמיכה ב-CORS ל-ESP
לתיאור של אפשרויות התמיכה הזמינות ב-CORS, אפשר לעיין במאמר בנושא תמיכה ב-CORS. בקטע הזה מוסבר איך להשתמש בדגלי הפעלה של ESP כדי לתמוך ב-CORS.
כדי להפעיל תמיכה ב-CORS ב-ESP, צריך לכלול את האפשרות --cors_preset ולהגדיר אותה ל-basic או ל-cors_with_regex. כשכוללים את --cors_preset=basic או --cors_preset=cors_with_regex, ספק ה-ESP:
- מניח שלכל נתיבי המיקום יש את אותה מדיניות CORS.
- הוא מגיב גם לבקשות פשוטות וגם לבקשות קדם-הפעלה
HTTP OPTIONS. - התוצאה של בקשת ה-preflight
OPTIONSנשמרת במטמון למשך עד 20 ימים (1,728,000 שניות). הכותרות של התגובה מוגדרות לערכים הבאים:
Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization Access-Control-Expose-Headers: Content-Length,Content-Range
כדי לשנות את ערך ברירת המחדל של
Access-Control-Allow-Origin, צריך לציין אחת מהאפשרויות הבאות:
| אפשרות | תיאור |
|---|---|
--cors_allow_origin |
אפשר להשתמש בתג הזה עם --cors_preset=basic כדי להגדיר את Access-Control-Allow-Origin למוצא ספציפי.דוגמה:
--cors_preset=basic
|
--cors_allow_origin_regex |
שימוש עם --cors_preset=cors_with_regex. אפשר להשתמש בביטוי רגולרי כדי להגדיר את Access-Control-Allow-Origin.דוגמה:
--cors_preset=cors_with_regex
הביטוי הרגולרי בדוגמה הקודמת מאפשר מקור עם |
אחרי שמגדירים את --cors_preset=basic או את --cors_preset=cors_with_regex כדי להפעיל את CORS, אפשר לשנות את ערכי ברירת המחדל של כותרות התגובה האחרות על ידי ציון אחת או יותר מהאפשרויות הבאות:
| אפשרות | תיאור |
|---|---|
--cors_allow_methods |
מגדירים את Access-Control-Allow-Methods לשיטות ה-HTTP שצוינו. מציינים את ה-HTTP methods כמחרוזת, כשכל HTTP method מופרד בפסיק.דוגמה:
--cors_preset=basic
|
--cors_allow_headers |
מגדיר את
Access-Control-Allow-Headers
לכותרות ה-HTTP שצוינו. מציינים את כותרות ה-HTTP כמחרוזת, כשכל כותרת HTTP מופרדת בפסיק.דוגמה:
--cors_preset=basic
|
--cors_allow_credentials |
כולל את הכותרת Access-Control-Allow-Credentials עם הערך true בתשובות. כברירת מחדל, הכותרת Access-Control-Allow-Credentials לא נכללת בתגובות.דוגמה:
--cors_preset=basic
|
--cors_expose_headers |
מגדיר את Access-Control-Expose-Headers לכותרות שצוינו. מציינים אילו כותרות אפשר לחשוף כחלק מהתגובה כמחרוזת שבה כל כותרת מופרדת בפסיק.דוגמה:
--cors_preset=basic
|
אם אפשרויות ההפעלה של ESP CORS לא מתאימות לצרכים של האפליקציה, אפשר ליצור קובץ nginx.conf בהתאמה אישית עם תמיכת ה-CORS שהאפליקציה דורשת. מידע נוסף זמין במאמר בנושא יצירת nginx.conf בהתאמה אישית לתמיכה ב-CORS.
המאמרים הבאים
מידע על:
- פריסת ESP והקצה העורפי של ה-API ב- Google Cloud
- הפעלת ESP באופן מקומי או בפלטפורמה אחרת
- הסקריפט
start_espב-GitHub