2022. 10. 23. 18:04ㆍBACKEND
API Gateway
: 전체 서비스 내부 및 외부에서 로드 밸런싱을 포함한 API 트래픽 및 요청을 관리
API Gateway는 백엔드 서비스 또는 데이터와 접속하고 API 호출에 대한 정책,
인증 및 일반 액세스 제어를 적용하여 중요한 데이터를 보호합니다.
API Gateway를 통해 사용할 수 있는 특징은 아래와 같습니다.
✔️ 백엔드 시스템 및 서비스에 대한 액세스를 제어
✔️ 클라이언트와 여러 백엔드 서비스 간 통신 최적화
✔️ 서비스의 확장성과 고가용성을 보장
✔️ 요청을 적절한 서비스로 라우팅하고 요청자에게 응답을 다시 보내는 기능을 담당
✔️ 데이터와 API 간의 보안 연결을 유지
MSA 구조에서 마이크로서비스는 애플리케이션을 느슨하게 결합된 여러 서비스로 분해할 수 있습니다.
이로 인해 다양한 기능을 더 쉽게 개발, 배포 및 유지 관리할 수 있죠.
하지만, 서비스들이 분리되어 빠르고 안전하게 액세스하기가 더 어려워집니다.
이를 위해 모든 요청의 첫 진입 지점으로 API 게이트웨이 설치하고,
각 마이크로서비스에 대한 액세스를 개별적으로 요청하는 대신 게이트웨이는 요청을 보냅니다.
해당 요청을 적절한 서비스로 라우팅하고 결과를 수집하여 요청자에게 다시 전달하는 역할을 합니다.
API 게이트웨이를 사용하면 아래와 같은 장점을 얻을 수 있습니다.
✔️ Authentication : 여러 서비스의 데이터 액세스를 게이트웨이에서 한 번만 인증
✔️ Metrics Collection : 진입 단일점이기 때문에 데이터 분석을 수집에 이상적
✔️ Input Validation : 필수 정보 존재 여부 확인과 올바른 형식으로 제공되는지 확인
✔️ Response Transformation : 정보의 "전달자" 역할. 백엔드 서비스 장애로 응답이 없을 때 게이트웨이가 이를 자동으로 처리 가능
Shenyu
: Java native API Gateway for service proxy, protocol conversion and API governance.
자바로 제작된 API 게이트 웨이로 프록시, 프로토콜 전환, 통괄적인 API 관리 등을 위해 제작되었습니다.
따로 개발할 필요가 없는 Out of the Box로 제공되는데, 즉시 사용 가능한 기능을 제공합니다.
트래픽을 관리하는 RateLimit이나 CircuitBreaker, API Gateway Rules 등을 구현할 때 개발할 필요없이 ShenYu에서 제공하는 Admin 페이지와 Gateway 역할을 하는 Bootstrap을 실행하여 단 몇 초만에 설정할 수 있습니다.
Feature
✔️ Proxy
: Support for Apache® Dubbo™, Spring Cloud, gRPC, Motan, SOFA, TARS, WebSocket, MQTT
✔️ Security
: Sign, OAuth 2.0, JSON Web Tokens, WAF plugin
✔️ API governance
: Request, response, parameter mapping, Hystrix, RateLimiter plugin
✔️ Observability
: Tracing, metrics, logging plugin
✔️ Dashboard
: Dynamic traffic control, visual backend for user menu permissions
✔️ Extensions
: Plugin hot-swapping, dynamic loading
✔️ Cluster
: NGINX, Docker, Kubernetes
✔️ Language
: provides .NET, Python, Go, Java client for API register
Overview
Shenyu 프레임워크의 기본 구조를 파악해보도록 하겠습니다.
기본적으로 Admin과 Bootstrap을 통해 운영되는데요,
아래의 그림을 참고하여 시작하면 큰 그림을 그리기 좋을 듯 합니다.
여기서 주목해야 할 모듈 Admin, Gateway(Bootstrap)을 중점으로 살펴볼게요.
먼저, Admin과 Bootstrap 모듈을 차례대로 실행합니다.
참고 차 Admin에서 주요 페이지인 플러그인 설정 페이지입니다.
위 처럼 생긴 Admin 페이지에서 등록된 request 규칙(Select and Rules)을 기반으로 적용할 플러그인들을 설정해줍니다.
참고록 위의 페이지는 플러그인 설정을 위한 페이지로,
인입되는 요청에 rateLimiter, retry, auth(jwt, oauth2, etc...), resilience4j 등의 기능을 굉장히 손쉽게 적용할 수 있습니다.
위의 Admin에서 설정을 하면 어떻게 될까요?
Admin에서 설정을 변경하면 Data Sync를 위해 Bootstrap으로 아래와 같은 요청을 보냅니다.
# apache-shenyu-2.5.0-bootstrap-bin/logs/shenyu-bootstrap.log
2022-10-23 02:43:04 [WebSocketConnectReadThread-31] INFO org.apache.shenyu.plugin.sync.data.websocket.client.ShenyuWebsocketClient - handleResult({"groupType":"PLUGIN","eventType":"UPDATE","data":[{"id":"30","name":"cache","config":"{\"cacheType\":\"memory\",\"database\":\"0\",\"mode\":\"standalone\",\"maxIdle\":\"8\",\"minIdle\":\"0\",\"maxActive\":\"8\",\"maxWait\":\"-1\"}","role":"Cache","enabled":true,"sort":10}]})
2022-10-23 02:43:04 [WebSocketConnectReadThread-31] INFO org.apache.shenyu.plugin.cache.handler.CachePluginDataHandler - use the memory cache.
Bootstrap가 API을 받는 Gateway 역할을 하기 때문에 위와 같은 데이터 동기화가 필요합니다.
이렇게 동기화를 하고 지정한 API 로 요청을 보내면 적용된 플러그인이 연쇄 책임(Chain of Responsibility)으로 적용됩니다.
이제, 지정된 API 요청이 어떤 플러그인에 어떻게 적용되는지 자세히 알아볼게요.
Plugins
요청이 들어오면 Apache ShenYu은 사용할 수 있는 플러그인들을 연쇄 책임(Chain of Responsibility)를 통해 실행합니다.
ShenYu 플러그인의 핵심은 확장성과 핫 플러깅이 가능하다는 것입니다.
즉, 사용자의 입맛대로 플러그인을 커스터마이징 할 수도,
Admin에서 플러그인 설정한 후 재시동하지 않아도 바로 적용된다는 점입니다.
Admin System에서 각 플러그인은 JSON 포맷의 핸들 필드를 사용합니다.
위의 bootstrap 로그에서 확인할 수 있었죠.
기존 플러그인 뿐만아니라 커스텀 프로세싱 필드를 JSON으로 관리하고 수정할 수도 있습니다.
플러그인의 템플릿으로 플러그인을 사용할 수 있는 것이 플러그인 설계의 핵심입니다.
Selector와 Rule은 HTTP 요청 헤더에 따라 요청을 라우팅하는데 사용됩니다.
플러그인 사용을 활성화했다면 이후에 인입되는 요청의 URL 규칙을 확인한 후,
해당 플러그인을 적용시켜야 할지 말지를 Selector와 Rule 필터링으로 체크합니다.
Selector & Rule
Selector와 Rule은 ShenYu Gateway의 가장 중요한 부분입니다
이 부분을 이해해야 트래픽 관리를 손쉽게 할 수 있습니다.
플러그인은 여러 Selectors를 가지고 하나의 selector는 여러 rules에 해당합니다.
Selector는 트래픽의 첫 계층의 필터이고, rules는 마지막 필터입니다.
✔️ Selector
: 인입되는 경로를 확인하는 첫 번째 경로로, 인입된 경로가 플러그인 적용 대상인지 판별*할 수 있습니다.
예를 들어 모듈 계층이 될 수 있습니다.
*Shenyu 공식문서에서는 단순히 It is coarser grained 이라고 표현했습니다.
"조잡한 결을 가졌다"고 직역할 수 있는데, "거름망에 걸리는지 판별한다"는 의미를 가진다고 해석되어 위와 같이 의역했습니다.
가령, jar 애플리케이션 하나를 올렸을 때를 생각해봅시다.
해당 jar 애플리케이션 설정 파일에 지정해둔 selector 명으로 설정됩니다.
application.yml 에 shenyu.client.http.props.contextPath=/http 으로 설정해두면,
gateway는 /http/* 로 인입되는 모든 요청을 다음 필터로 넘깁니다.
✔️ Rule
: 두 번째 경로로 당신이 생각하는 각 요청이 수행해야만 하는 것들입니다.
예를 들어 모듈 내의 메소드 계층이 될 수 있습니다.
가령, 위와 마찬가지로 jar 애플리케이션 하나를 올렸을 때를 생각해봅시다.
해당 jar 애플리케이션에서 지정한 Request Mapping이 존재할 때,
Shenyu에서 제공하는 어노테이션(e.g. @ShenyuSpringMvcClient)이 적용된 요청 건에 설정한 플러그인을 모두 실행합니다.
Selector와 Rule은 판별되는 순서에 따라 가장 먼저 매칭되어 반환됩니다.
때문에 후순위일수록 가장 마지막 순서*로 설정해야합니다.
Shenyu 공식문서에서는 coarsest granularity should be sorted last 로 안내하고 있으며,
"가장 거친 입자는 마지막에 분류된다"고 직역할 수 있습니다.
Traffic filtering
최종적으로 실행 로직을 정리하면 아래와 같습니다.
#1. 트래픽이 ShenYu 게이트웨이에 들어오면 해당 플러그인이 존재하는지, 플러그인이 켜져 있는지 먼저 판단
#2. 트래픽이 플러그인의 적용 대상인지 Selector 일치 여부 확인
#3. 트래픽이 Selector의 Rules과 일치하는지 여부 확인
#4. 요청 트래픽이 일치 기준을 충족하면 플러그인이 실행되고, 그렇지 않으면 플러그인이 실행되지 않습니다.
#5. 다음 플러그인을 처리 - ShenYu Gateway는 여러 층의 스크리닝을 거쳐 흐름 제어 수행
여기서 #4번의 '일치 기준을 충족' 한다는 말에 집중해봅시다.
여기서 말하는 일치 기준은 Selector와 Rule에 매칭되는 조건을 의미하며, 트래픽 필터링의 핵심입니다.
각기 다른 트래픽 필터링 규칙을 정의하여 다양한 복잡한 시나리오를 구성할 수 있습니다.
이 일치 기준은 Header, URI, Query, Cookie 등의 필드를 통해 조건을 검색할 수 있습니다.
이 때, 요청 데이터 중 위의 필드 값을 Match, =, SpEL, Regex, Groovy, Exclude 등의 판별 조건과
And/Or 조건을 조합하여 설정 할 수 있습니다.
Data Caching & Data Sync
Gateway는 요청의 진입점으로 MSA(MicroService Architecture)에서 굉장히 중요한 부분이기 때문에 Gateway 고가용성(HA)은 굉장히 중요합니다.
실제 비즈니스에서는 요구사항이 상시로 변경될 수 있기 때문에,
Gateway를 사용할 경우 요청의 흐름 제어 규칙이나 라우트의 규칙 등의 구성을 빠르게 변경할 수 있어야 합니다.
Gateway의 설정을 동적으로 변경할 수 있는 것은 Gateway의 고가용성을 보장하는 중요한 요소입니다.
ShenYu에서는 데이터 동기화를 위해 아래와 같은 지원을 합니다.
✔️ 캐싱
: 모든 설정은 ShenYu Gateway 메모리에 캐시되며, JVM 내 ConcurrentHashMap을 사용하며 캐싱되기 때문에 굉장히 빠릅니다.
✔️ Admin과 Gateway의 빠른 동기화
: 사용자는 shenyu-admin의 백그라운드에서 모든 데이터를 수정하고 Gateway의 메모리와 즉시 동기화할 수 있습니다.
✔️ 데이터 동기화 시스템
:ShenYu 플러그인, Selector, Rule, 메타데이터, Signature 데이터 및 기타 데이터 동기화를 지원합니다.
✔️ 핫 플러깅
: 모든 플러그인 Selector와 Rule은 동적으로 구성되고, 즉시 적용되므로 서비스를 재시작할 필요가 없습니다.
✔️ 다양한 데이터 동기화 모드
: 현재 (2.5.0 기준) WebSocket, HTTP long polling, ZooKeeper, Nacos, Etcd, Consul을 사용할 수 있으며
설정 파일의 shenyu.sync.${strategy} 를 설정해서 동기화 정책을 특정짓게끔 지원합니다.
shenyu-admin 소스에서 기본적으로 위와 같이 설정되어 있는 것을 확인할 수 있습니다.
⚠ Apache ShenYu Gateway와 Apache ShenYu Admin은 반드시 동일한 동기화 정책을 사용해야합니다.
shenyu-admin 은 유저가 설정을 변경하면 EventPublisher 를 통해 설정 변경 알람을 발행하고,
EventDispatcher는 이 변경 사항을 처리하고 설정된 동기화 방식에 따른 이벤트 핸들러에게 해당 설정을 전송합니다.
지금까지 Shenyu Gateway에 대한 개념을 살펴보았습니다.
다음 포스팅에서는 로컬/서버 환경에서 실행하는 방법에 대해 포스팅하겠습니다
오타나 잘못된 내용을 댓글로 남겨주세요!
감사합니다 ☺️
'BACKEND' 카테고리의 다른 글
Shenyu API Gateway, 어렵지 않게 시작하기 2 (0) | 2022.10.24 |
---|---|
Shenyu API Gateway, 어렵지 않게 시작하기 1 (0) | 2022.10.23 |
TimeZone, 어렵지 않게 이해하기 (0) | 2022.05.05 |
CIDR, 어렵지 않게 이해하기 (0) | 2022.05.01 |
RUVVE, Backend.log (0) | 2021.12.09 |
Backend Software Engineer
𝐒𝐮𝐧 · 𝙂𝙮𝙚𝙤𝙣𝙜𝙨𝙪𝙣 𝙋𝙖𝙧𝙠