빨간색코딩

spring webflux와 armeria 살펴보기 (Mono, Flux, gRPC, Thrift) 본문

Spring

spring webflux와 armeria 살펴보기 (Mono, Flux, gRPC, Thrift)

빨간색소년 2020. 6. 19. 20:40

1. speing webflux 란?

  • 더 낮은 사양의 하드웨어, 더 적은 수의 스레드로 동시성을 처리하기 위함
  • 서블릿 스펙 3.1에서 논블로킹IO API를 지원하긴 하는데, 자꾸 동기(Filter, Servlet)나 블로킹(getParameter, getPart)에서 걸린다
  • spring 5.0 (boot 2.0) 부터 사용 가능

1-1. 특징

  • 서블릿과 이별 : DispatcherServlet(doGet, doPost) 이 없음
  • 기본 컨테이너가 tomcat -> netty (서블릿 스펙 3.1이상인 tomcat을 쓸 수는 있음)
  • project reactor : 절차형 -> 반응형, 코드가 의식의 흐름처럼 흘러감

 

1-2. Mono와 Flux

  • 몇 개나 흘려보낼 것인가?
  • mono : 0 or 1 (딱 한번)

  • flux : 0 or 1 or many (쭈욱)
    • 순서보장이 안된다

1-3. spring MVC vs webflux

2. Armeria

  • Asynchronous RPC/REST library built on top of Java 8, Netty, HTTP/2, Thrift and gRPC
  • 고성능 비동기 마이크로서비스를 손쉽게 제작할 수 있음
  • 단일 어플리케이션에서 단일 포트로 HTTP, gRPC, Thrift를 동시에 지원
    • spring webflux는 서블릿엔진이 아니기 때문에 thrift의 Tservlet을 사용할 수 없음, 별도로 서버구현체를 만들어야해서 포트 소모
  • gRPC, Thrift를 브라우저기반에서 테스트 가능
  • cf. 사용처 : zipkin, slack, twitter, kakaoPay 등

2-1. 동작원리

  • Armeria가 Spring WebFlux의 서버구현체를 대체 : ArmeriaReactiveWebServerFactory.java
  • ArmeriaWebServer 에 요청이 들어오면 분배
    • HTTP요청으로 들어오면 Spring WebFlux 로
    • gRPC요청이 들어오면 gRPC서비스로
    • Thrift요청이 들어오면 Thrift서비스로
  • Armeria가 네트워크 레벨을 핸들링하고 Spring은 Bean Container, DB Transaction 확보 용도로 공존
    • Spring에서 지원하지 않는 gRPC, Thrift등의 서빙을 Armeria가 관리

2-2. gRPC 란?

  • RPC는 원격 프로시저 요청 (Remote Procedure Call)의 약자로 gRPC는 Google에서 개발
  • 통신 프로토콜 : HTTP/2
  • 표현언어 : 프로토콜 버퍼
    • xml 이나 json은 사람이 읽을 수 있게 직렬화 하지만, 프로토콜 버퍼는 이진바이너리로 직렬화 => 매우 빨라짐

2-2-1. 특징

  • 로드밸런싱, 인증, 양방향 스트리밍 및 흐름 제어, 바인딩 차단 또는 차단 해제 및 취소 및 시간 초과 기능
  • 클라이언트에서 서버의 API호출을 메소드처럼 직접 할 수 있음 (MSA에서 강점인 듯?)
    • gRPC 클라이언트는 서버의 메소드의 stub을 작성
    • gRPC 서버는 인터페이스 제공

2-3. Thrift 란?

  • 다양한 언어를 지원하는 RPC 프레임워크, facebook 에서 개발
  • 데이타 타입 및 서비스 인터페이스를 간단한 정의 파일안에 제공하며, 컴파일러는 다른 언어간에 통신할 수 있는 RPC 클라이언트/서버의 코드를 생성

2-3-1. 특징

  • Sync, Async Server API 제공
  • 서블릿 제공(org.apache.thrift.server.TServlet)
  • 멀티쓰레드 지원 (org.apache.thrift.server.ThreadPoolServer : worker thread 지정)
Comments