은 두 개의 엔티티를 사용하여 응용 프로그램을 고려복합 마이크로 서비스 요청에서 어떻게 확인을 처리합니까?
User
Passport
(포함 인증 자격 증명, 즉 암호)
그리고 두 개의 내부 microservices (예 : 이름과 같은 기본적인 사용자 데이터 포함) :
를 생성 및 사용자와 바 관리를위한UserService
(책임User
엔티티가UserService
및Passport
엔티티에 속하는
사용자 인증 및 암호 처리를 담당 SIC 데이터)
AuthService
()는 AuthService
속한다. 두 가지 서비스는 서로 다른 작업 (예 : , 프로필 데이터 및 인증)을 해결해야하므로 구분해야합니다. ,
- 이메일
- 이름
- 비밀이 양식은
GatewayService
에 HTTP 요청을 트리거
:
또한, 우리는 세 개의 필드로 등록 양식을 고려 이는 애플리케이션에 대한 모든 요청을 가로 챈 다음 내부 마이크로 서비스로 라우팅합니다 (또는 구성/집계). 게이트웨이 서비스는 모든 형태의 데이터 요청을 수신 할 때
지금, 그것은 다음을 수행해야합니다 : 새 사용자를 만들 수
- 전화
UserService
(그것은 생성userId
로 응답합니다). - 새로 작성한 사용자의 여권을 만들려면
AuthService
으로 전화하십시오. 1 단계에서userId
이 수신되고 원래 요청에서password
필드가 필요합니다.
매우 간단한 것처럼 보이지만, AuthService
을 2 단계에서 사용할 수 없다면 어떻게됩니까? 우리는 어떻게 든 그 요청을 분리해야 할 것입니다!
일반적인 접근 방식은 궁극적 인 일관성을 사용하고 비동기 호출을 통해 Passport
엔티티를 만드는 것입니다. 우리는이 요청을 대기열에 배치하고 별도의 서비스로 처리 할 수 있습니다. 스텝 1은 즉시 클라이언트에 응답을 반환 할 수 있도록이를 위해 우리는 대신 단계 # 2, 그것은에 userId
및 password
을 통과하는 AuthService
에 대한 비동기 요청을 보냅니다.
그러나, 무엇 password
필드가 제대로 (휴식 유효성 검사 규칙) 포맷되지 않은 경우?유효성 검사 논리는 AuthService
에만 나타나므로 전화가 걸려 올 때까지 암호가 정확한지 여부를 알 수 없습니다. 이제는 요청이 비동기 적으로 처리되므로 사용자에게 연락하여 암호를 수정하도록 요청할 수 없습니다.
그럼 어떻게 마이크로 서비스 응용 프로그램에 분산 복합 요청의 유효성 검사를 올바르게 처리합니까?
순진 솔루션은
GatewayService
자체에 유효성 검사 논리를 이동하는 것입니다,하지만 그것은 지방하게하고AuthService
에서 비즈니스 로직을 누출 때문에 선수는 오늘 컨디션이 좋습니다.또 다른 아이디어는 암호 검증을위한 추가 방법을 제공하고 # 1과 # 2 단계 전에 호출하는 것입니다. 실행 가능한 솔루션 인 것처럼 보이지만 마이크로 서비스의 각 비즈니스 방법에 대해 두 가지 방법, 즉 사전 유효성 검사 및 실제 작업을위한 두 가지 방법이 필요합니다. 또한 유효성 검사와 작업 사이에 시간 간격이 있으므로 작업이 실제로 수행 될 때 더 일찍 올바른 값이 잘못 될 수 있습니다.
복합 요청을 피하기 위해 양식을 두 개로 나눠서 개인 데이터를 요청하고 계정을 만든 후 사용자에게 암호를 요청할 수 있습니다. 그러나 이로 인해 보안 문제가 발생할 수 있으며 사용자 계정은 다음 사람을 추측 할 수있는 다른 사람이 가로 챌 수 있습니다.
userId
. 몇 가지 추가 보안 토큰을 사용할 수 있지만 서비스에 이상한 기능을 도입하고 전체 설정을 더 복잡하게 만듭니다.또한이 접근법은 문제를 피하는 시도처럼 보입니다. 복합 요청을 항상 피할 수는 없습니다.
풀 스케일 분산 트랜잭션을 사용할 수 있습니다. 2PC이지만 시스템을 극적으로 복잡하게 만들고 처음에는 MSA 사용을 완화합니다.
최종 아이디어는 두 서비스를 함께 병합하는 것이지만, 마이크로 서비스 아키텍처에서는 그렇게 할 수 없습니다.