2015-05-11 38 views
6

Mam stosunkowo nowy projekt, który wykorzystuje architekturę mikroserwisu. Czuję się dobrze pod względem wielkości i szczegółowości poszczególnych usług, z wyjątkiem lub naszej służby bezpieczeństwa.Architektura Microservice - domena między domenami

Mam trzy główne usługi, na przykład foo-service, bar-service i baz-service. Te usługi nigdy nie muszą się komunikować, ale wszystkie trzy usługi regularnie rozmawiają przez żądania HTTP do security-service. Chcę tego z różnych powodów przerwać. Największe jest to, że każde żądanie skierowane do moich indywidualnych usług powoduje zgłoszenie żądania do służby bezpieczeństwa, która może zmienić się w kilka dodatkowych przeskoków, gdy uwzględnisz równoważenie obciążenia, itd. Czytałem "Wzorce architektury oprogramowania" Marka Richardsa i zaleca w tych przypadkach udostępnianie baz danych i naruszanie DRY: skopiuj wymaganą funkcjonalność do każdej usługi. Mimo to używa tego przykładu w przypadku mniejszych klas "narzędziowych", które mogą nie mieć zastosowania w tym przypadku.

Usługa bezpieczeństwa nie jest tak duża, więc mogłabym zdecydowanie skopiować ją do każdej z pozostałych usług. Powiedział, że jest wystarczająco duży, że nie czuję się wspaniale kopiować i wklejać go - 314 "odpowiednich" linii kodu zgodnie z coveralls (java, więc jest o wiele więcej rzeczywistego kodu ;-). Mogłabym łatwo przekształcić go w moduł, który każda usługa przynosi, ale wtedy moje usługi mają wspólną zależność i to mnie ugryzło w przeszłości. Oczywiście kod bezpieczeństwa będzie się powiększał wraz z dodawaniem metod uwierzytelniania, ale nie odkrywamy koła, jeśli chodzi o auth, więc głównie integruje się z innymi bibliotekami i usługami uwierzytelniania. Oznacza to, że nie wyobrażam sobie, że ta konkretna baza kodu staje się ogromna.

Moje pytanie, czy powinienem skopiować i wkleić kod lub zbudować moduł, który przynosi każda usługa? Dzięki!

+1

To wydaje się być krzyżową sprawą, z której narodził się Siteminder. Powinien to być filtr lub podstawowe uwierzytelnienie na usługach, a nie dodatkowe przeskoki w sieci. – duffymo

+0

Filtrujemy zgłoszenia serwisowe. Po prostu na podstawowym teraz (jest to nowy), ale mają wymagania, aby użyć konkretnych oauth dostawców później. Najważniejszą rzeczą, jaką obecnie robi usługa ochrony, jest zarządzanie uprawnieniami za pośrednictwem grup zabezpieczeń. Tak naprawdę jest to funkcja, która moim zdaniem będzie musiała przejść do każdej usługi (aby wszyscy nie mieli dostępu do usługi zabezpieczeń w celu autoryzacji). – eric

+1

co konkretnie robi usługa bezpieczeństwa, uwierzytelnianie lub autoryzacja? – miraculixx

Odpowiedz

4

chcę to zatrzymać dla różnych reasons- największym jest to, że każda prośba do moich poszczególnych usług ikra wniosek do służby bezpieczeństwa, która może prowadzić do kilku dodatkowych chmielu po odpowiadają za równoważenie obciążenia, etc .

Plusy pozostawiając jako oddzielna usługa:
- Zmiany w logice biznesowej bezpieczeństwa wpływają tylko służby bezpieczeństwa i nie ma potrzeby zmiany do usług klienckich.

PROWY przenoszenia logiki bezpieczeństwa do usług klienta:
- Prędkość/wydajność.
- Mniejsza liczba usług do zarządzania może oznaczać zmniejszenie kosztów operacyjnych.

Prędkość (wydajność) może tutaj przeważyć, w zależności od wymagań, ale będzie to związane ze zwiększonymi kosztami rozwoju.

Jeśli przeniesiesz logikę zabezpieczeń do własnego modułu wielokrotnego użytku, który może być wywoływany z innych usług, po prostu wykonuj dobrą robotę w hermetyzowaniu go i postępuj zgodnie z podstawową konstrukcją spójności sprzężenia zwrotnego. Poza tym, ponieważ będziesz musiał bronić tej decyzji przez wiele lat, proszę dobrze wyjaśnić, aby Twój przyszły szef nie zwolnił cię, gdy zapyta, dlaczego tak wiele kosztuje aktualizacja logiki bezpieczeństwa. Czy benchmarki są łatwo dostępne, ludzie kłamią, liczby nie. Miałem kiedyś wyniki jednej strony testu porównawczego dla nowego DB, o które prosiłem. Wiele razy pytano mnie od różnych osób, dlaczego poszedłem z nowym DB ... Po prostu wysłałem im jedną stronę i nigdy nie usłyszałem od tej osoby dalszych pytań.

Ten film może czujesz się lepiej w odniesieniu STO bucking trend: https://www.youtube.com/watch?v=StCrm572aEs

To pokazuje, w jaki sposób i dlaczego Netflix bucked trend, a nie iść z architekturą odpoczynku dla ich API. Zasadniczo architektura jest klientem wymagań i kosztów, a nie odwrotnie.

EDYCJA: Kolejny duży PRO dla pozostawienia jako usługi jest to, że konieczne może być utworzenie wielu modułów dla każdego wspieranego języka. W mojej pracy nasze usługi bezpieczeństwa są używane przez usługi klienckie w wielu językach.

+0

Jedna rzecz, która od czasu do czasu zadźwięczała mi w głowie, jeśli zmienię szybkość, czy jestem przedwcześnie optymalizująca? Te rzeczy są od podstaw i obecnie są bardzo wydajne, czy mogę tracić czas, gdy innym aspektem systemu, którego nawet nie znam, będzie faktyczny zabójca wydajności? – eric

+1

Tak, można to uznać za przedwczesną optymalizację. Tak, możesz tracić czas. Jest dobre powiedzenie, które przychodzi na myśl "żaden dobry uczynek nie jest karany". –

1

Jeśli umieścisz logikę zabezpieczeń w innych usługach, to naprawdę nie możesz nazwać jej architekturą mikroserwisu, prawda? Rozumiem również, że posiadanie tego dodatkowego i obłudnego serwera w obie strony dla każdej innej usługi może być trochę uciążliwe. Oto kilka możliwych do rozważenia alternatyw.

Umieść wszystkie cztery z tych mikroserwisów za zaporą. Udostępnić publiczną usługę, która korzysta z usługi zabezpieczeń w celu sprawdzenia przychodzącego żądania, a następnie wywołać inne usługi, jeśli żądanie jest ważne dla danych poświadczeń. Pozostałe usługi zawsze ufają dzwoniącemu, który jest usługą posiadaną i obsługiwaną w zaufanym środowisku.

Jeśli jest to przypadek użycia "zapomnij i zapomnij" i czujesz się nieswojo z powodu tej publicznej usługi, która ma zbyt wiele obowiązków orkiestrowych, rozważ tę alternatywę. Usługa skierowania publicznego wysyła żądanie przychodzące do nieautoryzowanej kolejki w brokerze komunikatów. Usługa bezpieczeństwa zużywa się z tej kolejki i przeprowadza uwierzytelnianie. Jeśli jest poprawny, usługa ochrony kolejkuje komunikat w autoryzowanej kolejce. Dowolna liczba mikroserwisów po ich pobraniu z autoryzowanej kolejki i wykonaniu ich odpowiedniej operacji.

0

Bezpieczeństwo jako oddzielna usługa, której potrzebujesz do każdego żądania, ponieważ opisujesz to bardzo zły pomysł. Mogę odnieść się do podstawowych idei modularyzacji, które Parnas tak wymownie opisał w On the Criteria To Be Used in Decomposing Systems into Modules. Brak sprzężenia oznacza również brak spójności, a inżynieria polega na znalezieniu odpowiedniego punktu na tej osi.

W przeciwieństwie do powszechnego przekonania, mikro-usługi muszą być dość duże, aby móc skalować. Ograniczenia skalowalności są głównie w komunikacji, więc muszą być zaprojektowane, aby nie rozmawiać. Problem dotyczy głównie (chyba że jesteś netflix), a nie przepustowości, ale opóźnienia.

Twój moduł zabezpieczeń musi być bliżej Twoich usług niż żądanie HTTP, podłączony moduł może być w porządku.