REST vs WebSockets
1. Áttekintés
Ebben az oktatóanyagban áttekintjük az ügyfél-szerver kommunikáció alapjait, és ezt a ma elérhető két népszerű lehetőség segítségével vizsgáljuk meg. Meglátjuk, hogy az új belépő WebSocket hogyan áll szemben a RESTful HTTP népszerűbb választásával.
2. A hálózati kommunikáció alapjai
Mielőtt elmélyülnénk a különféle lehetőségek részleteiben, valamint azok előnyeiben és hátrányaiban, frissítsük gyorsan a hálózati kommunikáció táját. Ez segít a dolgok perspektívába helyezésében és ennek jobb megértésében.
A hálózati kommunikáció leginkább az Open Systems Interconnection (OSI) modell alapján érthető meg.
Az OSI modell az absztrakció hét rétegére osztja fel a kommunikációs rendszert:
A modell tetején található az Alkalmazás réteg, amely érdekel minket ebben az oktatóanyagban. A WebSocket és a RESTful HTTP összehasonlításakor azonban néhány szempontot a négy legfelső rétegben tárgyalunk.
Az alkalmazásréteg a legközelebb van a végfelhasználóhoz, és felelős a kommunikációban részt vevő alkalmazásokkal való interakcióért. Számos népszerű protokoll létezik ebben a rétegben, például FTP, SMTP, SNMP, HTTP és WebSocket.
3. A WebSocket és a RESTful HTTP leírása
Bár a kommunikáció bármennyi rendszer között megtörténhet, minket különösen az ügyfél-szerver kommunikáció érdekel. Pontosabban a webböngésző és a webszerver közötti kommunikációra fogunk összpontosítani. Ezt a keretet fogjuk használni a WebSocket és a RESTful HTTP összehasonlításához.
De mielőtt tovább haladnánk, miért ne érthetné meg gyorsan, hogy mik azok!
3.1. WebSockets
A hivatalos meghatározás szerint A WebSocket egy kommunikációs protokoll, amely kétirányú, teljes duplex kommunikációt tartalmaz tartós TCP kapcsolaton keresztül. Most részletesen meg fogjuk érteni a kijelentés egyes részeit.
A WebSocket-et 2011-ben az IETF RFC 6455 néven szabványosította kommunikációs protokollként. A legtöbb modern webböngésző ma támogatja a WebSocket protokollt.
3.2. RESTful HTTP
Noha mindannyian tisztában vagyunk a HTTP-vel, mivel mindenütt jelen van az interneten, egyúttal egy alkalmazási réteg kommunikációs protokoll is. A HTTP egy kérés-válasz alapú protokoll, megint jobban megértjük ezt később az oktatóanyagban.
A REST (reprezentatív állapotátvitel) olyan építészeti stílus, amely korlátozásokat állít a HTTP-re webszolgáltatások létrehozására.
4. WebSocket alprotokoll
Míg a WebSocket protokollt határoz meg az ügyfél és a szerver közötti kétirányú kommunikációhoz, nem tesz semmilyen feltételt a kicserélendő üzenetre. Ez nyitva marad a kommunikációban részt vevő felek számára, hogy megállapodjanak az alprotokoll-tárgyalások részeként.
Nem kényelmes alprotokoll kifejlesztése nem triviális alkalmazásokhoz. Szerencsére, sok népszerű alprotokoll használható, mint a STOMP. A STOMP az egyszerű szövegorientált üzenetküldési protokollt jelenti, és a WebSocketen keresztül működik. A Spring Boot első osztályú támogatást nyújt a STOMP számára, amelyet ki fogunk használni a bemutatónkban.
5. Gyors beállítás a tavaszi indításkor
Nincs annál jobb, mint egy működő példát látni. Tehát egyszerű használati eseteket építünk fel a WebSocket-ben és a RESTful HTTP-ben is, hogy tovább vizsgáljuk őket, majd összehasonlítsuk őket. Hozzunk létre egy egyszerű kiszolgáló és kliens komponenst mindkettőhöz.
Létrehozunk egy egyszerű klienst a JavaScript használatával, amely nevet küld. És létrehozunk egy szervert a Java segítségével, amely üdvözlettel válaszol.
5.1. WebSocket
A WebSocket Spring Boot használatához szükségünk lesz a megfelelő indítóra:
org.springframework.boot spring-boot-starter-websocket
Most konfiguráljuk a STOMP végpontokat:
@Configuration @EnableWebSocketMessageBroker nyilvános osztály WebSocketMessageBrokerConfig valósítja meg a WebSocketMessageBrokerConfigurer {@Override public void registerStompEndpoints (StompEndpointRegistry registry) {register.addEndpoint ("/ ws"); } @Orride public void configureMessageBroker (MessageBrokerRegistry config) {config.setApplicationDestinationPrefixes ("/ app"); config.enableSimpleBroker ("/ topic"); }}
Határozzunk meg gyorsan egy egyszerű WebSocket kiszolgálót, amely elfogad egy nevet és üdvözlettel válaszol:
@Controller nyilvános osztály WebSocketController {@MessageMapping ("/ hello") @SendTo ("/ topic / greetings") nyilvános üdvözlő üdvözlet (Üzenet) dobja a Kivételt {return new Greeting ("Hello, + HtmlUtils.htmlEscape (message.getName) ()) + "!"); }}
Végül hozzuk létre az ügyfelet, hogy kommunikáljon ezzel a WebSocket szerverrel. Mivel a böngésző-szerver kommunikációra helyezzük a hangsúlyt, hozzunk létre egy klienst JavaScript-ben:
var stompClient = null; function connect () {stompClient = Stomp.client ('ws: // localhost: 8080 / ws'); stompClient.connect ({}, function (frame) {stompClient.subscribe ('/ topic / greetings', function (response) {showGreeting (JSON.parse (response.body) .content);});}); } function sendName () {stompClient.send ("/ app / hello", {}, JSON.stringify ({'név': $ ("# név"). val ()})); } function showGreeting (message) {$ ("# greetings"). append (""+ üzenet +" "); }
Ezzel befejeződött a WebSocket szerver és kliens működő példája. A kódtárban található egy HTML oldal, amely egyszerű felhasználói felületet biztosít a kommunikációhoz.
Míg ez csak megkarcolja a felületet, a Spring szoftverrel ellátott WebSocket összetett csevegőprogramok és egyebek létrehozására használható.
5.2. RESTful HTTP
Most át fogunk menni egy hasonló beállításon a RESTful szolgáltatáshoz. Egyszerű webes szolgáltatásunk elfogad egy névvel ellátott GET kérést, és üdvözlettel válaszol.
Használjuk ezúttal a Spring Boot webes indítóját:
org.springframework.boot spring-boot-starter-web
Most meghatározzunk egy REST végpontot, amely kihasználja a tavasszal elérhető, hatékony kommentálási támogatást:
@RestController @RequestMapping (path = "/ rest") public class RestAPIController {@GetMapping (path = "/ {name}", tuottaa = "application / json") public String getGreeting (@PathVariable ("name") String name) {return "{\" üdvözlet \ ": \" Hello, "+ név +"! \ "}"; }}
Végül hozzunk létre egy klienst JavaScript-ben:
var request = új XMLHttpRequest () függvény sendName () {request.open ('GET', '// localhost: 8080 / rest /' + $ ("# name"). val (), true) request.onload = function () {var data = JSON.parse (this.response) showGreeting (data.greeting)} request.send ()} function showGreeting (message) {$ ("# greetings"). append (""+ üzenet +" "); }
Nagyjából ennyi! Ismét van egy HTML oldal a kódtárban, amely a felhasználói felülettel működik.
Bár az egyszerűségében mélyreható, a gyártási fokozatú REST API meghatározása sokkal kiterjedtebb feladat lehet!
6. A WebSocket és a RESTful HTTP összehasonlítása
A WebSocket és a RESTful HTTP minimális, de működőképes példáinak létrehozása után készen állunk megérteni, hogy állnak egymással. Ezt a következő alszakaszokban több szempont alapján megvizsgáljuk.
Fontos megjegyezni, hogy bár közvetlenül összehasonlíthatjuk a HTTP-t és a WebSocket-et, mivel mindkettő alkalmazásréteg-protokoll, nem természetes a REST és a WebSocket összehasonlítása. Mint korábban láttuk, a REST egy építészeti stílus, amely a HTTP-t használja a kommunikációhoz.
Ennélfogva a WebSocket-hez való összehasonlításunk többnyire a HTTP képességeire vagy azok hiányára vonatkozik.
6.1. URL-séma
URL meghatározza a webes erőforrás egyedi helyét és a lekérés mechanizmusát. Az ügyfél-szerver kommunikáció során gyakran statikus vagy dinamikus erőforrásokra törekszünk a hozzájuk tartozó URL-en keresztül.
Mindannyian ismerjük a HTTP URL sémát:
// localhost: 8080 / rest
A WebSocket URL-sémája sem sokban különbözik:
ws: // localhost: 8080 / ws
Először úgy tűnik, hogy az egyetlen különbség a kettőspont előtti karakterek között van, de sokat elvont, ami a motorháztető alatt történik. Fedezzük tovább.
6.2. Kézfogás
Kézfogása kommunikációs felek közötti kommunikációs protokoll tárgyalásának automatikus módjára utal. A HTTP hontalan protokoll, és egy kérés-válasz mechanizmusban működik. Minden HTTP-kéréskor TCP-kapcsolat jön létre a szerverrel a foglalaton keresztül.
Ezután az ügyfél megvárja, amíg a kiszolgáló válaszol az erőforrással vagy hibával. A kliens következő kérése mindent megismétel, mintha az előző kérés soha nem történt volna meg:
A WebSocket nagyon másképp működik, mint a HTTP, és kézfogással kezdődik a tényleges kommunikáció előtt.
Nézzük meg, mi foglal magában egy WebSocket kézfogást:
WebSocket esetén, az ügyfél kezdeményez egy protokoll kézfogási kérést HTTP-ben, majd megvárja, amíg a kiszolgáló válaszol a WebSocket HTTP-frissítésének elfogadására.
Természetesen, mivel a Protocol Handshake HTTP-n keresztül történik, az előző diagram sorrendjét követi. De miután a kapcsolat létrejött, onnan az ügyfél és a szerver átáll a WebSocketre a további kommunikáció érdekében.
6.3. Kapcsolat
Amint azt az előző alfejezetben láthattuk, a WebSocket és a HTTP között egy nagy különbség az, hogy a WebSocket tartós TCP kapcsolaton működik, míg a HTTP minden kéréshez új TCP kapcsolatot hoz létre.
Nyilvánvaló, hogy minden kéréshez új TCP-kapcsolat létrehozása nem túl teljesítő, és a HTTP nem tudott erről. Valójában a HTTP / 1.1 részeként állandó kapcsolatokat vezettek be a HTTP ezen hiányosságainak enyhítésére.
Mindazonáltal, A WebSocket-et az alapoktól kezdve úgy tervezték, hogy állandó TCP-kapcsolatokkal működjön.
6.4. Kommunikáció
A WebSocket előnye a HTTP-vel szemben egy speciális forgatókönyv, amely abból adódik, hogy az ügyfél képes a szerver olyan módon kommunikálni, amely nem volt lehetséges a régi jó HTTP-vel.
Például a HTTP-ben általában az ügyfél küldi el a kérést, majd a szerver a kért adatokkal válaszol. A szervernek nincs általános módja annak, hogy egyedül kommunikáljon az ügyféllel. Természetesen mintákat és megoldásokat dolgoztak ki ennek megkerülésére, mint például a Server-Sent Events (SSE), de ezek nem voltak teljesen természetesek.
A WebSocket segítségével a tartós TCP kommunikáción dolgozik, lehetséges, hogy a szerver és az ügyfél egyaránt egymástól függetlenül küld adatokat, sőt, sok kommunikáló félnek! Ezt kétirányú kommunikációnak nevezzük.
A másik érdekes tulajdonsága A WebSocket kommunikációja az, hogy full-duplex. Bár ez a kifejezés ezoterikusnak tűnhet; egyszerűen azt jelenti mind a szerver, mind az ügyfél egyszerre küldhet adatokat. Hasonlítsa össze ezt azzal, ami a HTTP-ben történik, amikor a kiszolgálónak meg kell várnia, amíg megkapja a kérést teljes egészében, mielőtt adattal válaszolhatna.
Bár a kétirányú és a teljes duplex kommunikáció előnye nem feltétlenül nyilvánvaló azonnal. látni fogunk néhány olyan felhasználási esetet, ahol valódi erőt szabadítanak fel.
6.5. Biztonság
Végül, de nem utolsó sorban, mind a HTTP, mind a WebSocket kihasználja a TLS előnyeit a biztonság érdekében. Míg a HTTP kínál https ennek használatához az URL-sémájuk részeként a WebSocket rendelkezik wss URL-séma részeként ugyanarra a hatásra.
Tehát az előző alszakasz URL-jeinek biztonságos verziójának a következőképpen kell kinéznie:
// localhost: 443 / rest wss: // localhost: 443 / ws
A RESTful szolgáltatás vagy a WebSocket kommunikáció biztosítása nagyon mély témakör, és itt nem tárgyalható. Most mondjuk el, hogy e tekintetben mindkettőt megfelelően támogatják.
6.6. Teljesítmény
Meg kell értenünk, hogy a WebSocket egy állapotprotokoll, ahol a kommunikáció dedikált TCP-kapcsolaton keresztül történik. Másrészt a HTTP eleve hontalan protokoll. Ez hatással van arra, hogy ezek hogyan fognak teljesíteni a terheléssel, de ez valóban a használati esettől függ.
Mivel a WebSocket-en keresztüli kommunikáció újrafelhasználható TCP-kapcsolaton keresztül történik, az üzenetenkénti általános költség alacsonyabb a HTTP-vel összehasonlítva. Így kiszolgálónként nagyobb átviteli sebességet érhet el. De van egy korlát, amelyig egyetlen szerver képes skálázni, és itt vannak a WebSocket problémái. Nem könnyű vízszintesen méretezni az alkalmazásokat a WebSockets segítségével.
Itt ragyog a HTTP. A HTTP használatával minden új kérés bármilyen szerverre érkezhet. Ez azt jelenti, hogy az általános átviteli sebesség növelése érdekében könnyen hozzáadhatunk további szervereket. Ennek valószínűleg nincs hatása a HTTP-vel futó alkalmazásra.
Nyilvánvaló, hogy egy alkalmazásnak szüksége lehet állapot- és munkamenet-tapadásra, ami megkönnyíti a megmondást, mint a megcsinálást.
7. Hol használjuk őket?
Most már láttunk elegendő mennyiségű RESTful szolgáltatást a HTTP-n keresztül és az egyszerű kommunikációt a WebSocketen keresztül, hogy véleményt alkothassunk róluk. De hol használjunk mit?
Fontos megjegyezni, hogy bár a WebSocket a HTTP hiányosságaiból derült ki, valójában nem a HTTP helyettesítője. Tehát mindkettőjüknek megvan a maga helye és felhasználása. Gyorsan megértsük, hogyan hozhatunk döntést.
A forgatókönyv nagy részében ahol alkalmi kommunikációra van szükség a szerverrel, például az alkalmazottak nyilvántartásának megszerzéséhez, akkor is ésszerű a REST szolgáltatást HTTP / S-n keresztül használni. De az olyan újabb kliensoldali alkalmazásokhoz, mint a részvényárfolyam-alkalmazások, amelyek valós idejű frissítéseket igényelnek a szervertől, nagyon kényelmes a WebSocket kihasználása.
Általánosító, A WebSocket alkalmasabb azokra az esetekre, amikor a push-alapú és valós idejű kommunikáció jobban meghatározza a követelményt. Ezenkívül A WebSocket jól működik olyan esetekben, amikor egy üzenetet egyszerre több ügyfélnek kell elküldeni. Ezek azok az esetek, amikor a kliens és a szerver kommunikációja a RESTful szolgáltatásokon keresztül nehézkes, ha nem is tiltó.
Ennek ellenére a WebSocket és a RESTful szolgáltatások HTTP-n keresztül történő használatát a követelményekből kell levonni. Minthogy nincsenek ezüst golyók, nem várhatjuk el, hogy minden problémát megoldunk. Ezért a hatékony kommunikációs modell megtervezéséhez bölcsességünket és tudásunkat együtt kell felhasználnunk.
8. Következtetés
Ebben az oktatóanyagban áttekintettük a hálózati kommunikáció alapjait, különös hangsúlyt fektetve a HTTP és a WebSocket alkalmazásréteg-protokollokra. Láttunk néhány gyors bemutatást a WebSocket-ről és a RESTful API-ról HTTP-n keresztül a Spring Boot-ban.
Végül összehasonlítottuk a HTTP és a WebSocket protokollok jellemzőit, és röviden megbeszéltük, hogy mikor kell használni őket.
Mint mindig, a példák kódja elérhető a GitHub oldalon.