programing

서로 다른 마이크로 서비스 간의 데이터 검증

instargram 2023. 7. 21. 20:33
반응형

서로 다른 마이크로 서비스 간의 데이터 검증

저는 이미 그것에 대한 많은 주제를 읽었지만, 여전히 더 나은 접근법을 찾지 못했습니다.

나는 있습니다User.User이 수 .Posts사용자와 게시물은 서로 다른 마이크로 서비스입니다.스프링 부츠를 사용하고 있습니다.

프런트 엔드가 나에게 전화를 걸 때.Posts에서 마크서전송을 중POST요▁to./posts/user/1주어진 것인지 확인해야 합니다.userId내 위에 존재합니다.Users 않다면, 에 사용자가하지 않는다는 을 알리는 .아니오인 경우 사용자가 존재하지 않음을 프론트엔드에 알리는 예외를 던집니다."예"인 , 을 "예", "예"로합니다.Post.

문제는 백엔드에서 이 정보를 어떻게 확인해야 하는가 하는 것입니다.javascript는 클라이언트 측이며 악의적인 사용자가 이 검사를 무시할 수 있기 때문에 프런트 엔드에 대한 이러한 책임을 허용하지 않습니다.

옵션:

  • 마이크로서비스 간 REST 통신. (지정된 ID가 자신의 쪽에 있는지 묻는 마이크로서비스 호출 사용자 microservice 호출 게시)
  • Users microservice의 데이터베이스에 대한 Posts microservice 액세스 권한 부여

그들 사이의 의사소통이 커플링을 만들 것이라는 것은 이해하지만, 사용자 데이터베이스에 대한 Posts 권한을 부여하는 것이 최선의 선택인지는 잘 모르겠습니다.

어떤 옵션이든 자유롭게 제안하세요.

프로세스 간 통신을 수행할 수 있는 옵션이 있습니다.Post그리고.User을통마로서스비크를 통한 RESTful접근.

이 단지 은 만약신당이단자존확응사재원면않답람다합다는니선당야해호다신을음은하지을는하인고하지를의원▁▁in▁in▁usingfer다▁resource합▁per▁body니▁then▁the당야▁you만▁if▁should약▁you▁case▁want▁response▁don▁just▁of▁existence▁the▁any▁check를 사용하는 것이 좋습니다.HEAD methodhttp입니다. 따서 API 점트되에서 은 다음과 같습니다.User마이크로서비스는 다음과 같이 표시됩니다.

HEAD  user/{userId}

『 』에서 이 API를 합니다.Post마이크로 서비스

사용자가 있는 경우 200 / 확인을 반환합니다.

사용자가 없는 경우 404 / 찾을 수 없음 반환

자세한 내용을 보려면 여기 및 여기를 클릭하십시오.HEAD방법 사용 및 사용 사례.

보안 계층이 있는 경우 사용자 액세스 토큰을 사용하여 올바른 사용자에 대한 요청이 처리되도록 할 수 있습니다. 이는 토큰을 검증하고 사용자가 토큰을 가지고 있다면 사용자가 존재한다는 사실에 의존함으로써 수행될 수 있습니다. (사용자가 존재하는지 여부는 중요하지 않습니다.)

그 외의 논리에 대해서는, 그가 게시할 수 있는지 또는 기타 제한 사항을 사용자 서비스에 전화를 걸어야 하는지 확인하고 싶다고 합니다.

데이터베이스에 대한 액세스 권한을 부여하는 것에 대해 말하자면, 그것은 마이크로서비스의 한 가지 기본 지침에 위배될 것입니다.이렇게 하면 사용자와 사용자 사이에 긴밀한 결합이 형성됩니다.이 경우 이 요청을 처리하는 방법을 결정할 수 있는 사용자 서비스를 호출해도 됩니다.사용자 서비스는 캐싱 또는 기타 메커니즘을 통해 SLA 내에서 쿼리에 응답할 수 있는 방법을 제공해야 합니다.

한 가지 더 살펴볼 수 있는 것은 BFF(Backend for Frontend)입니다. 백엔드 서비스를 프론트엔드에 노출하거나 논리를 추가해서는 안 된다고 올바르게 말씀하셨습니다.그러나 종종 프런트엔드 페이지는 다른 백엔드 서비스를 통해 동일한 페이지의 콘텐츠에 응답하는 것을 받아들이기 어려울 수 있으며 이러한 쿼리를 스티치할 수 있는 논리가 있을 수 있으며 BFF를 사용할 수 있습니다.프런트 엔드가 특정 페이지에 대해 단 한 번의 통화(또는 그 이하의 통화)를 수행하는 동시에 백엔드 서비스를 내부에 숨겨야 하는 이러한 작업을 수행하는 백엔드 서버(내 경우 노드).

맞습니다, 아마 REST 서비스라 UI에서만 요청을 보낼 수 있는 것이 아니라 백엔드에서 확인을 하셔야 할 것 같습니다.

서비스를 구현했다고 가정합니다.

@Service
class UsersServiceImpl implements UsersService {

  private final Users users;

  public UsersServiceImpl(Users users) {
    this.users = users;
  }

  @Override
  public void addPost(long userId, Post post) {
    User user = users.get(userId);
    if (user == null) {
      throw new UserNonExistent(userId);
    }
    user.addPost(post);
  }
}

어디에Users사용자 데이터베이스를 나타내는 인터페이스입니다.UserNonExistent런타임입니다.예외.그런 다음 컨트롤러에서 다음을 수행할 수 있습니다.

@RestController
class UsersController {

  private final UsersService usersService;

  public UsersController(UsersService usersService) {
    this.usersService = usersService;
  }

  @PostMapping("/posts/user/{userId}")
  public void addPostToUser(@PathVariable String userId, @RequestBody Post post) {
    usersService.addPost(userId, post);
  }

  @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "User does not exist")
  @ExceptionHandler({UsersService.UserNonExistent.class})
  public void handleUserNonExistentException() {
    // Nothing to do
  }
}

제공된 사용자 ID가 잘못된 경우handleUserNonExistentException()메서드가 호출되고 잘못된 요청 HTTP 상태 코드를 반환합니다.

언급URL : https://stackoverflow.com/questions/52298830/data-validation-across-different-microservices

반응형