Come per l'architettura dei microservizi, dovrebbe esserci una base di codice per microservizio senza alcuna API condivisa. Ciò impone un alto livello di disaccoppiamento e ogni microservizio è limitato all'interno del proprio contesto.
Ma questi microservizi, nel tempo, comunicheranno tra loro. Il servizio A parla con il servizio B e il servizio B parla con il servizio C, ecc ...
Dato questo scenario:
- - > significa richiesta
Cliente - > Servizio A - > Servizio B
Considera che il servizio A è un servizio account e il servizio B è un servizio utente. Affinché il servizio A possa creare un account, richiede il servizio B se l'utente esiste.
Nel caso in cui il Servizio B non riesca (nessun utente ha trovato, errore di sistema), in che modo il Servizio A dovrebbe esporre questo errore al Cliente? Potevo solo pensare a due scelte:
Soluzione 1: esporre l'errore così com'è, utilizzare il codice di errore del servizio B
Pro: facile da fare. Catturare e rilanciare l'errore generato dal servizio B
Contro: se ogni microservizio avrebbe bisogno della propria base di codice, ciò significa che un microservizio ha la propria definizione di errori. La soluzione 1 rompe i principi dell'utilizzo dei microservizi poiché ora sembra che il servizio A conosca i codici di errore del servizio B.
Soluzione 2: cattura l'errore nel servizio A e genera un errore molto più specifico del servizio
Pro: questo produce un errore molto più chiaro per il client
Contro: il Service A dovrà rilevare e aspettarsi che il Server B sia in grado di restituire un sacco di errori, aggiungendo l'accoppiamento tra il Servizio A e B.
Per come la vedo io, entrambe le soluzioni accoppiano ulteriormente ogni microservizio.