Come organizzi i contratti dell'endpoint API

7

Nel tentativo di migliorare la "fiducia" che abbiamo nella nostra comunicazione interservizi.

Sfondo: "Contratti" è stata una questione di condivisione di un pezzo di codice che definisce un'interfaccia da implementare, ma nel corso degli anni, il codice condiviso è cambiato e sono nate molte diverse implementazioni (soap, msmq, rest, ecc.) Che potrebbero tutto detto per implementare la stessa interfaccia, ma in nessun modo funziona bene insieme, senza mappatura, che ha causato l'implementazione di una foresta di microservizi di "mappatura", che di nuovo appare in una versione diversa. Lo sviluppo e le operazioni ne soffrono entrambi.

Intenzione: vorrei definire i contratti per gli endpoint all'esterno, utilizzando qualcosa come Swagger o il progetto API. Con swagger posso confrontare il "contratto" swagger.json con swagger.json per il servizio che afferma di implementarlo, e con il progetto API, c'è "dredd". Per i trasporti basati su MSMQ, avremo bisogno di un altro approccio, ma penso che i contratti per la struttura all'interno dei messaggi potrebbero / dovrebbero essere conformi per gli stessi motivi degli endpoint http.

I dettagli su come verificare non sono la domanda - la domanda è: come organizzeresti questi contratti? Dovremmo disporre di un repository interno di contratti che non possono mai essere modificati, ma che si verificano solo nelle nuove versioni, e quindi comunicare al processo di verifica quali contratti sono (presumibilmente) implementati? Detto contratto-repo dovrebbe essere letto dal nostro processo di verifica e dai nostri sviluppatori (ed esterni) ...

Ogni input riguardante i problemi descritti in background è apprezzato, forse sto cercando il modo sbagliato per una soluzione?

    
posta Julian 15.12.2015 - 12:36
fonte

2 risposte

1

La soluzione più semplice IMO sarebbe quella di utilizzare le richieste di pull e una buona copertura di test automatizzata. È un cambio di paradigma per coloro che non sono abituati, ma i benefici sono innegabili.

Github ha alcuni buoni documenti: link così come BitBucket: link

I PR funzionano solo quando l'intera squadra è a bordo. Quando viene inviato un nuovo PR, tutti gli sviluppatori tranne quelli sul percorso critico dovrebbero interrompere ciò che stanno facendo e richiedere alcuni minuti per rivedere il PR e lasciare commenti come: this code will break the current contract for the Xyz method, please revisit o looks good . Molti sviluppatori lasceranno semplicemente un +1 se pensano che il codice debba essere unito. Una volta che hai ottenuto abbastanza occhi e approvazioni sul codice, può essere unito al ramo development .

Inoltre, farei in modo che il team mantenga buoni test automatizzati.

Se non usi git , Github o BitBucket e non puoi o non vuoi cambiare ...

Potresti avvicinarti a questo in un paio di modi diversi:

  1. Un sistema interno: questo genererebbe e servirà la documentazione API / Endpoint sulla base di firme e commenti di metodo. È possibile utilizzare uno strumento automatico per generare la documentazione in formato HTML. Il problema con questo è che gli sviluppatori possono facilmente cambiare i contratti (firme del metodo) e commettere quel codice che rompe le cose. Il vantaggio sarebbe praticamente zero manutenzione e un'interfaccia leggibile / ricercabile per gli sviluppatori per scoprire contratti endpoint esistenti.

  2. Un sistema esterno: questo suona più come vuoi tu. Potresti farlo in molti modi diversi. Un modo sarebbe utilizzare uno strumento di documentazione come Yard per generare i documenti di base attuali, quindi assegnare il compito di modificarli ogni volta che un contratto deve essere modificato. Facendolo in questo modo ti permetterebbe di configurare un web stack separato (esterno) come servizio. Un altro modo sarebbe quello di creare un'app separata che modella la funzionalità desiderata. Avrebbe Klass e Method modelli. Lo svantaggio sarebbe che qualcuno dovrebbe mantenerlo. Il vantaggio sarebbe che gli sviluppatori non potevano facilmente cambiare i contratti, o affatto se si limitava l'accesso al codice.

In base ai tuoi casi d'uso sopra, tenderei ad andare con un'app separata. È possibile avere un'interfaccia di manutenzione per un responsabile del team o un amministratore per modificare un contratto e una versione dell'API / endpoint. Potresti anche avere un'interfaccia di sola lettura per gli sviluppatori per cercare le cose.

Flusso di lavoro:

  • Bug arriva alla scrivania degli sviluppatori.
  • Lo sviluppatore trova la radice del problema in un metodo particolare.
  • Lo sviluppatore ricerca il metodo sul sito del contratto esterno e scopre che è necessario modificare il valore restituito che interromperà il contratto.
  • Lo sviluppatore porta la scoperta al caposquadra o cambia scheda di controllo
  • Team Lead assegna allo sviluppatore di modificare anche il codice che si interrompe a causa della modifica, di conseguenza
  • Lo sviluppatore scrive codice per correggere il bug (e si spera che i test automatizzati)
  • A questo punto lo sviluppatore dovrebbe eseguire una suite di test di regressione completa per assicurarsi che nessuno del nuovo codice abbia violato qualcosa di inaspettato.
  • Lo sviluppatore commette la (risolta) correzione di bug
risposta data 31.12.2015 - 17:43
fonte
0

Ho finito per fare questo, usando i test come documentazione interna per i contratti link

    
risposta data 18.03.2017 - 21:52
fonte

Leggi altre domande sui tag