일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 게이트웨이
- Zuul
- 스택
- Java
- 비트마스킹
- spring boot
- 트리
- 이분 매칭
- 스프링 시큐리티
- Logback
- spring cloud
- 플로이드 와샬
- BFS
- Spring Cloud Config
- 서비스 디스커버리
- 달팽이
- dp
- 다익스트라
- 구현
- ZuulFilter
- 완전 탐색
- 이분 탐색
- 도커
- Gradle
- 메모이제이션
- docker-compose
- 구간 트리
- 주울
- 유레카
- 백트래킹
- Today
- Total
목록Spring Cloud (16)
Hello, Freakin world!
시나리오 - 멤버 서비스, 팀 서비스 2개의 서비스가 존재한다. - 멤버는 하나의 팀에 소속될 수 있다. - 클라이언트가 멤버를 조회할 때, 멤버가 팀에 속해있다면 팀 서비스에 요청에 팀 정보를 가져온다. - 멤버 서비스에서 팀 서비스에 요청 데이터를 받으면 이를 멤버 서비스에 캐시한다. - 팀 서비스 데이터가 수정되거나 삭제될 때, 이벤트를 발생시켜 멤버 서비스에 캐시된 내용을 수정하거나 삭제한다. 멤버 서비스 모든 클래스를 살펴보는건 너무 피곤한 일이니, 중요한 부분만 살펴보자. 멤버 서비스에서 중요한 부분은 3가지다. 1. 팀 서비스에 데이터를 요청하기 2. 팀 데이터를 캐시하기 3. 팀 서비스에서 보내는 이벤트를 받아 처리하기 1. 데이터 요청 부분 RestTemplate 빈을 생성해 동기식 요청..
포스트 타입 필터는 주울에서 클라이언트에게 반환하는 응답을 감시, 수정하는 용도로 사용합니다. 이전에 사전 필터에서 correlation-id 라는 헤더를 모든 요청에 추가해서 보냈습니다. 그 과정에서 RequestContext에 저장했던 correlation-id를 응답에 추가하는 필터를 만들어 보겠습니다. 아주 간단합니다. ResponseFilter package springboot.cloud.zuulexample.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import static org.spr..
이번에는 route 타입 필터를 작성해서 간단하게 A/B 테스트를 구현해보겠습니다. 전체 코드는 맨 아래 링크에서 확인 가능합니다. 시나리오 기존 member-service에서 /hello 엔드포인트가 버전업 됐습니다. 새로운 버전의 /hello를 고객들에게 직접 제공해 테스트해 보려고 합니다. 하지만 기존의 서비스를 한번에 새 버전으로 교체하는 건 위험부담이 크므로 기존 요청의 반만 새 버전으로 라우팅합니다. 라우팅 필터 작성 ABRoutingFilter import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import ..
먼저 사전 필터를 구현해보도록 하겠습니다. 필터를 구현하는 방법은 간단합니다. 주울에서 제공하는 추상 클래스인 ZuulFilter를 상속하면 됩니다. 서비스에 대한 요청 흐름을 추적하기 위해 correlation-id를 모든 요청에 추가하기로 하고 TrackingFilter 클래스를 생성합니다. TrackingFilter package springboot.cloud.zuulexample.filter; ... import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; /* 게이트웨이로 들어오는 모든 요청에 correlation i..
주울은 클라이언트에게 단일 진입점을 제공하는 게이트웨이입니다. 모든 요청은 게이트웨이를 거쳐가기 때문에 보안, 로깅과 같은 횡단관심사들을 구현하기 딱 좋습니다. 이런 기능들은 필터를 통해 구현합니다. 필터들은 4가지 타입이 존재하며 아래와 같이 동작합니다. - pre-filter(사전 필터) - route-filter(경로 필터) - post-filter(사후 필터) - error-filter(에러 필터) 사전 필터 주울에서 서비스에 대한 요청이 발생하기 전에 호출됩니다. 요청 메세지의 형식을 확인하거나(특정 헤더를 포함하는지) 사용자가 인증 및 인가되었는지 확인하는 기능 등을 여기에 구현합니다. 사후 필터 서비스를 호출하고 받은 응답 받은 후 호출됩니다. 응답을 로깅하거나 에러 처리, 민감한 정보에 대..
서비스 타임아웃은 리본과 히스트릭스 각각 지정할 수 있습니다. 기본적으로 주울은 1초 이상 걸리는 호출을 종료하고 HTTP 504 에러를 반환합니다. 이는 히스트릭스에서 걸리는 타임아웃입니다. (유레카에 등록된 서비스는 기본적으로 이와 같이 동작하지만 그렇지 않은 경우엔 히스트릭스 설정을 따로 추가해야 됩니다.) 리본에서도 타임아웃을 지정할 수 있습니다. 기본값은 5000ms 입니다. 만약 5초 이상의 타임아웃을 지정하려면 리본의 기본값이 5초이기 때문에 리본에도 타임아웃을 새로 지정해야 합니다. 히스트릭스에서 타임아웃 지정 다음의 코드를 applicatoin.yml에 추가합니다. hystrix: command: default: excution.isolation.thread.timeoutInMillise..
이번 글에서는 주울로 들어오는 url을 라우팅하는 방법에 대해 살펴보겠습니다. 1. 서비스 디스커버리를 이용한 자동 경로 매핑 유레카가 연결돼있다면 기본적으로 동작하는 방식입니다. 아무런 설정이 없다면 이 방식으로 동작합니다. 이 방식은 유레카에 등록된 서비스 ID(applciation.name)을 이용해 url을 자동 매핑합니다. 직접 확인해볼까요? application.yml server: port: 9000 # eureka eureka: instance: prefer-ip-address: true client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka # a..
Zuul 이란? 간단하게 말하자면 넷플릭스에서 제공하는 게이트웨이 오픈소스 라이브러리다. Gateway 란? 게이트웨이란 MSA에서 클라이언트에게 분산된 서비스의 단일 진입점이 되는 프록시(리버스 프록시)서버다. MSA에서 보안, 로깅과 같은 횡단 관심사를 각 서비스에 적용하려면 코드 중복해서 사용해야 된다. 이러면 유지보수하기가 힘들어지는데, 그래서 단일 진입점인 게이트웨이에 보통 구현하게 된다. 클라이언트가 여러 서비스의 물리적 주소를 알 필요 없이 게이트웨이 주소만 알면 되는것도 장점이다. 목적 이번 글에서는 간단하게 Zuul을 유레카와 연결하고, 자동 생성된 경로들을 스프링 액츄에이터에서 제공하는 엔드 포인트로 확인하면서 마무리할 것이다. 그리고 게이트웨이 아래에 연결되는 서비스들은 서비스 디스커..
스프링 이니셜라이저를 이용해 아래와 같은 의존성을 가지는 프로젝트를 생성합니다. plugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'springboot.cloud' version = '1.0.0' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } ext { set('springCloudVersion', "2020.0.1") } depend..
[Eureka] 서비스 검색하기 - DiscoveryClient [Eureka] 서비스 디스커버리에 서비스 등록하기 시나리오 간단하게 유레카 서버와 유레카에 등록되는 서비스 서버를 띄운다. 그리고 유레카 서버의 대시보드를 활용해 서비스 서버가 등록되는지 javachoi.tistory.com 이전 글에서는 인위적으로 서비스 간 통신에 DiscoveryClient 객체만 사용하도록 했다. 그로 인한 단점은 두 가지였다. 1. 로드 밸런싱 방식을 직접 구현해야 됐다. 2. 서비스 url을 직접 조립해서 약간 번거로웠다. 스프링에서 제공하는 간편한 방식으로 개선해보자. 멤버 서비스 수정 먼저 시동 클래스에 @EnableDiscoveryClient를 없앤다. import org.springframework.boo..