[SPRING] 마이크로서비스(MSA) 간 통신방법
1. OkHttp
- Rest API, HTTP 통신을 간편하게 사용할 수 있도록 만들어진 자바 라이브러리
- 'Square' 라는 회사가 만든 라이브러리이며, Retrofit이라는 라이브러리의 기본이 된다.
- 동기/비동기 방식으로 구현이 가능하다.
동기방식
- 3초의 응답시간이 걸리는 URL 을 호출했을경우 응답대기를 하기 때문에 각 9초의 시간이 걸리는것을 확인할 수 있다.
비동기방식
- 3초의 응답시간이 걸리는 URL 을 호출했을경우 응답대기를 하지않기 때문에 1초의 시간도 걸리지 않는것을 확인할 수 있다.
2. Feign
- Netfilx에서 만든 HTTP client binder로서 기존 http client 작성을 쉽게 만들어주는 라이브러리
- interface를 작성하고 annotation을 붙여서 쉽게 사용할 수 있기 때문에, HTTP API를 균일하게 바인딩 하여 복잡성을 줄일수 있다.
- @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 기반의 동기방식을 사용하는 템플릿
- 동기방식으로 구현되기 때문에 동일하게 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()을 사용하면 된다.
- 그러면 결국 반환될때까지 기다리게 되고, 결과가 완전히 도착해야 다음과정으로 넘어간다.


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