Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebSocket avec Java EE 7

WebSocket avec Java EE 7

Présentation de WebSocket, protocole de communication réellement bidirectionnel pour le web, et mise en oeuvre de son API JavaScript dans le navigateur ainsi que l'API apportée par Java EE 7 dans le serveur.

Florian Beaufumé

September 01, 2015
Tweet

More Decks by Florian Beaufumé

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. Protocole
    @fbeaufume

    View Slide

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

    View Slide

  6. • 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

    View Slide

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

    View Slide

  8. • 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

    View Slide

  9. • 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

    View Slide

  10. Exemples de communication
    @fbeaufume

    View Slide

  11. • 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

    View Slide

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

    View Slide

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

    View Slide

  14. Outils
    @fbeaufume

    View Slide

  15. Chrome
    @fbeaufume

    View Slide

  16. Dark WebSocket Terminal
    @fbeaufume

    View Slide

  17. JMeter
    @fbeaufume

    View Slide

  18. Wireshark
    @fbeaufume

    View Slide

  19. API JavaScript
    @fbeaufume

    View Slide

  20. • HTML
    Code client du chat
    @fbeaufume

    View Slide

  21. • JavaScript
    Code client du chat
    @fbeaufume

    View Slide

  22. API JavaScript
    @fbeaufume

    View Slide

  23. API JavaScript
    @fbeaufume

    View Slide

  24. 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

    View Slide

  25. API Java
    @fbeaufume

    View Slide

  26. • Endpoint WebSocket
    Code serveur du chat
    @fbeaufume

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. Session et RemoteEndpoint
    @fbeaufume

    View Slide

  33. Encoder et decoder
    @fbeaufume

    View Slide

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

    View Slide

  35. • 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

    View Slide

  36. Retour d'expérience
    @fbeaufume

    View Slide

  37. KeyBout
    @fbeaufume

    View Slide

  38. • 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

    View Slide

  39. • 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

    View Slide

  40. 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

    View Slide

  41. • 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

    View Slide

  42. • 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

    View Slide

  43. Merci
    @fbeaufume

    View Slide