שקעי רשת תגובתי עם קפיץ 5

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

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

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

Spring Framework 5 פיתחה תמיכה ב- WebSockets במסגרת, והוסיפה יכולות תגובתיות לערוץ התקשורת הזה.

אנו יכולים למצוא מידע נוסף על Spring WebFlux כאן.

2. תלות Maven

אנו נשתמש בתלות האביב-אתחול-האביב לשילוב האביב-אתחול והזרמת האביב-אתחול-הזרם, הזמינה כעת ב- Spring Milestone Repository.

בדוגמה זו אנו משתמשים בגרסה האחרונה הזמינה 2.0.0.M7, אך תמיד צריך לקבל את הגרסה האחרונה הזמינה במאגר Maven:

 org.springframework.boot spring-boot-starter-integration org.springframework.boot spring-boot-starter-webflux 

3. תצורת WebSocket באביב

התצורה שלנו די פשוטה: נזריק את WebSocketHandler לטיפול בפגישת השקע ביישום Spring WebSocket שלנו.

@Autowired פרטי WebSocketHandler webSocketHandler; 

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

@Bean הציבור HandlerMapping webSocketHandlerMapping () {מפה מפה = HashMap חדש (); map.put ("/ emitter emitter", webSocketHandler); SimpleUrlHandlerMapping handlerMapping = חדש SimpleUrlHandlerMapping (); handlerMapping.setOrder (1); handlerMapping.setUrlMap (מפה); החזר handlerMapping; }

כתובת האתר שאליה אנו יכולים להתחבר תהיה: ws: // localhost: / emitter emitter.

4. טיפול בהודעות WebSocket באביב

שֶׁלָנוּ תגובתי WebSocketHandler class יהיה אחראי על ניהול ההפעלה WebSocket בצד השרת.

זה מיישם את WebSocketHandler ממשק כדי שנוכל לעקוף את ידית שיטה, אשר תשמש לשליחת ההודעה ללקוח WebSocket:

@Component בכיתה ציבורית ReactiveWebSocketHandler מיישם את WebSocketHandler {// שדות פרטיים ... @Override ידית מונו ציבורית (WebSocketSession webSocketSession) {להחזיר webSocketSession.send (intervalFlux .map (webSocketSession :: textMessage)). וגם (webSocketSession.receive (). (WebSocketMessage :: getPayloadAsText) .log ()); }}

5. יצירת לקוח WebSocket תגובתי פשוט

בואו ניצור כעת לקוח WebSocket תגובתי באביב אשר יוכל להתחבר ולהחליף מידע עם שרת ה- WebSocket שלנו.

5.1. תלות של Maven

ראשית, התלות של Maven.

 org.springframework.boot spring-boot-starter-webflux 

כאן אנו משתמשים באותו spring-boot-starter-webflux ששימש בעבר להגדרת יישום שרת WebSocket תגובתי שלנו.

5.2. לקוח WebSocket

עכשיו, בואו ניצור את ReactiveClientWebSocket בכיתה, האחראי על התחלת התקשורת עם השרת:

מחלקה ציבורית ReactiveJavaClientWebSocket {main public public static (String [] args) זורק InterruptedException {WebSocketClient client = new ReactorNettyWebSocketClient (); client.execute (URI.create ("ws: // localhost: 8080 / emitter emitter"), session -> session.send (Mono.just (session.textMessage ("event-spring-reactive-client-websocket") )) .thenMany (session.receive () .map (WebSocketMessage :: getPayloadAsText) .log ()) .then ()) .block (Duration.ofSeconds (10L)); }}

בקוד לעיל אנו יכולים לראות שאנחנו משתמשים ב- ReactorNettyWebSocketClient, שהוא ה WebSocketClient יישום לשימוש עם הכור Netty.

בנוסף, הלקוח מתחבר לשרת WebSocket דרך ה- URL ws: // localhost: 8080 / emitter emitter, הקמת הפעלה ברגע שהיא מחוברת לשרת.

אנו יכולים גם לראות שאנחנו שולחים הודעה לשרת ("אירוע-אביב-תגובתי-לקוח-רשת“) יחד עם בקשת החיבור.

יתר על כן, השיטה לִשְׁלוֹחַ מופעל, מצפה כפרמטר למשתנה מסוג מוֹצִיא לָאוֹר, שבמקרה שלנו שלנו מוֹצִיא לָאוֹר הוא מונו ו ט הוא מחרוזת פשוטה "אירוע-ממני-תגובתי-Java-client-webocket“.

יתר על כן, ה אז רבים (...) שיטה המצפה א שֶׁטֶף מהסוג חוּט מופעלת. ה לְקַבֵּל() השיטה מקבלת שטף של הודעות נכנסות, אשר מאוחר יותר מומרות למחרוזות.

סוף - סוף, ה לַחסוֹם() השיטה מאלצת את הלקוח להתנתק מהשרת לאחר הזמן הנתון (10 שניות בדוגמה שלנו).

5.3. הפעלת הלקוח

כדי להריץ אותו, וודא ששרת WebSocket התגובה פועל. ואז, הפעל את תגובתי JavaClientWebSocket בכיתה, ואנחנו יכולים לראות ב sysout רשום את האירועים הנפלטים:

[reactor-http-nio-4] reactor.Flux.Map.1 - onNext ({"eventId": "6042b94f-fd02-47a1-911d-dacf97f12ba6", "eventDt": "2018-01-11T23: 29: 26.900 "})

אנו יכולים גם לראות ביומן משרת WebSocket התגובה שלנו את ההודעה שנשלחה על ידי הלקוח במהלך ניסיון החיבור:

[reactor-http-nio-2] reactor.Flux.Map.1: onNext (event-me-from-reactive-java-client)

כמו כן, אנו יכולים לראות את המסר של הופסק החיבור לאחר שהלקוח סיים את בקשותיו (במקרה שלנו, לאחר 10 השניות):

[reactor-http-nio-2] reactor.Flux.Map.1: onComplete ()

6. יצירת לקוח WebSocket לדפדפן

בואו ניצור לקוח HTML / Javascript פשוט WebSocket כדי לצרוך את יישום השרת תגובתי שלנו.

 var clientWebSocket = WebSocket חדש ("ws: // localhost: 8080 / emitter emitter"); clientWebSocket.onopen = פונקציה () {console.log ("clientWebSocket.onopen", clientWebSocket); console.log ("clientWebSocket.readyState", "websocketstatus"); clientWebSocket.send ("אירוע-לי-מהדפדפן"); } clientWebSocket.onclose = פונקציה (שגיאה) {console.log ("clientWebSocket.onclose", clientWebSocket, שגיאה); אירועים ("חיבור סוגר"); } clientWebSocket.onerror = פונקציה (שגיאה) {console.log ("clientWebSocket.onerror", clientWebSocket, שגיאה); אירועים ("אירעה שגיאה"); } clientWebSocket.onmessage = פונקציה (שגיאה) {console.log ("clientWebSocket.onmessage", clientWebSocket, שגיאה); אירועים (error.data); } אירועי פונקציה (responseEvent) {document.querySelector (". events"). innerHTML + = responseEvent + "

"; }

כאשר שרת WebSocket פועל, פותח קובץ HTML זה בדפדפן (למשל: Chrome, Internet Explorer, Mozilla Firefox וכו '), עלינו לראות את האירועים המודפסים על המסך, עם עיכוב של שנייה אחת לכל אירוע, כהגדרתו שרת ה- WebSocket שלנו.

{"eventId": "c25975de-6775-4b0b-b974-b396847878e6", "eventDt": "2018-01-11T23: 56: 09.780"} {"eventId": "ac74170b-1f71-49d3-8737-b3f9a8a352f9", "eventDt": "2018-01-11T23: 56: 09.781"} {"eventId": "40d8f305-f252-4c14-86d7-ed134d3e10c6", "eventDt": "2018-01-11T23: 56: 09.782"}

7. מסקנה

כאן הצגנו דוגמה כיצד ליצור תקשורת WebSocket בין שרת ללקוח באמצעות Spring 5 Framework, תוך יישום התכונות התגובות החדשות שמספק Spring Webflux.

כמו תמיד, ניתן למצוא את הדוגמה המלאה במאגר GitHub שלנו.


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