스프링
마이크로서비스 코딩
공작소
2019.06.10
Chapter 6.
스프링클라우드와 주울로 서비스 라우팅
6.1 서비스 게이트웨이란
서비스 클라이언트와 호출될 서비스 사이에서 중개 역할, 전체 서비스 호출이 서비스 게이트웨이를 통한다
- 정적 라우팅: 단일 서비스 URL과 API 경로로 모든 서비스를 호출
- 동적 라우팅: 유입되는 서비스 요청을 조사하고 요청 데이터를 기반으로 서비스 호출자 대상에 따라 지능형 라우팅을 수행
- 인증과 인가: 모든 서비스 호출은 서비스 게이트웨이로 라우팅되므로 서비스 게이트웨이는 서비스 호출자가 자신을 인증하고 서비스를 호출할 권한 여부를 확인할 수 있는 최적의 장소
- 측정 지표 수집과 로깅: 서비스 호출이 서비스 게이트웨이를 통과할 때 측정 지표와 로그 정보를 수집
서비스 게이트웨이에서 구현할 수 있는 횡단 관심사
6.2 스프링 클라우드와 넷플릭스 주울 소개
주울(Zuul): 넷플릭스의 오픈 소스 프로젝트로 스프링 클라우드 애너테이션으로 설정하고, 사용하기 쉬운 서비스 게이트웨이
주울의 기능
- 애플리케이션의 모든 서비스 경로를 단일 URL로 매핑: 주울의 매핑이 단일 URL로만 제한되는 것은 아니고, 여러 경로 항목을 정의해 경로 매핑을 세분화할 수 있다. 가장 일반적인 사용 사례는 모든 서비스 호출이 통과하는 단일 진입점을 구축하는 것
- 게이트웨이로 유입되는 요청을 검사하고 대응할 수 있는 필터 작성: 코드에 정책 시행 지점을 주입해서 모든 서비스 호출에서 광범위한 작업을 일관된 방식으로 수행
6.3 주울에서 경로 구성
- 서비스 디스커버리를 이용한 자동 경로 매핑
- 서비스 디스커버리를 이용한 수동 경로 매핑
- 정적 URL을 이용한 수동 경로 매핑
6.3.1 서비스 디스커버리를 이용한 자동 경로 매핑
application.yml에 경로를 정의해서 모든 경로 매핑
유레카 서비스 ID를 사용해 하위 서비스 인스턴스에 매핑
6.3.2 서비스 디스커버리를 이용한 수동 경로 매핑
주울을 사용하면 서비스의 유레카 서비스 ID로 자동 생성된 경로에 의존하지 않고 명시적으로 매핑 경로를 정의할 수 있으므로 더욱 세분화 가능
application.yml
zuul:
ignored-service: 'organizationservice'
routes:
organizationservice: /organization/**
/organizationservice/v1/organizations/{organization-id}
--> /organization/v1/organizations/{organization-id}
6.3.3 정적 URL을 이용한 수동 경로 매핑
유레카로 관리하지 않는 서비스를 라우팅하는데 고정 URL에 직접 라우팅하도록 설정 가능
application.yml
zuul:
routes:
licensetatic:
path: /licensestatic/**
url: http://licenseservice-static:8081
6.3.3 정적 URL을 이용한 수동 경로 매핑
라이선싱 서비스를 여러 경로에 정적으로 매핑
application.yml
zuul:
routes:
licensetatic:
path: /licensestatic/**
serviceId: licensestatic
ribbon:
eureka:
enabled: false
licensestatic:
ribon:
listOfServers: http://licenseservice-static1:8081,
http://licenseservice-static2:8082
6.3.4 경로 구성을 동적으로 로딩
경로를 동적으로 재로딩하면 주울 서버를 재활용하지 않고도 경로 매핑을 변경할 수 있다 -> 컨피그 서버와 동일한 방식
6.3.5 주울과 서비스 타임아웃
요청을 처리하는 데 1초 이상 걸리는 모든 호출을 종료하고 HTTP 500 에러 반환 - 히스트릭스 default
히스트릭스 timeout 설정
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 2500
특정 서비스 timeout 설정
hystrix.command.licensingservice.execution.isolation.thread.timeoutInMilliseconds: 2500
넷플릭스 리본 timeout 설정(5초 이상은 히스트릭스, 리본 모두 설정 필요)
hystrix.command.licensingservice.execution.isolation.thread.timeoutInMilliseconds: 7000
licensingservice.ribbon.ReadTimeout: 7000
6.4 주울의 진정한 힘! 필터
필터 타입
- 사전 필터: 주울에서 목표 대상에 대한 실제 요청이 발생하기 전에 호출
일관된 메시지 형식 검사, 인증 및 인가를 확인하는 게이트키퍼 역할
- 사후 필터: 대상 서비스를 호출하고 응답을 클라이언트로 전송한 후 호출
응답을 로깅, 에러 처리, 민감한 정보에 대한 응답 감시 - 경로 필터: 대상 서비스가 호출되기 전에 호출을 가로채는 데 사용, 일정 수준의 동적 라우팅 필요 여부를 결정하는 데 사용
6.4 주울의 진정한 힘! 필터
필터 종류
- TrackingFilter: 주울에서 보내는 모든 요청에 연관된 상관관계 ID 여부를 확인하는 사전 필터, 상관관계 ID를 사용하면 특정 호출이 일련의 마이크로서비스를 통과할 때 발생하는 모든 이벤트 체인을 추적 가능
- SpecialRoutesFilter: 유입되는 경로를 확인하고 해당 경로에서 A/B 테스팅 수행 여부를 결정하는 주울의 경로 필터
- ResponseFilter: 서비스 호출과 연관된 상관관계 ID를 클라이언트로 회신하는 HTTP 응답 헤더에 삽입하는 사후 필터, 이것으로 클라이언트는 호출한 요청과 연관된 상관관계 ID에 엑세스 가능
6.5 상관관계 ID를 생성하는 주울의 사전 필터 작성
HystrixConcurrencyStrategy
히스트릭스와 스프링 클라우드는 부모 스레드의 컨텍스트를 히스트릭스 스레드 풀이 관리하는 스레드에 전달하는 메커니즘
5.9 스레드 컨텍스트와 히스트릭스
HystrixConcurrencyStrategy 동작
- 히스트릭스 병행성 전략 클래스를 사용자 정의
- 히스트릭스 명령에 UserContext를 주입하도록 자바 Callable 클래스 정의
- 히스트릭스 병행성 전략을 사용자 정의하기 위해 스프링 클라우드 구성
스프링클라우드와 주울로 서비스 라우팅
By Sungbin, Song
스프링클라우드와 주울로 서비스 라우팅
- 126