일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이분 매칭
- 다익스트라
- 서비스 디스커버리
- 스프링 시큐리티
- dp
- 트리
- 플로이드 와샬
- 주울
- 스택
- Zuul
- 달팽이
- Gradle
- spring cloud
- 완전 탐색
- 도커
- BFS
- 백트래킹
- 구현
- 게이트웨이
- 메모이제이션
- 구간 트리
- Logback
- ZuulFilter
- docker-compose
- spring boot
- 유레카
- 비트마스킹
- Spring Cloud Config
- 이분 탐색
- Java
- Today
- Total
목록분류 전체보기 (387)
Hello, Freakin world!
이번에는 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을 유레카와 연결하고, 자동 생성된 경로들을 스프링 액츄에이터에서 제공하는 엔드 포인트로 확인하면서 마무리할 것이다. 그리고 게이트웨이 아래에 연결되는 서비스들은 서비스 디스커..

간단하게 비유하자면 이 클래스는 Map 처럼 동작합니다. 스레드의 참조를 키 값으로 하기 때문에 같은 ThreadLocal이 여러 스레드에 공유되어 값을 저장해도 특정 스레드에 저장된 값이 다른 스레드에 의해 영향받지 않습니다. 간단한 예제 코드로 확인해보겠습니다. import org.junit.jupiter.api.Test; public class TestThreadLocal { ThreadLocal threadLocal = ThreadLocal.withInitial(() -> "default"); @Test public void test() throws InterruptedException { threadLocal.set("main"); Thread myThread = new Thread(() -> ..
아래와 같은 서비스가 있다고 가정하자. public class HelloService { public String hello() throws Exception { throw new Exception("hello exception!"); } } hello 메서드는 체크된 예외를 던지기 때문에 hello를 사용하려면 try..catch로 해당 예외를 처리해야된다. public void conventionalTry() { HelloService service = new HelloService(); try { service.hello(); } catch (Exception e) { e.printStackTrace(); } } 이 방법은 코드를 읽을 때 흐름을 방해해 가독성을 떨어뜨린다. vavr 라이브러리에서 ..

스프링 이니셜라이저를 이용해 아래와 같은 의존성을 가지는 프로젝트를 생성합니다. 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..