2016-07-19 2 views
2

In diesem Szenario gibt es zwei HTTP Microservices:Wie defensiv, wenn man mit einem anderen internen Microservice zusammenarbeitet?

  1. Der öffentliche Dienst, der den Client mit Daten
  2. Der interne Micro die

Leistung 1 einen Anruf tätigt Anrufe für den öffentlichen Dienst authentifiziert bietet an Service 2, um ihn zu bitten, das vom Client bereitgestellte Token zu authentifizieren.

Die Vereinbarung ("Vertrag") ist, dass Service 2 mit 200 OK und JSON-Inhalt über den authentifizierten Benutzer antworten soll.

In Service 1, wenn es die Antwort 200 OK empfängt, ist es weiter lohnenswert die Reaktion weiter zu validieren?

Zum Beispiel wird der JSON-Text der Antwort in ein Objekt geparst. Gibt es einen Wert bei der Prüfung, ob dieses Objekt korrekt instanziiert wurde, anstatt auf Null gesetzt zu werden? Oder sollte das den Integrationstests überlassen werden?

+0

Was ist der Inhalt dieses Objekts? Verwendet Dienst 1 es? –

+0

Ja, Dienst 1 verwendet den Inhalt der Antwort. Es enthält die 'UserID'. – edev

+0

Zugehörige Verweise auf Testansätze für Microservices: http://martinfowler.com/articles/microservice-testing/ – edev

Antwort

0

Ausschließlich bedeutet 200 nur, dass die Anfrage erfolgreich verarbeitet wurde. Dies ist unabhängig vom tatsächlichen Ergebnis des Anrufs aus geschäftlicher Sicht.

Sie sind in der Tat auf einer Konvention zu berufen, „wir eine Ausnahme oder auf andere Weise nicht den Anruf werfen, wenn der Benutzer nicht authentifiziert ist“, um Benutzer zu authentifizieren.

Je nach Konvention, könnten Sie möglicherweise ein Szenario, wo ein Benutzer nicht authentifiziert war aber der Anruf wurde noch erfolgreich verarbeitet.

Aus dieser Perspektive kann es sich lohnen, dass der Dienst2 eine Antwort zurückgibt, die dann abgefragt werden könnte, um diesen Kreis zu schließen.

Alternativ kann der Client den Authentifizierungsdienst direkt aufrufen, ein Token abrufen und dieses Token dann mit einer anderen Anforderung darstellen. Dies würde bedeuten, dass service1 nicht länger dafür verantwortlich ist, dass ein Anrufer authentifiziert werden muss.

Die Frage ist, ob oder nicht, um dann Test in Service 1 jedes Mal, wenn die Antwort empfangen wird

Sorry, würde ich den Geist der Frage falsch verstanden etwas zu haben scheinen.

ich etwas verwirrt bin - fragen Sie, dass, wenn das System im Test sollte service1 ist dann eine Antwort von service2 auch Teil dieser Prüfung sein?

Ich würde sagen, Sie einigen Test haben müßten, die, dass die sercvice2 Antwortabfragelogik richtig erweisen könnten, aber dies auf der Unit-Test-Ebene durchgeführt werden kann. Ich denke nicht, dass Sie dies für Tests tun müssten, die gegen eine bereitgestellte Instanz des Dienstes ausgeführt werden, die von Natur aus eher das Dienstverhalten an der Grenze als intern betrifft.

+0

"Aus dieser Perspektive kann es sich lohnen, dass der Service2 eine Antwort zurückgibt, die dann abgefragt werden könnte, um diesen Kreis zu schließen." Das ist tatsächlich, was Service 2 tut. Die Frage ist, ob dann bei jedem Empfang der Antwort in Service 1 getestet werden soll, um zu überprüfen, ob sie ein erwartetes Attribut enthält. (Die andere Seite des Arguments ist nicht in jeder Live-Anfrage zu belästigen, und dies dem Integrationstest überlassen.) – edev

0

Nun, Ihre Herangehensweise ist nicht so schlecht!

Einige des HTTP-Statuscodes werden für die Fälle von ungültigen Anforderungen vorbehalten etc., aber in Ihrem Fall, fragen Sie Service2 Informationen für ein Token zurück!Wenn dieses Token existiert, haben Sie korrekt angegeben, dass Service2 200 OK zurückgeben muss. Jetzt müssen Sie nur noch angeben, was passiert, wenn das Token nicht mehr gültig ist oder wenn es nicht existiert (oder behandeln Sie beide Fälle gleich ...). Wenn Sie angeben, dass Service2 404 Not found zurückgeben muss, wenn er das Token nicht kennt oder dass das Token abgelaufen ist, muss Service1 (in den meisten Fällen) nicht weiter arbeiten! Das Analysieren des Statuscodes ist in fast jeder Sprache/Umgebung billig, aber das Erzwingen der Deserialisierung des Inhalts sowohl in Erfolgs- als auch in Fehlerfällen ist im Vergleich sehr teuer. Die Authentifizierung muss schnell sein - also würde ich hier den Statuscode suchen!

Der Schlüssel ist, dass dieses Verhalten irgendwo angegeben werden muss! (Wir gingen für Swagger Definitionen!)

+0

Danke, und ein guter Tipp auf Swagger. Um klar zu sein, muss ich den Antworttext für die Benutzer-ID analysieren. Es ist also eine Frage, das zu tun, und davon auszugehen, dass ich jetzt ein Objekt mit der Benutzer-ID habe oder eine explizite Überprüfung durchführe und eine Ausnahme ausspreche, wenn dieses Attribut nicht zurückgegeben wird. – edev

Verwandte Themen