2

은 두 개의 엔티티를 사용하여 응용 프로그램을 고려복합 마이크로 서비스 요청에서 어떻게 확인을 처리합니까?

  • User
  • Passport (포함 인증 자격 증명, 즉 암호)

그리고 두 개의 내부 microservices (예 : 이름과 같은 기본적인 사용자 데이터 포함) :

를 생성 및 사용자와 바 관리를위한
  • UserService (책임 User 엔티티가 UserServicePassport 엔티티에 속하는

사용자 인증 및 암호 처리를 담당 SIC 데이터)

  • AuthService()는 AuthService 속한다.

    두 가지 서비스는 서로 다른 작업 (예 : , 프로필 데이터인증)을 해결해야하므로 구분해야합니다. ,

    • 이메일
    • 이름
    • 비밀이 양식은 GatewayService에 HTTP 요청을 트리거

    :

    또한, 우리는 세 개의 필드로 등록 양식을 고려 이는 애플리케이션에 대한 모든 요청을 가로 챈 다음 내부 마이크로 서비스로 라우팅합니다 (또는 구성/집계). 게이트웨이 서비스는 모든 형태의 데이터 요청을 수신 할 때

    지금, 그것은 다음을 수행해야합니다 : 새 사용자를 만들 수

    1. 전화 UserService (그것은 생성 userId로 응답합니다).
    2. 새로 작성한 사용자의 여권을 만들려면 AuthService으로 전화하십시오. 1 단계에서 userId이 수신되고 원래 요청에서 password 필드가 필요합니다.

    매우 간단한 것처럼 보이지만, AuthService을 2 단계에서 사용할 수 없다면 어떻게됩니까? 우리는 어떻게 든 그 요청을 분리해야 할 것입니다!

    일반적인 접근 방식은 궁극적 인 일관성을 사용하고 비동기 호출을 통해 Passport 엔티티를 만드는 것입니다. 우리는이 요청을 대기열에 배치하고 별도의 서비스로 처리 할 수 ​​있습니다. 스텝 1은 즉시 클라이언트에 응답을 반환 할 수 있도록이를 위해 우리는 대신 단계 # 2, 그것은에 userIdpassword을 통과하는 AuthService에 대한 비동기 요청을 보냅니다.

    그러나, 무엇 password 필드가 제대로 (휴식 유효성 검사 규칙) 포맷되지 않은 경우?유효성 검사 논리는 AuthService에만 나타나므로 전화가 걸려 올 때까지 암호가 정확한지 여부를 알 수 없습니다. 이제는 요청이 비동기 적으로 처리되므로 사용자에게 연락하여 암호를 수정하도록 요청할 수 없습니다.

    그럼 어떻게 마이크로 서비스 응용 프로그램에 분산 복합 요청의 유효성 검사를 올바르게 처리합니까?

    1. 순진 솔루션은 GatewayService 자체에 유효성 검사 논리를 이동하는 것입니다,하지만 그것은 지방하게하고 AuthService에서 비즈니스 로직을 누출 때문에 선수는 오늘 컨디션이 좋습니다.

    2. 또 다른 아이디어는 암호 검증을위한 추가 방법을 제공하고 # 1과 # 2 단계 전에 호출하는 것입니다. 실행 가능한 솔루션 인 것처럼 보이지만 마이크로 서비스의 각 비즈니스 방법에 대해 두 가지 방법, 즉 사전 유효성 검사 및 실제 작업을위한 두 가지 방법이 필요합니다. 또한 유효성 검사와 작업 사이에 시간 간격이 있으므로 작업이 실제로 수행 될 때 더 일찍 올바른 값이 잘못 될 수 있습니다.

    3. 복합 요청을 피하기 위해 양식을 두 개로 나눠서 개인 데이터를 요청하고 계정을 만든 후 사용자에게 암호를 요청할 수 있습니다. 그러나 이로 인해 보안 문제가 발생할 수 있으며 사용자 계정은 다음 사람을 추측 할 수있는 다른 사람이 가로 챌 수 있습니다. userId. 몇 가지 추가 보안 토큰을 사용할 수 있지만 서비스에 이상한 기능을 도입하고 전체 설정을 더 복잡하게 만듭니다.

      또한이 접근법은 문제를 피하는 시도처럼 보입니다. 복합 요청을 항상 피할 수는 없습니다.

    4. 풀 스케일 분산 트랜잭션을 사용할 수 있습니다. 2PC이지만 시스템을 극적으로 복잡하게 만들고 처음에는 MSA 사용을 완화합니다.

    5. 최종 아이디어는 두 서비스를 함께 병합하는 것이지만, 마이크로 서비스 아키텍처에서는 그렇게 할 수 없습니다.

  • 답변

    0

    # 5, 난 정말 당신이 어떻게 든 여기에 하나 개의 서비스 (포인트 5), 두 작업을 담당한다 "UserManagementService"의 종류에 병합하여 원칙의 끔찍한 위반을 저지르고 있는지 표시되지 않습니다에 대해서 ; 한 MS가 하나의 작업을 수행하고 잘 수행해야한다고 주장 할 수 있다고하더라도이 두 가지는 밀접하게 관련되어 있습니다.

    또 다른 옵션은 UserService를 AuthService의 동기화 클라이언트 (로드 균형 조정, 회로 차단기 사용, 하나의 인스턴스 가용성 보장)로 만드는 것입니다. 이는 기본적으로 "정상 모드에서 비밀번호 유효성 검사에 대한 의존성 주입과 동일합니다 "코드.

    녹색 필드 일 경우 이러한 두 가지 서비스에 익숙하지 않은 경우 일반적으로보다 간단한 첫 번째 구현을 수행하고 최적화를위한 충동에 저항하지 않아야합니다. 이는 시기상조이거나 부적절한 약정 인 경향이 있습니다. 원리/교리의 순결에 이르기까지. 자신이 소개 할 수있는 복잡성 (2PC)과 요구 사항을 알고 있습니다 ("사용자에게 다시 연락하여 암호를 수정하도록 할 수는 없습니다").

    1

    여기에 내 생각

    1입니다.사용자 서비스 - 사용자 이름, 암호 (해시), 이메일 및 기타 프로파일 데이터를 포함하는 사용자의

    창조에 대한 책임을 져야 사용자의

    유효성 검증 규칙에 대한 입력 데이터의

    검증 그 암호 사용

    프로

    프로파일 데이터

    상기 ADITION가 용이

    발견하고 한 곳

    2. 인증 서비스에 하나의 요청에

    사용자와 관련된 로그인을 사용자 validatng하는 사용자 서비스를 통해 성공적인 사용자 확인에 따라 토큰을 생성 할 경우에만 책임을 져야한다

    이러한 토큰은 생태계의 다른 모든 서비스에 의한 추가 처리에 사용되어야하며 적절한 권한을 부여해야합니다.

    pros

    향후 사용자 인증 및 권한 부여가 필요한 서비스 추가는 독립적으로 수행 할 수 있으며 보안 토큰 만 필요합니다.

    이전 토큰을 기반으로 토큰을 생성하는 것은 쉽습니다. 토큰이 만료 될 때마다 사용자 이름과 암호를 입력 할 필요가 없습니다.

    0

    # 5에 동의합니다. UserService에 액세스하는 것은 항상 AuthService와 관련이 있으며 관련 데이터에 액세스하기 때문에 두 서비스에는 많은 종속성이 있습니다. 패스를 분리하는 경우 공유 논리를 분리해야 할 수도 있습니다. AuthService (자격 증명 유효성 검사 후) 또는 UserService (등록 후)에서 userID를받는 작업이있을 수 있습니다.

    또한 AuthService가 없으면 사용자가 이미 등록했거나 로그인 할 수없는 경우와 같이 다른 시나리오에 대한 질문이 제기됩니다. 어떻게 처리합니까? 오류 메시지가 표시되면 왜 등록하지 않습니까? .. 귀하의 요구 사항에 대한 더 많은 생각을하기위한 질문.

    건배