Slide 1

Slide 1 text

WebSocket avec Java EE 7 Florian Beaufumé @fbeaufume 09/2015 v1.1

Slide 2

Slide 2 text

Florian Beaufumé • Architecte logiciel et expert Java • Freelance • Brown bag lunch • @fbeaufume

Slide 3

Slide 3 text

• Protocole • Outils • API JavaScript du W3C • API Java de Java EE 7 • Retour d'expérience Sommaire @fbeaufume

Slide 4

Slide 4 text

Protocole @fbeaufume

Slide 5

Slide 5 text

Protocoles web WebSocket HTTP SPDY AJAX Comet HTTP/2 SSE Full-duplex for the web @fbeaufume

Slide 6

Slide 6 text

• 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 @fbeaufume

Slide 7

Slide 7 text

• 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 @fbeaufume

Slide 8

Slide 8 text

• 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 @fbeaufume

Slide 9

Slide 9 text

• 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 @fbeaufume

Slide 10

Slide 10 text

Exemples de communication @fbeaufume

Slide 11

Slide 11 text

• 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 @fbeaufume

Slide 12

Slide 12 text

• Chat basique : http://localhost:8080/chat/ Démonstration @fbeaufume

Slide 13

Slide 13 text

• 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é

Slide 14

Slide 14 text

Outils @fbeaufume

Slide 15

Slide 15 text

Chrome @fbeaufume

Slide 16

Slide 16 text

Dark WebSocket Terminal @fbeaufume

Slide 17

Slide 17 text

JMeter @fbeaufume

Slide 18

Slide 18 text

Wireshark @fbeaufume

Slide 19

Slide 19 text

API JavaScript @fbeaufume

Slide 20

Slide 20 text

• HTML Code client du chat @fbeaufume

Slide 21

Slide 21 text

• JavaScript Code client du chat @fbeaufume

Slide 22

Slide 22 text

API JavaScript @fbeaufume

Slide 23

Slide 23 text

API JavaScript @fbeaufume

Slide 24

Slide 24 text

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 … … … @fbeaufume

Slide 25

Slide 25 text

API Java @fbeaufume

Slide 26

Slide 26 text

• Endpoint WebSocket Code serveur du chat @fbeaufume

Slide 27

Slide 27 text

• Endpoint WebSocket, avec canaux Code serveur du chat @fbeaufume

Slide 28

Slide 28 text

• Définition d'un endpoint client ou serveur Endpoint programmatique @fbeaufume

Slide 29

Slide 29 text

• Utilisations d'un endpoint • Cycle de vie : • Différent d'une servlet • Une instance par peer • Mono-thread Endpoint programmatique @fbeaufume

Slide 30

Slide 30 text

• Définition et utilisation Endpoint serveur par annotation @fbeaufume

Slide 31

Slide 31 text

• Similaire à un endpoint serveur • @ClientEndpoint plutôt que @ServerEndpoint, donc sans path Endpoint client par annotation @fbeaufume

Slide 32

Slide 32 text

Session et RemoteEndpoint @fbeaufume

Slide 33

Slide 33 text

Encoder et decoder @fbeaufume

Slide 34

Slide 34 text

• Rétrocompatible • Amélioration pour les MessageHandler via lambdas API WebSocket 1.1 @fbeaufume

Slide 35

Slide 35 text

• 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 @fbeaufume

Slide 36

Slide 36 text

Retour d'expérience @fbeaufume

Slide 37

Slide 37 text

KeyBout @fbeaufume

Slide 38

Slide 38 text

• http://www-adeliosys.rhcloud.com/keybout/ • 10 pages HTML Conception JSP CDI WebSocket JSON-P HTML Bootstrap JavaScript WebSocket Browser Serveur d'application Java EE 7 @fbeaufume

Slide 39

Slide 39 text

• 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 @fbeaufume

Slide 40

Slide 40 text

Couches applicatives Games Game Results Endpoints Contrôleurs V1 Play Play V3 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étier Réceptions Sécurité Session WS Emissions Session WS Emissions Réceptions Sécurité Réceptions Sécurité Session WS Emissions @fbeaufume

Slide 41

Slide 41 text

• 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 @fbeaufume

Slide 42

Slide 42 text

• 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 @fbeaufume

Slide 43

Slide 43 text

Merci @fbeaufume