bff 시스템의 오너십 문제를 겪은 적이 있었다.
gw가 왜 필요한지, 장단점이 무엇인지, 뭘 몰라서 문제를 겪고 있는지를 알고 싶었다.
출처 :
마이크로서비스 패턴 (책)
본 내용은 책내용의 8장을 정리 한 것이다.
요 영상도 한번 시청해 보면 좋겠다. 같은책을 가지고 운영노하우를 설명해주고 있다. 그리고 API GW와 API GW 패턴의 차이도 설명해주는데 도움이 되었다.
API Gateway Pattern에는 API Gateway가 없다
요 링크는 저자 크리스리처드슨이 운영하는 사이트
microservices.io
조회 뷰를 만들때 마이크로서비스는 주문데이터가 여러 서비스에서 분산되어 있다.
모바일 앱이 필요한건 API 1개인데, 여러 서비스를 조합해서 써야할까? (앱이 API 조합기 역할)
이는 심각한 문제점이 있다.
인터넷은 LAN 보다 대역폭도 낮고 지연시간은 100배는 더 길다.
순차 실행할수밖에 없는 상황이면 UX가 형편없어짐
전력소모 커짐 배터리 광탈
복잡한 API 조합을 클라에서 알아야 함. (커플링 증가)
API 게이트웨이는 방화벽 외부에서 단일 창구다
엣지 기능은 백엔드에서 해야될것같지만, API gw 에서 했을때 장점?
1. 인증같은경우 서비스에 도달하기 전에 하는것이 안전
2. 클라와 직접 맞닿은 upstream
3. 관심사 분리. API 라우팅/조합 등 엣지 기능을 중앙화
gw 는 계층형. 클라이언트별 API 는 별도로 구현하고, 인증같은 공통은 공통계층에 구현
API 게이트웨이 전담팀 따로 신설 필요.
모바일 앱 개발자가 API 필요하면 요청후 마냥 기다려야하나?
msa 아키텍처 사상과 배치됨.
넷플릭스 권장 :
클라이언트 팀마다 자체 API 모듈을 갖고 있기 때문에 이 모듈을 바꿀일이 생겨도 API 게이트웨이 팀에 따로 변경 요청할 필요가 없다.
만약 이 방식을 meshonebff 에 대조했을때 어떻게 되는걸까?
라우팅 기능은 그냥 백엔드가 배포되면 된다. API 조합을 기준으로는?
클라마다 API 게이트웨이를 소유 (다른 코드베이스).
공통기능은 API 게이트웨이 팀이 개발한 공유 라이브러리
BFF 장점
장점은 여지껏 얘기했고, 단점은...
처음엔 자사 스트리밍 API 를 만능으로 개발하려고함. -> 실패.
기기별 API가 따로 구현된 gw 를 사용함. api 구현 코드는 클라이언트 기기 팀이 소유/개발.
gw 첫버전에서는 라우팅과 조합을 수행하는 그루비 스크립트로 API 구현.
각 서비스팀에서 자바클라이언트 라이브리러리를 만듦.
이걸 스크립트를 짜서 호출. 6~7개의 서비스가 관여함. 무거움.
BFF 패턴으로 이전중.
Node.js 모듈로 개발.
스크립트가 서비스를 직접 호출하는게 아니라 팔코(second api gw) 를 활용.
비동기 I/O 를 써라.
언더토우같은것도 앞단에 nginx 를 둬야겠지?
접속할때마다 쓰레드를 배정할필요가 없다. (이벤트루프 방식.) 그래서 성능이 좋음.
다만 비동기 프로그래밍은 코드작성, 이해, 디버깅이 어렵다.
이벤트 루프 스레드가 블로킹되지 않도록 제어권을 신속하게 반환해야함.
주울 클러스터 처리율 25% 향상, cpu 사용량 25% 감소 함.
단 때에 따라 따라 개선이 안될수도 있음.
예상 I/O 모델에서 쓰레드수 계산할때 대기시간은 중요한 요인
동시처리는 콜백방식보다는 리액티브한 선언형 스타일을 써라
부분 실패 처리 (서킷브레이커)
서비스 디스커버리 (3장) + 관측성 패턴 (11장)
기성 vs 프레임워크를 이용해 직접구현
장점.
단점.
장점.
단점.
익숙한 웹 프레임워크로 구축하면 됨.
2가지 이슈는 신중히 검토
생산성/유지보수성을 위해 프레임워크를 써라.
저자는 주울
과 스프링 클라우드 게이트웨이
를 활용한다.
기능
요청을 변환하는 필터체인을 적절히 조합해서 요청을 처리.
백엔드 호출후 반환직전에 응답을 가공.
spring cloud zuul 을 이용하여 구성보다 관습(coc)
방식으로 손쉽게 개발 가능.
coc (convention over configuration)?
개발자가 정해야하는 많은 결정을 줄여 단순화.
자주 사용하는 부분은 관례화 하여 생략. 이를 따르지 않을 경우에만 설정
하지만 이것만으로는 경로기반의 라우팅만 지원된다.
7장에서 설명한 쿼리 아키텍처 역시 미지원 (뭐지?)
spring5, boot2, webflux(리액티브 웹프레임워크, 스프링5의 일부임) 로 되어있다.
여기서도 클라와 게이트웨이팀의 오너십을 나눈다면 어떻게 구분하나?
구체적인 코드는 OrderHandlers 참고.
Tuple4 해서 애그리게잇하는 곳 정도가 중요해보임
기존 REST 의 문제점?
1. Over Fetching
2. Under Fetching
3. API 마다 다른 이름의 URL 필요
아래 영상들
퉁퉁코딩 : https://www.youtube.com/watch?v=xiE9-S7s9rs
10:47 에 자동으로 생성된 UI 툴을 이용하여 쿼리하는 모습을 볼수 있다.