Web/spring-boot

[SPRING] 마이크로서비스(MSA) 간 통신방법

부에나온다 2022. 8. 10. 15:11

1.  OkHttp

     - Rest API, HTTP 통신을 간편하게 사용할 수 있도록 만들어진 자바 라이브러리

     - 'Square' 라는 회사가 만든 라이브러리이며, Retrofit이라는 라이브러리의 기본이 된다.

     - 동기/비동기 방식으로 구현이 가능하다.

동기방식

OkHttp 동기 통신

     - 3초의 응답시간이 걸리는 URL 을 호출했을경우 응답대기를 하기 때문에 각 9초의 시간이 걸리는것을 확인할 수 있다.

9초의 시간이 걸린다.

비동기방식

OkHttp 비동기 통신

     - 3초의 응답시간이 걸리는 URL 을 호출했을경우 응답대기를 하지않기 때문에 1초의 시간도 걸리지 않는것을 확인할 수 있다.

호출만 하기 때문에 스레드를 효율적으로 쓸수가 있다.

2. Feign

     - Netfilx에서 만든 HTTP client binder로서 기존 http client 작성을 쉽게 만들어주는 라이브러리

     - interface를 작성하고 annotation을 붙여서 쉽게 사용할 수 있기 때문에, HTTP API를 균일하게 바인딩 하여 복잡성을 줄일수 있다.

 

Feign을 사용하기 위해서는 root package에 등록하여야 한다.
인터페이스를 적용 해줍니다.
header 정보 설정

     - @FeignClien 어노테이션을 사용해서 빈의이름을 적어주고, 헤더를 넣고싶은경우 configuration에 헤더를 추가해줍니다. 

        url은 통신 할 url을 입력해주면됩니다.

 

테스트코드로 요청을 하는 로직

3. RestTemplate

     - Spring에서 지원하는 객체로 간편하게 Rest 방식 API를 호출할 수 있는 Spring 내장 클래스

     - Spring 3.0부터 지원되었고, json, xml 응답을 모두 받을 수 있다.

     - Rest API 서비스를 요청 후 응답 받을 수 있도록 설계되어있으며 HTTP 프로토콜의 메소드

       (ex. GET, POST, DELETE, PUT)들에 적합한 여러 메소드들을 제공합니다.

     - 비동기 방식은 지원하지 않고 있으며, Blocking I/O 기반의 동기방식을 사용하는 템플릿

간단한 RestTemplate Get 통신 구현

     - 동기방식으로 구현되기 때문에 동일하게 3번 호출 시 9초의 시간이 걸리는 것을 확인할 수 있다.

4. WebClient

    - 스프링에서 제공하는 RestTemplate를 대체하는 HTTP클라이언트

    - 기존의 동기 API를 제공할 뿐만 아니라, 논블로킹 및 비동기 접근 방식을 지원해서 효율적인 통신이 가능합니다.

    - WebClient는 요청을 나타내고 전송하게 해주는 빌더 방식의 인터페이스를 사용하며,

       외부 API로 요청을 할 때 리액티브 타입의 전송과 수신을 합니다. (Mono, Flux)

    - Spring 5.x 버전부터 지원합니다.

 

     - WebClient를 생성하는 방법은 2가지로 존재한다.

  • WebClient.create()
  • WebClient.builder()

builder와 함께 사용 가능한 options은 다음과 같다.

  • uriBuilderFactory : base URL을 사용하기 위한 Customized UriBuilderFactory
  • defaultUriVariables : URI 템플릿을 확장할 때, 사용하는 기본 값
  • defaultHeader : 모든 요청에 대한 기본 헤더
  • defaultCookie : 모든 요청에 대한 쿠키 설정
  • defaultRequest : 모든 요청을 customize하기 위한 Consumer
  • filter : 모든 요청에 대한 Client filter
  • exchangeStrategies: HTTP message reader/writer customization
  • clientConnector : HTTP client library settings

동기 방식

    - 기본적으로 WebClient는 비동기 방식을 지원하지만 동기식으로 작동해야할 때도 있다.

    - 그 방법으로 block() 이나 toStream()을 사용하면 된다.

    - 그러면 결국 반환될때까지 기다리게 되고, 결과가 완전히 도착해야 다음과정으로 넘어간다.

 

3번 호출할 경우 총 9초의 시간이 걸리는 것을 확인할 수 있다.

비동기 방식 

subscribe해서 비동기 nonBlocking 방식으로 구현

 

 

 

 

 

 

 

 

 

     - 이렇게 100번의 요청을하는데 3초정도의 시간밖에 걸리지 않는것을 확인할 수 있다.