Etude de l'architecture microservice¶
- Table of contents
- Etude de l'architecture microservice
Architecture¶
Gestion comme un cloud de service.
Gestion de plusieurs service cloud : https://github.com/RegardsOss/regards-cloud
- System gateway (relying on Netflix Zuul),
- System authentication (relying on Spring OAuth2),
- Microservice registry for load balancing (relying on Netflix Eureka),
- Configuration (relying on Spring Cloud Config).
Routeur¶
Avec ce type d’architecture, une seule URL par microservice est visible de l’extérieur, celle du routeur. Plusieurs instances de microservices peuvent cohabiter de manière transparente.
Pattern de Circuit Breaker¶
nous sommes passés de « prévenir toutes les défaillances » à « les défaillances font partie du jeu ».
Octo
Centralisation de la configuration¶
Extrait:
Le service de centralisation de la configuration des microservices permet d’assurer une externalisation de la configuration dans une architecture distribuée. A partir d’un dépôt de configuration géré par le serveur de configuration centralisée, il est possible d’appliquer les éléments de configuration communs à chaque instance d’un même microservice. Si une modification de configuration est apportée à un microservice, elle est stockée sur le serveur de configuration centralisée et diffusée pour être appliquée aux instances du même microservice.
__
Dialogue REST avec les microservices¶
- Pour dialoguer avec les microservices sans passer par l'interface, il faut utiliser un client REST ( Advanced REST client, Restlet Client, etc...)
- Obtenir la client d'authentification cliente (authorization: Basic Y2xpZW50OnNlY3JldA==)
- Demander un token oauth
- Utiliser systématiquement le token oauth (authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....)
Obtenir la client d'authentification cliente¶
- Retrouver la valeur de la clef, elle est constante (mais à quel horizon ? )
- La clef d'authentification cliente est visible dans les header Authorization de la requête de login
Authorization: Basic Y2xpZW50OnNlY3JldA==
- Pour la voir, ouvrir les outils développeur de votre navigateur (touche F12), onglet réseau
Demander un token JWT¶
Pour obtenir un jeton JsonWebToken (JWT), il faut faire
POST /api/v1/rs-authentication/oauth/token
avec pour paramètres
grant_type=password username=regards_projet@ias.u-psud.fr password=XXXXXXX scope=spire_fts origineUrl=http://idoc-regards.ias.u-psud.fr/user/spire_fts/modules/52 requestLink=http://idoc-regards.ias.u-psud.fr/user/spire_fts/modules/52?external_auth_action=verify_email
et dans les headers la clef d'authentification cliente
Authorization: Basic Y2xpZW50OnNlY3JldA==
En curl
curl -X POST 'http://idoc-regards.ias.u-psud.fr/api/v1/rs-authentication/oauth/token?grant_type=password&username=regards-admin@c-s.fr&password=root_admin&scope=project1' -H 'Authorization: Basic Y2xpZW50OnNlY3JldA=='
La réponse contient le token access_token
{"access_token":"eyJhbGciOiJIUzI1NiIsInR<....couic...>HHy722UclsY",
"token_type":"bearer",
"expires_in":43199,
"scope":"spire_fts",
"sub":"regards_projet@ias.u-psud.fr",
"role":"PROJECT_ADMIN",
"tenant":"spire_fts",
"jti":"dc68ccbc-ff41-4d47-9eb1-e117d9a7d269"}
Utiliser systématiquement le token oauth¶
Chaque appel REST devra par la suite contenir le header avec la valeur précédente
"Authorization: Bearer ${access_token}"
dans notre cas
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Ik....
En curl
curl -i -X GET \ -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Ik<...couic..>OIvQAk" \ 'http://idoc-regards.ias.u-psud.fr/api/v1/rs-dam/models/attributes/1'
La réponse est de type
{
"id": 1,
"name": "dec",
"description": "dec",
"defaultValue": null,
"type": "DOUBLE",
"unit": "unitless",
"precision": null,
"arraysize": null,
"fragment": {
"id": 1,
"name": "default",
"description": "Default fragment",
"version": null,
"defaultFragment": true,
"identifiable": true
},
"alterable": true,
"optional": true,
"label": "dec",
"restriction": null,
"group": null,
"properties": [
],
"dynamic": true,
"jsonPath": "properties.dec",
"identifiable": true,
"_links": {
"self": {
"href": "http:\/\/idoc-regards.ias.u-psud.fr:80\/api\/v1\/rs-dam\/models\/attributes\/1"
},
"update": {
"href": "http:\/\/idoc-regards.ias.u-psud.fr:80\/api\/v1\/rs-dam\/models\/attributes\/1"
},
"list": {
"href": "http:\/\/idoc-regards.ias.u-psud.fr:80\/api\/v1\/rs-dam\/models\/attributes"
}
}
}
Il n'est pas nécessaire de préfixer par le module: il semblerait que
http://idoc-regards.ias.u-psud.fr:4444
permet d'utiliser toutes les APIS