[java] 자바 마이크로서비스에서 동기식과 비동기식 통신을 어떻게 구현하는가?

마이크로서비스 아키텍처에서 효율적인 통신은 매우 중요합니다. 자바를 사용하여 마이크로서비스 간의 통신을 구현하는 방법에 대해 알아보겠습니다.

동기식 통신 구현하기

동기식 통신은 호출하는 서비스가 응답을 받을 때까지 대기하는 방식입니다. 자바에서 동기식 통신을 구현하기 위해 다음 단계를 따를 수 있습니다.

  1. HTTPURLConnection 또는 Apache HttpClient와 같은 라이브러리를 사용하여 요청을 보내기 위한 HTTP 클라이언트를 생성합니다.
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    URL url = new URL("http://localhost:8080/api/service");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    connection.setRequestProperty("Content-Type", "application/json");
    
    int responseCode = connection.getResponseCode();
    
  2. 서버로부터의 응답을 받기 위해 응답 스트림을 사용합니다.
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String inputLine;
    StringBuilder response = new StringBuilder();
    
    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();
    
    String responseBody = response.toString();
    

비동기식 통신 구현하기

비동기식 통신은 호출하는 서비스가 응답을 기다리지 않고도 다른 작업을 수행할 수 있는 방식입니다. 비동기식 통신을 구현하는 자바에서는 다음과 같은 방법을 사용할 수 있습니다.

  1. CompletableFuture와 같은 자바의 내장 라이브러리를 사용하여 비동기식 요청을 보냅니다.
    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.util.concurrent.CompletableFuture;
    
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://localhost:8080/api/service"))
            .build();
    
    CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
    
    // 다른 작업 수행
    
    // 응답 결과를 처리하고 완료 상태를 확인합니다.
    future.thenApply(HttpResponse::body)
          .thenAccept(responseBody -> System.out.println("Response: " + responseBody))
          .join();
    
  2. 콜백 방식을 사용하여 비동기식 요청을 처리합니다.
    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.ExecutionException;
    
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://localhost:8080/api/service"))
            .build();
    
    CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
    
    future.whenComplete((response, throwable) -> {
        if (throwable != null) {
            // 에러 처리 로직
        } else {
            String responseBody = response.body();
            // 응답 처리 로직
        }
    });
    
    // 다른 작업 수행
    
    try {
        future.get(); // 전체 작업이 완료될 때까지 대기
    } catch (InterruptedException | ExecutionException e) {
        // 에러 처리 로직
    }
    

결론

마이크로서비스 아키텍처에서 동기식과 비동기식 통신은 각자의 장점과 특징을 갖고 있습니다. 동기식 통신은 간단하고 직관적이지만, 호출하는 서비스가 응답을 기다려야 하기 때문에 대기 시간이 발생할 수 있습니다. 비동기식 통신은 호출하는 서비스가 응답을 기다리지 않아도 되기 때문에 다른 작업을 동시에 처리할 수 있지만, 콜백이나 CompletableFuture와 같은 추가적인 구현이 필요합니다. 따라서 특정 상황과 요구사항에 맞게 동기식 또는 비동기식 통신 방식을 선택하여 마이크로서비스 간의 효과적인 통신을 구현할 수 있습니다.


참고 자료: