Project

General

Profile

Etude de l'architecture » History » Version 1

Marc Dexet, 28/06/2018 16:53

1 1 Marc Dexet
h1. Etude de l'architecture microservice
2 1 Marc Dexet
3 1 Marc Dexet
{{toc}}
4 1 Marc Dexet
5 1 Marc Dexet
h2. Architecture
6 1 Marc Dexet
7 1 Marc Dexet
Gestion comme un cloud de service.
8 1 Marc Dexet
9 1 Marc Dexet
Gestion de plusieurs service cloud : https://github.com/RegardsOss/regards-cloud
10 1 Marc Dexet
11 1 Marc Dexet
12 1 Marc Dexet
* System gateway (relying on Netflix Zuul),
13 1 Marc Dexet
* System authentication (relying on Spring OAuth2),
14 1 Marc Dexet
* Microservice registry for load balancing (relying on Netflix Eureka),
15 1 Marc Dexet
* Configuration (relying on Spring Cloud Config).
16 1 Marc Dexet
17 1 Marc Dexet
h3. Routeur
18 1 Marc Dexet
19 1 Marc Dexet
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.
20 1 Marc Dexet
21 1 Marc Dexet
h3. Pattern de Circuit Breaker 
22 1 Marc Dexet
23 1 Marc Dexet
https://blog.octo.com/circuit-breaker-un-pattern-pour-fiabiliser-vos-systemes-distribues-ou-microservices-partie-1/
24 1 Marc Dexet
25 1 Marc Dexet
__nous sommes passés de « prévenir toutes les défaillances » à « les défaillances font partie du jeu »__.
26 1 Marc Dexet
Octo
27 1 Marc Dexet
28 1 Marc Dexet
h3. Centralisation de la configuration
29 1 Marc Dexet
30 1 Marc Dexet
Extrait:
31 1 Marc Dexet
__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.__
32 1 Marc Dexet
____
33 1 Marc Dexet
34 1 Marc Dexet
h2. Dialogue REST avec les microservices
35 1 Marc Dexet
36 1 Marc Dexet
# Pour dialoguer avec les microservices sans passer par l'interface, il faut utiliser un client REST ( Advanced REST client, Restlet Client, etc...)
37 1 Marc Dexet
# Obtenir la client d'authentification cliente (_authorization: Basic Y2xpZW50OnNlY3JldA==_)
38 1 Marc Dexet
# Demander un token oauth
39 1 Marc Dexet
# Utiliser systématiquement le token oauth (_authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...._)
40 1 Marc Dexet
41 1 Marc Dexet
42 1 Marc Dexet
h3. Obtenir la client d'authentification cliente
43 1 Marc Dexet
44 1 Marc Dexet
# Retrouver la valeur de la clef, elle est constante (mais à quel horizon ? )
45 1 Marc Dexet
# La clef d'authentification cliente est visible dans les header _Authorization_ de la requête de login
46 1 Marc Dexet
<pre>
47 1 Marc Dexet
Authorization: Basic Y2xpZW50OnNlY3JldA==
48 1 Marc Dexet
</pre>
49 1 Marc Dexet
# Pour la voir, ouvrir les outils développeur de votre navigateur (touche F12), onglet _réseau_
50 1 Marc Dexet
51 1 Marc Dexet
h3. Demander un token JWT 
52 1 Marc Dexet
53 1 Marc Dexet
Pour obtenir un jeton JsonWebToken (JWT), il faut faire 
54 1 Marc Dexet
55 1 Marc Dexet
<pre>
56 1 Marc Dexet
    POST  /api/v1/rs-authentication/oauth/token
57 1 Marc Dexet
</pre>
58 1 Marc Dexet
59 1 Marc Dexet
avec pour paramètres
60 1 Marc Dexet
 
61 1 Marc Dexet
<pre>
62 1 Marc Dexet
grant_type=password
63 1 Marc Dexet
username=regards_projet@ias.u-psud.fr
64 1 Marc Dexet
password=XXXXXXX
65 1 Marc Dexet
scope=spire_fts
66 1 Marc Dexet
origineUrl=http://idoc-regards.ias.u-psud.fr/user/spire_fts/modules/52
67 1 Marc Dexet
requestLink=http://idoc-regards.ias.u-psud.fr/user/spire_fts/modules/52?external_auth_action=verify_email
68 1 Marc Dexet
</pre> 
69 1 Marc Dexet
70 1 Marc Dexet
et dans les headers la clef d'authentification cliente
71 1 Marc Dexet
72 1 Marc Dexet
<pre>
73 1 Marc Dexet
Authorization: Basic Y2xpZW50OnNlY3JldA==
74 1 Marc Dexet
</pre>
75 1 Marc Dexet
76 1 Marc Dexet
En curl
77 1 Marc Dexet
<pre>
78 1 Marc Dexet
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=='
79 1 Marc Dexet
</pre> 
80 1 Marc Dexet
81 1 Marc Dexet
La réponse contient le token __access_token__
82 1 Marc Dexet
83 1 Marc Dexet
<pre><code class="json">
84 1 Marc Dexet
{"access_token":"eyJhbGciOiJIUzI1NiIsInR<....couic...>HHy722UclsY",
85 1 Marc Dexet
"token_type":"bearer",
86 1 Marc Dexet
"expires_in":43199,
87 1 Marc Dexet
"scope":"spire_fts",
88 1 Marc Dexet
"sub":"regards_projet@ias.u-psud.fr",
89 1 Marc Dexet
"role":"PROJECT_ADMIN",
90 1 Marc Dexet
"tenant":"spire_fts",
91 1 Marc Dexet
"jti":"dc68ccbc-ff41-4d47-9eb1-e117d9a7d269"}
92 1 Marc Dexet
</code></pre>
93 1 Marc Dexet
94 1 Marc Dexet
h3. Utiliser systématiquement le token oauth
95 1 Marc Dexet
96 1 Marc Dexet
Chaque appel REST devra par la suite contenir le header avec la valeur précédente
97 1 Marc Dexet
98 1 Marc Dexet
<pre><code class="groovy">
99 1 Marc Dexet
"Authorization: Bearer ${access_token}"
100 1 Marc Dexet
</code></pre>
101 1 Marc Dexet
102 1 Marc Dexet
dans notre cas
103 1 Marc Dexet
104 1 Marc Dexet
<pre>
105 1 Marc Dexet
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Ik....
106 1 Marc Dexet
</pre>
107 1 Marc Dexet
108 1 Marc Dexet
En curl
109 1 Marc Dexet
<pre>
110 1 Marc Dexet
curl -i -X GET \
111 1 Marc Dexet
   -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Ik<...couic..>OIvQAk" \
112 1 Marc Dexet
 'http://idoc-regards.ias.u-psud.fr/api/v1/rs-dam/models/attributes/1'
113 1 Marc Dexet
</pre>
114 1 Marc Dexet
115 1 Marc Dexet
116 1 Marc Dexet
La réponse est de type
117 1 Marc Dexet
118 1 Marc Dexet
<pre><code class="json">
119 1 Marc Dexet
{
120 1 Marc Dexet
  "id": 1,
121 1 Marc Dexet
  "name": "dec",
122 1 Marc Dexet
  "description": "dec",
123 1 Marc Dexet
  "defaultValue": null,
124 1 Marc Dexet
  "type": "DOUBLE",
125 1 Marc Dexet
  "unit": "unitless",
126 1 Marc Dexet
  "precision": null,
127 1 Marc Dexet
  "arraysize": null,
128 1 Marc Dexet
  "fragment": {
129 1 Marc Dexet
    "id": 1,
130 1 Marc Dexet
    "name": "default",
131 1 Marc Dexet
    "description": "Default fragment",
132 1 Marc Dexet
    "version": null,
133 1 Marc Dexet
    "defaultFragment": true,
134 1 Marc Dexet
    "identifiable": true
135 1 Marc Dexet
  },
136 1 Marc Dexet
  "alterable": true,
137 1 Marc Dexet
  "optional": true,
138 1 Marc Dexet
  "label": "dec",
139 1 Marc Dexet
  "restriction": null,
140 1 Marc Dexet
  "group": null,
141 1 Marc Dexet
  "properties": [
142 1 Marc Dexet
    
143 1 Marc Dexet
  ],
144 1 Marc Dexet
  "dynamic": true,
145 1 Marc Dexet
  "jsonPath": "properties.dec",
146 1 Marc Dexet
  "identifiable": true,
147 1 Marc Dexet
  "_links": {
148 1 Marc Dexet
    "self": {
149 1 Marc Dexet
      "href": "http:\/\/idoc-regards.ias.u-psud.fr:80\/api\/v1\/rs-dam\/models\/attributes\/1"
150 1 Marc Dexet
    },
151 1 Marc Dexet
    "update": {
152 1 Marc Dexet
      "href": "http:\/\/idoc-regards.ias.u-psud.fr:80\/api\/v1\/rs-dam\/models\/attributes\/1"
153 1 Marc Dexet
    },
154 1 Marc Dexet
    "list": {
155 1 Marc Dexet
      "href": "http:\/\/idoc-regards.ias.u-psud.fr:80\/api\/v1\/rs-dam\/models\/attributes"
156 1 Marc Dexet
    }
157 1 Marc Dexet
  }
158 1 Marc Dexet
}
159 1 Marc Dexet
</code></pre>
160 1 Marc Dexet
161 1 Marc Dexet
Il n'est pas nécessaire de préfixer par le module: il semblerait que 
162 1 Marc Dexet
http://idoc-regards.ias.u-psud.fr:4444 
163 1 Marc Dexet
permet d'utiliser toutes les APIS