ענן אביב - Bootstrapping

1. סקירה כללית

Spring Cloud הוא מסגרת לבניית יישומי ענן חזקים. המסגרת מאפשרת פיתוח יישומים על ידי מתן פתרונות לרבים מהבעיות הנפוצות שעומדות בפני מעבר לסביבה מבוזרת.

יישומים הפועלים עם ארכיטקטורת מיקרו-שירותים מטרתם לפשט פיתוח, פריסה ותחזוקה. האופי המפורק של האפליקציה מאפשר למפתחים להתמקד בבעיה אחת בכל פעם. ניתן להכניס שיפורים מבלי להשפיע על חלקים אחרים של המערכת.

מצד שני, אתגרים שונים מתעוררים כאשר אנו נוקטים בגישה של מיקרו-שירות:

  • תצורה חיצונית כך שהיא גמישה ואינה מצריכה בנייה מחדש של השירות בשינוי
  • גילוי שירות
  • מסתיר את מורכבות השירותים הפרוסים על מארחים שונים

במאמר זה נבנה חמש מיקרו-שירותים: שרת תצורה, שרת גילוי, שרת שער, שירות ספרים ולבסוף שירות דירוג. חמשת המיקרו-שירותים הללו מהווים יישום בסיס איתן כדי להתחיל בפיתוח ענן ולטפל באתגרים האמורים.

2. שרת תצורה

בעת פיתוח יישום ענן, נושא אחד הוא שמירה והפצה של תצורה לשירותים שלנו. אנחנו באמת לא רוצים להשקיע זמן בתצורה של כל סביבה לפני שינוי גודל האופק שלנו או להסתכן בהפרות אבטחה על ידי אפיית התצורה שלנו ליישום שלנו.

כדי לפתור זאת, נאגד את כל התצורה שלנו למאגר Git אחד ונחבר את זה ליישום אחד שמנהל תצורה עבור כל היישומים שלנו. אנו עומדים להקים יישום פשוט מאוד.

כדי ללמוד פרטים נוספים ולראות דוגמה מורכבת יותר, עיין במאמר Spring Cloud Configuration שלנו.

2.1. להכין

נווט אל //start.spring.io ובחר Maven ו- Spring Boot 2.2.x.

הגדר את החפץ כ- “config. בקטע תלות, חפש "שרת תצורה" והוסף את המודול. ואז לחץ על לִיצוֹר נוכל להוריד קובץ zip ובתוכו פרויקט מוגדר מראש ומוכן לשימוש.

לחלופין, אנו יכולים ליצור מגף אביב להקרין ולהוסיף כמה תלות לקובץ POM באופן ידני.

תלות זו תחולק בין כל הפרויקטים:

 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies Hoxton.SR4 pom import org.springframework.boot spring-boot-maven-plugin 

בואו נוסיף תלות לשרת התצורה:

 org.springframework.cloud spring-cloud-config-server 

לעיון, אנו יכולים למצוא את הגרסה האחרונה ב- Maven Central (אביב-ענן-תלות, מבחן, שרת תצורה).

2.2. אביב קונפיג

כדי לאפשר את שרת התצורה עלינו להוסיף כמה הערות למחלקת היישומים הראשית:

@SpringBootApplication @EnableConfigServer מחלקה ציבורית ConfigApplication {...}

@EnableConfigServer יהפוך את היישום שלנו לשרת תצורה.

2.3. נכסים

בואו נוסיף את application.properties ב src / main / resources:

server.port = 8081 spring.application.name = config spring.cloud.config.server.git.uri = file: // $ {user.home} / application-config

ההגדרה המשמעותית ביותר עבור שרת התצורה היא git.uri פָּרָמֶטֶר. זה מוגדר כעת לנתיב קבצים יחסי שבדרך כלל נפתר אליו c: \ Users \ {username} \ ב- Windows או / משתמשים / {username} / על * ניקס. מאפיין זה מצביע על מאגר Git שבו מאוחסנים קבצי המאפיינים עבור כל היישומים האחרים. ניתן להגדיר אותו לנתיב קבצים מוחלט במידת הצורך.

עֵצָה: במכונת חלונות הקדימו את הערך ל- "file: ///", ב- * nix ואז השתמשו ב- "file: //".

2.4. מאגר Git

נווט לתיקיה שהוגדרה על ידי spring.cloud.config.server.git.uri ולהוסיף את התיקיה הגדרת יישום. תקליטור לתיקייה ולסוג זה git init. זה יאתחל מאגר Git שבו נוכל לאחסן קבצים ולעקוב אחר השינויים שלהם.

2.5. לָרוּץ

בואו נפעיל את שרת התצורה ונוודא שהוא עובד. מסוג שורת הפקודה קפיץ אתחול mvn: לרוץ. פעולה זו תפעיל את השרת.

עלינו לראות את הפלט הזה המציין שהשרת פועל:

Tomcat התחיל ביציאות: 8081 (http)

2.6. תצורת Bootstrapping

בשרתים הבאים שלנו, אנו נרצה שנכסי היישום שלהם ינוהלו על ידי שרת תצורה זה. לשם כך, למעשה נצטרך לעשות מעט עוף וביצה: קבע תצורה של מאפיינים בכל יישום שיודעים כיצד לדבר חזרה לשרת זה.

זהו תהליך bootstrap, וכן לכל אחת מהאפליקציות האלה יהיה קובץ שנקרא bootstrap.properties. הוא יכיל מאפיינים בדיוק כמו application.properties אבל עם טוויסט:

אביב האב ApplicationContext טוען את bootstrap.properties ראשון. זה קריטי כדי ששרת Config יוכל להתחיל לנהל את המאפיינים ב- application.properties. זה המיוחד הזה ApplicationContext שיפענח גם את כל מאפייני היישום המוצפנים.

זה חכם לשמור על קבצי מאפיינים אלה מובחנים.bootstrap.properties מיועד להכנת שרת התצורה application.properties מיועד למאפיינים ספציפיים ליישום שלנו. מבחינה טכנית, עם זאת, ניתן למקם מאפייני יישומים bootstrap.properties.

לבסוף, מכיוון ש- Config Server מנהל את מאפייני היישומים שלנו, אפשר לתהות מדוע יש application.properties בכלל? התשובה היא שאלה עדיין שימושיים כערכי ברירת מחדל שאולי אין ל- Config Server.

3. גילוי

כעת, לאחר שטיפלנו בתצורה, אנו זקוקים לדרך שכל השרתים שלנו יוכלו למצוא זה את זה. נפתור בעיה זו על ידי הגדרת ה- יוריקה שרת גילוי למעלה. מכיוון שהיישומים שלנו עשויים לפעול על כל שילוב של ip / port, אנו זקוקים לרישום כתובות מרכזי שיכול לשמש כמעקב אחר כתובות יישומים.

כאשר מסופק שרת חדש הוא יתקשר עם שרת הגילוי וירשם את כתובתו כדי שאחרים יוכלו לתקשר איתו. בדרך זו יישומים אחרים יכולים לצרוך מידע זה תוך כדי בקשות.

כדי ללמוד פרטים נוספים ולראות יישום גילוי מורכב יותר, עיין במאמר Spring Cloud Eureka.

3.1. להכין

שוב ננווט אל start.spring.io. הגדר את החפץ ל"גילוי ". חפש "שרת יוריקה" והוסף תלות זו. חפש "לקוח config" והוסף תלות זו. לבסוף, צור את הפרויקט.

לחלופין, אנו יכולים ליצור מגף אביב הפרויקט, העתק את תוכן ה - POM משרת התצורה והחלף בתלות אלה:

 org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-eureka-server 

לעיון, אנו מוצאים את החבילות ב- Maven Central (config-client, שרת eureka).

3.2. אביב קונפיג

בואו נוסיף Java config למחלקה הראשית:

@SpringBootApplication @EnableEurekaServer מחלקה ציבורית DiscoveryApplication {...}

@EnableEurekaServer יגדיר שרת זה כשרת גילוי באמצעות נטוריקה יוריקה. מגף אביב יאתר אוטומטית את תלות התצורה בנתיב הכיתה ויחפש את התצורה משרת התצורה.

3.3. נכסים

כעת נוסיף שני קבצי מאפיינים:

ראשית, אנו מוסיפים bootstrap.properties לְתוֹך src / main / resources:

spring.cloud.config.name = גילוי spring.cloud.config.uri = // localhost: 8081

מאפיינים אלה יאפשרו לשרת הגילוי לשאול את שרת התצורה בעת ההפעלה.

ושנית, אנו מוסיפים discovery.properties למאגר Git שלנו

spring.application.name = גילוי שרת.פורט = 8082 eureka.instance.hostname = localhost eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka / eureka.client.register-with-eureka = שקר eureka.client. אחזור-רישום = שקר

שם הקובץ חייב להתאים ל- spring.application.name תכונה.

בנוסף אנו אומרים לשרת זה שהוא פועל באזור ברירת המחדל, זה תואם את הגדרת האזור של לקוח התצורה. אנו גם אומרים לשרת שלא להירשם למופע גילוי אחר.

בייצור, נצטרך יותר מאחד כזה לספק יתירות במקרה של כישלון והגדרה זו תהיה נכונה.

בואו נחייב את הקובץ למאגר Git. אחרת, הקובץ לא יתגלה.

3.4. הוסף תלות לשרת התצורה

הוסף תלות זו לקובץ ה- POM של שרת התצורה:

 org.springframework.cloud spring-cloud-starter-eureka 

לעיון, אנו יכולים למצוא את החבילה ב- Maven Central (לקוח יוריקה).

הוסף מאפיינים אלה ל- application.properties קובץ src / main / resources של שרת התצורה:

eureka.client.region = ברירת מחדל eureka.client.registryFetchIntervalSeconds = 5 eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

3.5. לָרוּץ

הפעל את שרת הגילוי באמצעות אותה פקודה, קפיץ אתחול mvn: לרוץ. הפלט משורת הפקודה צריך לכלול:

מאחזר תצורה מהשרת בכתובת: // localhost: 8081 ... Tomcat התחיל ביציאות: 8082 (http)

עצור והפעל מחדש את שירות התצורה. אם הכל תפוקה טובה צריכה להיראות כך:

DiscoveryClient_CONFIG / 10.1.10.235: config: 8081: רישום שירות ... Tomcat התחיל ביציאות: 8081 (http) DiscoveryClient_CONFIG / 10.1.10.235: config: 8081 - מצב רישום: 204

4. שער

כעת, לאחר שנפתרו בעיות התצורה והגילוי, עדיין יש לנו בעיה בגישה של לקוחות לכל היישומים שלנו.

אם נשאיר הכל במערכת מבוזרת, נצטרך לנהל כותרות CORS מורכבות בכדי לאפשר בקשות מקוריות ללקוחות. אנו יכולים לפתור זאת על ידי יצירת שרת שער. זה ישמש כבקשות הסעות פרוקסי הפוכות מלקוחות לשרתי הקצה האחורי שלנו.

שרת שער הוא יישום מעולה בארכיטקטורת מיקרו-שירותים מכיוון שהוא מאפשר לכל התגובות שמקורן ממארח ​​אחד. זה יבטל את הצורך ב- CORS וייתן לנו מקום נוח לטפל בבעיות נפוצות כמו אימות.

4.1. להכין

עד עכשיו אנו מכירים את התרגיל. נווט אל //start.spring.io. הגדר את החפץ ל"שער ". חפש "צוול" והוסף את התלות הזו. חפש "לקוח config" והוסף תלות זו. חפש "גילוי יוריקה" והוסף תלות זו. לבסוף, צור את הפרויקט.

לחלופין, נוכל ליצור מגף אביב אפליקציה עם תלות אלה:

 org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter-zuul 

לעיון, אנו יכולים למצוא את החבילה ב- Maven Central (config-client, eureka-client, zuul).

4.2. אביב קונפיג

בואו נוסיף את התצורה למחלקה הראשית:

@SpringBootApplication @EnableZuulProxy @EnableEurekaClient public class GatewayApplication {...}

4.3. נכסים

כעת נוסיף שני קבצי מאפיינים:

bootstrap.properties ב src / main / resources:

spring.cloud.config.name = gateway spring.cloud.config.discovery.service-id = config spring.cloud.config.discovery.enabled = true eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

gateway.properties במאגר Git שלנו

spring.application.name = server server.port = 8080 eureka.client.region = ברירת מחדל eureka.client.registryFetchIntervalSeconds = 5 zuul.routes.book-service.path = / book-service / ** zuul.routes.book-service .sensitive-headers = Set-Cookie, Authorization hystrix.command.book-service.execution.isolation.thread.timeoutInMilliseconds = 600000 zuul.routes.rating-service.path = / rating-service / ** zuul.routes.rating- service.sensitive-headers = Set-Cookie, Authorization hystrix.command.rating-service.execution.isolation.thread.timeoutInMilliseconds = 600000 zuul.routes.discovery.path = / discovery / ** zuul.routes.discovery. headers רגישים = Set-Cookie, Authorization zuul.routes.discovery.url = // localhost: 8082 hystrix.command.discovery.execution.isolation.thread.timeoutInMilliseconds = 600000

ה zuul.routes המאפיין מאפשר לנו להגדיר יישום לניתוב בקשות מסוימות על בסיס התאמת כתובת אתר לנמלים. הנכס שלנו אומר לזול לנתב כל בקשה שתגיע / שירות ספרים / ** ליישום עם spring.application.name שֶׁל שירות ספרים. לאחר מכן Zuul יחפש את המארח משרת הגילוי באמצעות שם היישום ויעביר את הבקשה לשרת זה.

זכור לבצע את השינויים במאגר!

4.4. לָרוּץ

הפעל את יישומי התצורה והגילוי והמתין עד שיישום התצורה נרשם בשרת הגילוי. אם הם כבר פועלים, אנחנו לא צריכים להפעיל אותם מחדש. לאחר השלמת זה, הפעל את שרת השער. שרת השער אמור להתחיל ביציאה 8080 ולהירשם בעצמו לשרת הגילוי. הפלט מהקונסולה צריך להכיל:

אחזור תצורה מהשרת בכתובת: //10.1.10.235:8081/ ... DiscoveryClient_GATEWAY / 10.1.10.235: שער: 8080: הרשמת שירות ... DiscoveryClient_GATEWAY / 10.1.10.235: שער: 8080 - מצב רישום: 204 Tomcat התחיל ביציאה (ים): 8080 (http)

טעות אחת שקל לבצע היא להפעיל את השרת לפני ששרת התצורה נרשם ביוריקה. במקרה זה נראה יומן עם פלט זה:

אחזור תצורה מהשרת בכתובת: // localhost: 8888

זוהי כתובת האתר והיציאה המוגדרים כברירת מחדל עבור שרת תצורה ומציין שלשירות הגילוי שלנו לא הייתה כתובת בעת בקשת התצורה. רק המתן מספר שניות ונסה שוב, לאחר ששרת התצורה נרשם ביוריקה, הבעיה תיפתר.

5. שירות ספרים

בארכיטקטורת המיקרו-שירותים, אנו רשאים לייצר כמה שיותר יישומים כדי לעמוד ביעד העסקי. לעתים קרובות מהנדסים יחלקו את שירותיהם לפי תחומים. אנו נעקוב אחר דפוס זה וניצור שירות ספרים לטיפול בכל פעולות הספרים ביישום שלנו.

5.1. להכין

עוד פעם אחת. נווט אל //start.spring.io. הגדר את החפץ ל"שירות ספרים ". חפש "אינטרנט" והוסף את התלות הזו. חפש "לקוח config" והוסף תלות זו. חפש "גילוי יוריקה" והוסף תלות זו. צור את הפרויקט הזה.

לחלופין, הוסף תלות אלה לפרויקט:

 org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web 

לעיון, אנו יכולים למצוא את החבילה ב- Maven Central (config-client, eureka-client, web).

5.2. אביב קונפיג

בואו לשנות את המעמד העיקרי שלנו:

@SpringBootApplication @EnableEurekaClient @ RestController @RequestMapping ("/ books") BookServiceApplication ציבורי {public public static void (String [] args) {SpringApplication.run (BookServiceApplication.class, args); } רשימת ספרים פרטית רשימה = Arrays.asList (ספר חדש (1 ליטר, "באלדונג הולך לשוק", "טים שימנדל"), ספר חדש (2 ליטר, "באלדונג הולך לפארק", "סלביסה")); @GetMapping ("") רשימה ציבורית findAllBooks () {return bookList; } @GetMapping ("/ {bookId}") findbook ספר ציבורי (@PathVariable Long bookId) {return bookList.stream (). Filter (b -> b.getId (). שווה ל- (bookId)). FindFirst (). OrElse (ריק); }}

הוספנו גם בקר REST ושדה שקבע קובץ המאפיינים שלנו כדי להחזיר ערך שנקבע במהלך התצורה.

בואו כעת נוסיף את הספר POJO:

ספר בכיתה ציבורית {פרטי מזהה ארוך; סופר מחרוזת פרטי; כותרת מחרוזת פרטית; // סטרים וקובעים סטנדרטיים}

5.3. נכסים

עכשיו אנחנו רק צריכים להוסיף את שני קבצי המאפיינים שלנו:

bootstrap.properties ב src / main / resources:

spring.cloud.config.name = book-service spring.cloud.config.discovery.service-id = config spring.cloud.config.discovery.enabled = true eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

book-service.properties במאגר Git שלנו:

spring.application.name = server-book server.port = 8083 eureka.client.region = ברירת מחדל eureka.client.registryFetchIntervalSeconds = 5 eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

בואו נעשה את השינויים במאגר.

5.4. לָרוּץ

לאחר שכל היישומים האחרים התחילו אנו יכולים להתחיל את שירות הספרים. פלט המסוף צריך להיראות כך:

DiscoveryClient_BOOK-SERVICE / 10.1.10.235: שירות ספרים: 8083: רישום שירות ... DiscoveryClient_BOOK-SERVICE / 10.1.10.235: שירות ספרים: 8083 - מצב רישום: 204 Tomcat התחיל ביציאות: 8083 (http)

לאחר סיום אנו יכולים להשתמש בדפדפן שלנו כדי לגשת לנקודת הקצה שיצרנו זה עתה. נווט אל // localhost: 8080 / book-service / books ואנחנו מקבלים בחזרה אובייקט JSON עם שני ספרים שהוספנו בבקר החוצה. שימו לב שאיננו ניגשים ישירות לשירות הספרים ביציאה 8083 אך אנו עוברים דרך שרת השער.

6. שירות דירוג

בדומה לשירות הספרים שלנו, גם שירות הדירוג שלנו יהיה שירות מונחה תחום אשר יטפל בפעולות הקשורות לדירוגים.

6.1. להכין

עוד פעם אחת. נווט אל //start.spring.io. הגדר את החפץ ל"שירות דירוג ". חפש "אינטרנט" והוסף את התלות הזו. חפש "לקוח config" והוסף תלות זו. לחפש אחר תגלית יוריקה ולהוסיף את התלות הזו. לאחר מכן, צור את הפרויקט הזה.

לחלופין, הוסף תלות אלה לפרויקט:

 org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web 

לעיון, אנו יכולים למצוא את החבילה ב- Maven Central (config-client, eureka-client, web).

6.2. אביב קונפיג

בואו לשנות את המעמד העיקרי שלנו:

@SpringBootApplication @EnableEurekaClient @ RestController @RequestMapping ("/ ratings") class class RatingServiceApplication {public static void main (String [] args) {SpringApplication.run (RatingServiceApplication.class, args); } דירוג רשימה רשימה פרטי = Arrays.asList (דירוג חדש (1 ליטר, 1 ליטר, 2), דירוג חדש (2 ליטר, 1 ליטר, 3), דירוג חדש (3 ליטר, 2 ליטר, 4), דירוג חדש (4 ליטר, 2 ליטר, 5)); @GetMapping ("") רשימה ציבורית findRatingsByBookId (@RequestParam Long bookId) bookId.equals (0L)? Collections.EMPTY_LIST: ratingList.stream (). Filter (r -> r.getBookId (). Equals (bookId)). Collect (Collectors.toList ()); @GetMapping ("/ all") רשימה ציבורית findAllRatings () {return ratingList; }}

הוספנו גם בקר REST ושדה שקבע קובץ המאפיינים שלנו כדי להחזיר ערך שנקבע במהלך התצורה.

בואו נוסיף את הדירוג POJO:

דירוג בכיתה ציבורית {פרטי מזהה ארוך; פרטי Long bookId; כוכבי אינטר פרטיים; // סטרים וקובעים סטנדרטיים}

6.3. נכסים

עכשיו אנחנו רק צריכים להוסיף את שני קבצי המאפיינים שלנו:

bootstrap.properties ב src / main / resources:

spring.cloud.config.name = service-service spring.cloud.config.discovery.service-id = config spring.cloud.config.discovery.enabled = true eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

דירוג-service.properties במאגר Git שלנו:

spring.application.name = שרת דירוג שירות.פורט = 8084 eureka.client.region = ברירת מחדל eureka.client.registryFetchIntervalSeconds = 5 eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

בואו נעשה את השינויים במאגר.

6.4. לָרוּץ

לאחר שכל שאר היישומים התחילו נוכל להתחיל את שירות הדירוג. פלט המסוף צריך להיראות כך:

DiscoveryClient_RATING-SERVICE / 10.1.10.235: דירוג-שירות: 8083: רישום שירות ... DiscoveryClient_RATING-SERVICE / 10.1.10.235: דירוג-שירות: 8083 - מצב רישום: 204 Tomcat התחיל ביציאות: 8084 (http)

לאחר סיום אנו יכולים להשתמש בדפדפן שלנו כדי לגשת לנקודת הקצה שיצרנו זה עתה. נווט אל // localhost: 8080 / דירוג-שירות / רייטינג / הכל ואנחנו מחזירים את JSON המכיל את כל הדירוגים שלנו. שימו לב שאנחנו לא ניגשים ישירות לשירות הדירוג ביציאה 8084 אבל אנחנו עוברים דרך שרת השער.

7. מסקנה

כעת אנו מסוגלים לחבר את החלקים השונים של Spring Cloud ליישום מיקרו-שירות מתפקד. זה מהווה בסיס שנוכל להשתמש בו כדי להתחיל בבניית יישומים מורכבים יותר.

כמו תמיד, אנו יכולים למצוא את קוד המקור הזה ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found