Retour d'expérience, ARTE API

PHP Tour Luxembourg - Lenclos Thibault - 2015

Retour d'expérience, ARTE API

PHP Tour Luxembourg - Thibault Lenclos - 2015

Je suis

En vrai : Thibault Lenclos - @thibz

Dév Web et mobile @jolicode
PHP (Symfony2), JS full stack (node, meteor), mobile (titanium)
Rock & code

Sommaire

  1. Arte
  2. Projet
  3. Outils et processus
  4. Bilan

Arte

ARTE GEIE, basé à Strasbourg
Chaîne de télévision franco-allemande
Nombreuses plateformes (TV, Web, mobile, HBBTV…)

Équipe

François Dume (conférence Forum PHP 2014) et Matthieu Breen.

Projet : API et portail partenaire

Projet : API

Nouvelle API Rest, données unifiées
OAuth 2
Proxy Nginx + scripts Lua (rate limit et authentification)

Projet : portail partenaire

Organisation

Organisation (1)

Stand-up chaque matin
Priorisation des tâches
“Fix bug first”
Mise en production hebdomadaire (et simple !)
Communication chat et VOIP

Organisation (2)

Github : Pull request et revue de code
Jira : gestion de tickets
Bamboo : intégration continue
Hipchat : chat + notifications diverses (PR, déploiement, fail des tests)
Digital ocean : création de VM à la volée

Workflow

Même environnement pour tous :

Architecture

Standard pour l'API

API : JSON API
Documentation : Swagger

Autres formats

JSON-LD : schéma et lien
Hydra : schéma et documentation directement dans la réponse

(voir https://github.com/dunglas/api-platform)

REST

Basé sur le standard JSON Api :

semantic versionning (non défini dans le standard)

Documentation

Openresty

Nginx + modules
Étendre le serveur avec des scripts
Interagir avec des bases de données (ex: cache redis)
Sous-requêtes

Scripts LUA

Typage dynamique
Apprentissage rapide
Interviennent à différents moments de la requête

Test des scripts LUA

Testable via le package perl Test:Nginx

	--- http_config
	lua_shared_dict cache 10M;
	--- config
	location /test-401 {
		header_filter_by_lua_file /etc/nginx/conf.d/oauth-header-filter.lua;
		access_by_lua_file /etc/nginx/conf.d/oauth-throttle.lua;
	}
	--- request
	GET /test-401
	--- error_code: 401
Difficulté de tester unitairement => tests fonctionnels

Tests fonctionnels

SF2 (WebTestCase)
Frisby JS (maintenu par Vance Lucas)

frisby.create('Check token generation')
.get(oauthTokenUrl)
.expectStatus(200)
.expectHeaderContains('content-type', 'application/json')
.afterJSON(function(json) {
	var accessToken = json.access_token;

	frisby.create('Check invalid token returns a 401')
	.get(apiBaseUrl + '/api/videps?access_token=invalidToken')
	.expectStatus(401)
	.expectMaxResponseTime(maxResponseTimeExpected)
	.toss();
});
		

Benchmark performance

Tsung => tests de stress
JMeter => tests de performance
Blackfire

Bundles Symfony2

REST
nelmio/api-doc-bundle
friendsofsymfony/rest-bundle
jms/serializer
arte/hateoas-bundle (POC)
TESTS
liip/functional-test-bundle

Docker

Utilisation d’un makefile pour certaines tâches de développement :

Merci Marmelab !
https://github.com/marmelab/make-docker-command

Ansible

Description des paquets, fichiers de confs...
Exécution de tâches
Ex: relancer nginx avec mise à jour des scripts LUA

name: write the oauth-throttle.lua file for api-proxy
copy: src=oauth-throttle.lua dest=/etc/nginx/conf.d/oauth-throttle.lua backup=no
notify:
- restart nginx
tags:
- proxy-api
- nginx

Monitoring

New relic + logstash (gelf et syslog)

Clients actuels de l'API

Open source (presque !)

"Parce qu'on est des poules mouillées" - MB
Suppression des données sensibles
BFG repo cleaner

À venir

SDK pour les partenaires
Migration des clients utilisant l’ancienne version de l’API (PAPI)
PHP 7 - Elasticsearch

Bilan personnel

Premier projet @jolicode
Très formateur
Développement proche de l’architecture
Nouvelles méthodologies

Bilan projet

Métier connu
Problématique de performance
Choix des outils

Merci \o/

Questions ?

Ressources

JSON Api
Openresty
Ansible
ArteGEIE/ArteHateoasBundle
ArteGEIE/docker-images