websocket avec java ee 7

Post on 20-Jan-2017

642 Views

Category:

Technology

7 Downloads

Preview:

Click to see full reader

TRANSCRIPT

WebSocket avec Java EE 7

Florian Beaufumé09/2015

Florian Beaufumé• Architecte logiciel• Spécialisé en Java et web

• Freelance

• florian.beaufume@adeliosys.fr• www.adeliosys.fr• www.linkedin.com/in/fbeaufume

• Protocole

• Outils

• API JavaScript du W3C

• API Java de Java EE 7

• Retour d'expérience

Sommaire

Protocole

Protocoles web

WebSocket

HTTPSPDY

AJAXComet

HTTP/2

SSE

Full-duplex for the web

• HTTP 1.0 :• Sur TCP• Requête-réponse avec fermeture de connexion

• HTTP 1.1 :• Keep-alive

• AJAX :• Requêtes asynchrones• HTML ou data

Historique

• Short polling :• Requêtes périodiques courtes sur le serveur

• Comet :• Long polling :

• Requêtes sur le serveur qui bloquent en attente de réponse• Streaming :

• Requête longue sur le serveur avec plusieurs contenus retournés

• Limitations :• Temps de requête/connexion• Overhead HTTP• Buffering des proxy

Historique

• Server-Sent Event (SSE) :• Push uniquement, en texte, pas de streaming

• SPDY :• HTTP amélioré par Google : compression des headers,

multiplexage des requêtes, etc• Push de ressources (pas d'API JS de callback)• Upgradable en WebSocket

• HTTP/2 :• Standard basé sur SPDY : compression, multiplexage,

upgradable en WebSocket, etc• Push de ressources

Historique

• Protocole de communication full-duplex sur connexion TCP• RFC 6455• Texte ou binaire• Crypté ("wss:") ou pas ("ws:")• Web friendly :

• Upgrade d'HTTP ou indépendant• API JavaScript par W3C• Supporté par les browsers : Ch 16, FF 11, IE 10, Saf 6

• Sous-protocoles, e.g. XMPP, STOMP, SIP• Cible : applications temps réel, event-driven• Bénéfices : réduction de bande passante et latence

WebSocket

Exemples de communication

Agar.io

• JavaScript :• API JavaScript standard du W3C• SocksJS : émulation WebSocket• Socket.io : wrapper WebSocket, AJAX long-polling, etc,

utilisable aussi sur Node.js

• Java :• Les API propriétaires des serveurs d'application• Java API for WebSocket 1.0 (JSR 356, dans Java EE 7)• Spring : fallback transparent sur SocksJS• Atmosphere : framework Java et JS supportant Comet,

SSE, WebSocket, etc.

API

• Cryptage via "wss:"

• Authentification :• Pas de mécanisme spécifique• Solutions HTTP possibles, par ex cookies• Ou par message applicatif

• Pas de Same-Origin Policy

• Cross-Site WebSocket Hijacking (CSWSH) :• Similaire à CSRF• Vérifier le header "Origin"• Générer un token aléatoire pour l'upgrade

Sécurité

Outils

Chrome

Dark WebSocket Terminal

JMeter

Wireshark

API JavaScript

• HTML

Code client du chat

• JavaScript

Code client du chat

API JavaScript

API JavaScript

Codes de fermeture

Code Nom Description

0-999 Réservés

1000 CLOSE_NORMAL Fermeture normale

1002 CLOSE_PROTOCOL_ERROR Erreur de protocole

1003 CLOSE_UNSUPPORTED Type de message pas supporté

1009 CLOSE_TOO_LARGE Data frame trop grosse

3000-3999 Pour les librairies et frameworks

4000-4999 Pour les applications

… … …

API Java

• Endpoint WebSocket

Code serveur du chat

• Endpoint WebSocket, avec canaux

Code serveur du chat

• Définition d'un endpoint client ou serveur

Endpoint programmatique

• Utilisations d'un endpoint

• Cycle de vie :• Différent d'une servlet• Une instance par peer• Mono-thread

Endpoint programmatique

• Définition et utilisation

Endpoint serveur par annotation

• Similaire à un endpoint serveur

• @ClientEndpoint plutôt que @ServerEndpoint, donc sans path

Endpoint client par annotation

Session et RemoteEndpoint

Encoder et decoder

• Rétrocompatible• Amélioration pour les MessageHandler via lambdas

API WebSocket 1.1

• Cible Java EE 8• Pas encore final• Améliorations envisagées :

• Support des scopes CDI• API bas niveau pour gérer les frames• Amélioration des extensions• API de filtrage• Amélioration sur les sous-protocoles• API cliente : support de proxy, modes d'AH HTTP, etc.• Broadcast• Sécurité, par exemple @RolesAllowed• Cluster• Etc.

API WebSocket.NEXT

Retour d'expérience

KeyBout

• http://www-adeliosys.rhcloud.com/keybout/• 10 pages HTML

Conception

JSPCDI

WebSocketJSON-P

HTMLBootstrapJavaScriptWebSocket

Browser Serveur d'applicationJava EE 7

• Client vers serveur : actions en texte, exemples :• create-game Capture English 2 10• join-game Tom• claim-word 42 Coalition

• Serveur vers client : notifications en JSON, exemple :• { "type":"games-list", "list":[ { "creator":"Tom", "type":"Capture", "language":"English", "rounds":2, "words":10, "guests":[ ] } ] }

Messages

Couches applicatives

Games

Game

Results

Endpoints Contrôleurs

V1

Play PlayV3

Services

Games

Games

Games

Game

Results

Games

Game

Results

V2 Games

Games

Game

Results

Play

Games

Game

Results

Pages

/games

/game/{id}

/results/{id}

/games

/game/{id}

/results/{id}

/play

Métier

Métier

MétierRéceptionsSécurité

Session WSEmissions

Session WSEmissions

RéceptionsSécurité

RéceptionsSécurité

Session WSEmissions

• Pas lié à WebSocket mais au push :• Besoin d'indentification et catégorisation des clients

• Plusieurs états à coordonner :• Session HTTP• Session WebSocket• Etat applicatif

• Web vs WebSocket : manque de solutions intégrées à ce jour

Impacts sur la conception

• Un path d'endpoint WebSocket doit commencer par "/", pas nécessaire pour JAX-RS

• WildFly 8.0.0 : codes d'erreur pas supportés (corrigé en 8.1.0)

• Quelques limitations d'héritage

• Injection de @Singleton ok, mais pas @RequestScoped

• Clustering pas spécifié :• Load-balancing, réplication de session, fail-over ?• L'API Spring semble aller plus loin

API Java

florian.beaufume@adeliosys.frwww.adeliosys.fr

www.linkedin.com/in/fbeaufume

Merci

top related