web/마이크로서비스
Spring reactor Mono와 Flux 정리
지금까지 Spring5에서 추가되었던 리액트 프로그램을 사용하여 간단한 프로그램을 만들어 봤지만 정확하게 Mono와 Flux에 차이와 정의를 정리하지 못한 것 같다. 이번기회에 두 개의 정확한 차이와 사용방법등을 정리해보자. 리액티브 프로그래밍 비동기 블록킹 프로세스로 동작하는 애플리케이션을 논블록킹 프로세스로 동작하기 위해서 지원하는 프로그래밍. (현재 node.js의 동작방식과 유사) 기존 Spring 블록킹 방식 웹에서 서버에 요청이 왔을때 서버는 요청에 대한 적절한 응답을 보내야 하는데 만약 작업이 오래 걸릴 경우에는 요청에 대한 응답이 모두 종료될 때까지 블록킹된다. Spring에서는 그래서 동시 요청 처리를 위해서 멀티 thread를 지원한다. 그러면 하나의 작업이 thread에서 진행되고 다..
마이크로서비스 역량 모델
마이크로 서비스 구현에 필요한 역량은 상황에 따라 다를 수 밖에 없다. 그래서 마이크로서비스 설계 시 필요한 역량 모델에 대해 정리해보자. 마이크로서비스의 역량 모델은 크게 4 개의 영역으로 분류할 수 있다. 핵심역량지원역량인프라스트럭처 역량프로세스 및 통제 역량 1. 핵심역량 (Core capabilities)- 핵심 역량은 하나의 마이크로서비스 안에 패키징 되는 컴포넌트이다. 이곳에서 서비스 리스너, 실행 라이브러리, 서비스 구현 코드, 서비스 API와 종단점이 들어있다. ※ 서비스 리스너와 라이브러리서비스 리스너는 마이크로 서비스로 들어오는 서비스 요청을 접수하는 종단점 리스너이다.주로 사용 되는 리스너는 AMQP나 JMS 같은 메시지 리스너가 주로 사용된다. ※ 저장 기능데이터를 저장 하는 RDB..
마이크로서비스 조립성 및 정리
마이크로서비스의 조립성은 서비스 디자인 원칙의 하나이다. 서비스를 어떻게 디자인해서 효율적으로 할 수 있는 원칙을 이야기하며 크게 두 가지 요소로 나뉜다. 1. 오케스트레이션(Orchestration)- 여러개의 서비스를 모아 하나의 완전한 기능을 만드는 서비스가 마이크로 서비스이다. 그럴 경우 중앙에서 두뇌 역할을 하는 오케이스트레이터가 여러 서비스를 묶어서 조율할 수 있어야 한다. 이 오케스트레이터는 외부에 노출되는 접점이다.- 예를들어 주문이라는 서비스가 들어오면 고객 서비스, 상품 서비스, 배송 서비스에 역할을 분배하여 요청하는 중재자를 의미한다. 2. 연출 (Choreography)- 특정한 서비스가 실행되면 메시키큐에 producer가 이벤트를 넣고 그 곳을 바라보면서 대기하던 consumer..
마이크로 서비스 통신방식 결정
마이크로서비스 사이의 통신은 요청-응답 형태로 진행되는 동기와 비동기 방식으로 설계할 수 있다. 동기와 비 동기는 서비스별로 어울리도록 정책을 가져야 한다. 예를 들어 예약서비스에서 기록이 되는 부분까지는 동기로 진행해서 사용자에게 보여주고 기타 재고 갱신 서비스, 호텔 알림 서비스 등등 당장 순차적으로 실행돼야 하는 것이 아닌 서비스는 비 동기로 처리하도록 한다. 동기 방식 이벤트를 보관하는 메시지 큐 등이 없어 관리할 포인트가 적다. 서로 응답을 주고 받는 형식이기 때문에 인프라 스트럭처상에서의 의존관계가 없어서 관리에 드는 비용이 적다. 순차적으로 단계별로 진행되기 때문에 에러가 발생할 경우 데이터의 일관성을 유지할 수 있다. 응답을 기다려야 하는 단점은 너무 동기로 묶여 있을 경우에는 마이크로서비..
마이크로서비스에서 애플리케이션에 컨텍스트를 구분하는 기준
마이크로서비스에서 애플리케이션에서 컨텍스트를 구분하는 기준이 생각보다 애매하다. 어디서부터 어디 까지 정의해서 사용해야 하는지에 대한 기준을 정리해보자. 자율적인 기능 제공 서비스 암호화 유틸 서비스, 배송 조회 검색 기능 서비스 등 자율적인 동작이 가능한 서비스의 경우에는 마이크로서비스의 별도 컨텍스트로서 사용이 가능하다. 배포 단위의 크기 좋은 마이크로서비스가 될 수 있도록 배포 단위의 크기를 관리할 수 있는 수준 이내로 유지해야한다. 분리하기 가장 적합한 기능 또는 서브 도메인 일체형 서비스를 마이크로서비스로 분리하고자 할 때 자원 소모량, 소유 비용, 비즈니스 효율성, 유연성 측면에서 분석 기준을 나눠서 생각해야한다. 폴리그랏 아키텍쳐 다양한 비 기능/기능적 요구 사항을 충족시키기위해 컴포넌트 마..
스프링 웹플럭스(spring webflux)를 활용한 간단한 리액티브 마이크로 서비스
자바 리액티브 프로그래밍은 리액티브 스트림 명세를 바탕으로 하고 있다. 리액티브 스트림 명세에는 컴포넌트 사이의 비동기 스트림 처리나 이벤트 흐름을 Non Blocking 방식으로 처리하기 위한 문법을 정의한다. 일반적인 옵저버 패턴과 달리 리액티브 스트림에는 시퀀스의 처리, 완료 알림, 실패시 backpressure 적용 등이 추가된다. backpressure는 받는 컴포넌트에서 보내는 컴포넌트에게 얼마만큼의 데이터를 소화할 수 있다고 알려줄 수 있다. 그래서 받는 컴포넌트에서 처리될 준비가 됐을 때만 데이터를 받을 수 있다. 그래서 서로 속도가 다른 컴포넌트 사이의 통신을 할 때 유리하다. 스프링 프레임워크 5 web flux는 Reactor 리액티브 스트림 명세를 기반으로 되어있다. 간단한 Spri..
리액티브 스트림의 이해
리액티브 스트림은 총 4개의 인터페이스로 구성되어 있다. ㅁ 발행자(Publisher) - 데이터의 소스를 가지고 있으며 Subscriber의 요청이 오면 데이터를 발행한다. 구독자는 발행자에 대한 구독을 추가할 수 있다. Subscribe 메소드를 통해서 구독자를 추가할수 있다.123public interface Publisher { public void subscribe(Subscriber
스프링 부트와 RabbitMQ를 사용한 리액티브 마이크로 서비스
publisher와 subscriber가 외부의 메시지 큐(RabbitMQ)와 연결되어 있는 애플리케이션을 만들어보자. Rabbitmq 설치 - 자세한 설치법은 검색을 해서 찾아보면 간단하게 나온다. - 하단의 내용은 local docker가 설치되어 있을때 docker-compose.yml을 작성할때 붙혀넣으면 된다. rabbitmq: image: rabbitmq:management ports: - "5672:5672” // 연결 포트 - "15672:15672” // 관리자 페이지 포트 (localhost:15672) Maven 의존성 추가1234 org.springframework.boot spring-boot-starter-amqpColored by Color Scriptercs Sender 클래..
리액티브 마이크로 서비스 정리
동일한 마이크로서비스는 서로 공유 및 통신하게 되어있다. 예를 들면 주문과 결재, 배송서비스들은 서로 공유되어있다. 이 서비스들의 호출 관계를 단순하게 동기 방식으로 호출하게 된다면 강한 의존성을 가지게 되기 때문에 마이크로 서비스의 강점을 충분하게 살릴 수 없다. 결국 모노토릭 서비스와 크게 다를게 없어진다. 그래서 도입되는 개념이 리액티브 마이크로 서비스이다. 리액티브 프로그래밍은 회복성(resilient), 응답성(responsive), 메시지 기반(message driven), 탄력성(elastic) 이렇게 4가지 기둥이 존재한다. 서로간에 마이크로서비스가 독립적으로 되어있기 때문에 특정 부분에 문제가 발생하면 해당 마이크로서비스의 복제본이 이를 대체할 수 있다. 하지만 이렇게 격리가 되었다고 해..
스프링 마이크로서비스 (MSA) 소개
많은 회사에서 마이크로서비스를 주목하고 있고 도입하고있다. 그 이유가 무엇인지 궁금했고, 알아보기 위해서 마이크로 서비스관련 책을 하나 구입하였다. 생각보다 책이 두껍지만 외국 저서 같지 않게 설명이 자세하게 되어있다. (사례도 많다.) 그럼 이제 마이크로 서비스가 무엇인지 알아보자. 아래 사진을 보자. 우리회사도 그렇고 기존에 웹 애플리케이션은 왼쪽의 사진처럼 하나의 구조로 이루어져있어 war 형태로 배포된다. 모든 서비스가 하나의 애플리케이션으로 구성되어있을 경우에는 새로운 기능을 추가하거나, 성능을 위해 시스템을 나누기 위하는 작업 등등이 너무 어렵다. 그래서 요새 대형 서비스에서는 서비스를 새로 추가하기도 쉽고, 더 많이 사용하는 서비스에 물리적인 자원을 더 할당할 수 있도록 마이크로서비스를 지원..