Configuration Discovery avec Symfony2 chez M6Web – Les protagonistes – Mise à disposition de la configuration



Configuration Discovery avec Symfony2 chez M6Web – Les protagonistes – Mise à disposition de la configuration

1 0


slides-applaunch

Slides de la présentation donnée au SfPot Lyon le 22/05/2014.

On Github t-geindre / slides-applaunch

Configuration Discovery avec Symfony2 chez M6Web

sfPot Lyon - le 22 mai 2014

Les protagonistes

Mikael Randy

  • Consultant - CleverAge
    • Lead developer équipe Replay - M6Web
  • Symfony
    • Découvert en 2007 sur la version 1.0
    • Silex
    • Symfony2
  • Coordinateur AFUP Lyon
  • PHP depuis plus de 10 ans
  • Ruby
  • Javascript - Node.js (angular)

Thierry Geindre

  • Développeur Zol
    • Mission depuis 7 mois chez M6Web
  • PHP depuis longtemps
  • Symfony
    • Depuis la 1.4
    • Symfony2

M6Web

tech.m6web.fr - github.com/M6Web - OSS
  • Notre dénominateur commun
  • Depuis 2012, mise en place d'un nouveau socle
    • Symfony2
  • Volonté d'opérer un virage technologique
  • Volonté open-source
    • Tout ce qu'on créé et qui n'est pas métier et ouvert
    • 39 projets sur github
    • 19 librairies sur packagist
    • Bundle Sf2, coke, jenkins light, ...

Sommaire

  • Configuration Discovery, kezako ?
  • Mise à disposition de configuration
  • M6Web/WsClientBundle, M6Web/RedisBundle
  • La configuration discovery avec Symfony

Configuration Discovery

  • Buzzword bingo
  • Agir sur la configuration depuis l'extérieur du projet
  • Service de surcharge de configuration externe
  • Chez M6Web ?
  • buzzword
    • Mot parapluie
    • Chacun trouve une définition derrière ce mot
  • Configuration
    • Comment changer la configuration d'un projet depuis l'extérieur
    • Sans deploy, sans BO
    • Surcharge de la configuration, pas configuration externe
    • Il sait tourner si ce service externe est down
  • Service de configuration
    • Le projet a quelques informations sur la localisation du service de configuration
    • Il se charge de l'appeler, et d'utiliser son retour pour découvrir ce qu'il doit modifier dans sa configuration locale
  • M6Web
    • Debug : Augmenter ponctuellement le niveau de log
    • Configuration : faire du "feature flipping"
    • Très pratique en SOA et sur des architectures très scalables
      • Inversion de la diffusion de la configuration

Mise à disposition de la configuration

  • Accessible via HTTP
  • Configuration complexe
  • Plusieurs configuration
  • => Format JSON
  • Accessible via HTTP
    • Simple à mettre en place
    • cachable, headers, status
  • Configuration complexe
    • être capable de gérer des sous-éléments complexe
  • Plusieurs configuration
    • Il faut être capable de gérer toutes les clés de configuration du projet
  • => Sur le modèle de la configuration Symfony

AppLaunch

M6Web/WsClientBundle, M6Web/RedisBundle

  • 2 bundles M6Web
  • Permet de préparer ce qui a va être dit
  • Publics

M6Web/RedisBundle

https://github.com/M6Web/RedisBundle

Basé sur le composant M6Web/Redis

  • Configuration
  • Event dispatching
  • Session handler
  • Guzzle cache
  • Web profiler toolbar
  • Cache resetter
  • Configuration
    • Paramétrage à la sauce Symfony
  • Event dispatching
    • Brancher facilement des événements sur Redis
    • Graphite chez nous
  • Session handler
    • Redis est scalable, pas memcache
  • Web profiler toolbar
    • Voir les actions, les temps de réponse, ...
  • Cache reseter
    • Pouvoir délocaliser la détection de la validité du cache
  • Guzzle cache
    • Placer dans Redis la response Guzzle pour que, sur une nouvelle

M6Web/WsClientBundle

https://github.com/M6Web/WsClientBundle

  • Abstraction appels HTTP
  • Possibilité d'ajouter un handler de cache
  • Intégration complète dans le web profiler toolbar
* Bundle Public, sur packagist * Abstraction d'appels de webservice HTTP * Actuellement, uniquement un adapter Guzzle * Cache * Permet d'installer une couche de cache * Adapter Redis, qui permet de scaler * Intégration Debug Center * Actions, temps de réponse

Configuration discovery avec Symfony

Pour chaque requête / commande :

  • Lecture du flux JSON : M6Web / WSClientBundle
  • Surcharger la configuration du projet
  • Lecture flux Json
    • WsClient
    • On ne se soucie pas du cache
    • Profiling
  • Surcharge de la configuration
  • Pour chaque requête / commande

Surcharge de la configuration Symfony

  • Impossible au runtime
  • Le container est compilé
  • Impossible à l'execution
  • La configuration permet de définir (vision simple)
    • des parameters
    • des services
    • tout est dans le DIC
  • le DIC est compilé , la configuration ne sera plus utilisée

Service existant

services:
  request_logger:
    class: %request_logger.class%
    calls:
      - [ setLogger, [ @logger ] ]
  • Service de log de requête
  • Créé par quelqu'un d'autre
  • Il log des requêtes suivant des filtres
  • En l'état il ne log aucune requête

Configuration du bundle

m6_video_app_launch_client:
  services:
    request_logger:
      id: request_logger
      calls:
        - [ setFilters, [ !loggerconfig.filters ] ]
  • Injection de a valeur contenue dans le json
  • Transparent à l'utilisation
  • Extrait de la configuration du bundle que nous avons mis au point
  • On ajoute un call au service
    • -> La valeur du json est injecté
    • -> Transparent à l'utilisation

Fonctionnement

services:
  request_logger:
    class: %request_logger.class%
    calls:
      - [ setLogger, [ @logger ] ]
  • Passe de compilation
  • Alias du service original : m6_applaunch.%s
  • Recréé un service sous l'id original
  • Service factory
  • -> Rappel du service original
  • -> Passe de compilation
    • Au moment de la compilation du DIC
    • Une bonne fois pour toutes
  • -> Alias
    • Nouveau service m6_applaunch.request_logger
    • Exactement la même définition que le service request_logger
  • -> Nouveau service sous l'id original
    • Service factory
      • Appel le service sous l'id alias, m6_applaunch.request_logger
      • Applique les call
      • Retourne le service
      • Si un des appels ne peut être réalisé, on en fait aucun

Configuration complète

m6_video_app_launch_client:
  host: 'http://host'
  configurations:
    loggerconfig:
      project: 'request_logger'
      version: '1.0.0'
      parameters:
        filters:
          json: true
  services:
    request_logger:
      id: request_logger
      calls:
        - [ setFilters, [ !loggerconfig.filters ] ]
  wsclient: m6_ws_client
  • host, project et version servent à forger l'url du json
  • parameters permet de définir si certain éléments contiennent du json (json_decode)
  • on reprend la même clé dans l'injection de parametre que dans la config
  • on lui donne le wsclient à utiliser

Impact Redis

Questions ?

@TechM6Web - http://tech.m6web.fr

@mikaelrandy - http://www.mikaelrandy.fr

PHP Tour Lyon 2014

  • 23 et 24 juin 2014
  • Manufacture des tabacs
  • "Méthodologie et industrialisation"
Réservez !
  • Rasmus, Docker, PDD, Elastica, HHVM
  • Grégoire Pineau, Richard Miller (UK), Julien Pauli, Sarah Khalil
  • SensioLabs sponsors, clinique Symfony2
  • Lundi et mardi
  • Apéritif communautaire le soir entre les 2 jours