Popularnym wyborem architektury wysokiego poziomu we współczesnym programie jest system mikrousług oparty na REST. Ma to kilka zalet, takich jak luźne połączenie, łatwe ponowne użycie, ograniczone ograniczenie technologii, które można zastosować, wysoka skalowalność itp.
Ale jednym z problemów, które przewiduję w takiej architekturze, jest słaby wgląd w to, jakie są zależności aplikacji. Załóżmy na przykład, że mam aplikację, która codziennie korzysta z jednego zestawu połączeń REST. Ta aplikacja korzysta również z drugiego zestawu połączeń REST, ale tylko raz na kwartał. Gdybym miał zeskanować dzienniki z ostatniego tygodnia, zobaczyłbym wszystkie codzienne połączenia, ale prawdopodobnie nie widziałbym połączeń kwartalnych. Jeśli chodzi o czas na refaktoryzację, połączenia kwartalne są narażone na wysokie ryzyko zerwania.
Jakie wzorce lub narzędzia można zastosować w celu zmniejszenia tego ryzyka i zapewnienia lepszego wglądu w zależności między luźno sprzężoną architekturą?
źródło
Odpowiedzi:
Utrzymanie zgodności interfejsów API i możliwości biznesowych z poprzednimi wersjami.
Badania zdrowia.
Moja usługa jest klientem dla twoich miesięcznych możliwości API. Ale moja usługa jest klientem twojego interfejsu API za każdym razem, gdy moja usługa jest uruchomiona. Tak więc moja usługa budzi się co 10 minut lub cokolwiek innego, łączy się z miesięcznym interfejsem API i uruchamia protokół, aby upewnić się, że możliwości, których potrzebuje moja usługa, są nadal dostępne.
Więc twoje logi pokażą ci, jak często sprawdzana jest inna usługa, aby zobaczyć, czy każda konkretna usługa, którą oferujesz, jest nadal dostępna, tak jak pokazuje, jak często faktycznie używana jest każda z oferowanych usług.
źródło
Istnieją co najmniej dwie lokalizacje, w których można znaleźć zależności:
Konfiguracja. Dostęp do zewnętrznych interfejsów API wymaga znajomości informacji o każdym z tych interfejsów API. Identyfikatory dostępu, tajne klucze, punkty końcowe. Wszystko to nie może być w kodzie, ponieważ takie informacje się zmienią. Jako przykład niedawno rozpocząłem migrację wszystkich moich mikrousług do protokołu SSL. Oznacza to, że każda usługa, która opiera się na migrowanej, powinna zostać ponownie skonfigurowana, aby wskazywała na
https://
wersję zamiasthttp://
. Cieszę się, że punkty końcowe były w konfiguracji, a nie na stałe.Interfejsy Nie masz dostępu do usługi bezpośrednio z kodu, ponieważ wersja interfejsu API ulegnie zmianie, a nawet możesz zdecydować się na przejście na inny interfejs API. Zamiast tego tworzysz warstwę abstrakcji i używasz zależności poprzez interfejs. Postępując zgodnie ze wspólną logiką podczas tworzenia tych interfejsów, możesz ułatwić sobie późniejsze wyszukiwanie zależności.
Do tego służą testy regresji.
Nie możesz po prostu patrzeć na kod, zmieniać go i ufać sobie, że nic nie zostało zepsute. To nie zadziała w architekturze mikrousług. To również nie zadziała w aplikacji monolitycznej. Kompilator może wychwycić niektóre błędy, które wprowadzisz podczas modyfikowania kodu. W niektórych językach, takich jak Haskell, kompilator może być bardzo zdolny i wychwytywać większość błędów; kompilatory dla języków głównego nurtu jednak niewiele dla ciebie zrobią. Jeśli nie masz testów, masz problemy. Obecność mikrousług jest nieistotna.
źródło
Interfejsy API REST są luźno określone, więc w pewnym momencie przydatne może być przejście do gRPC, google protobufs lub Thrift w celu zdefiniowania interfejsu RPC, a następnie jego wersji.
źródło