server:
port: 8000
eureka: #eureka 세팅은 현재 사용 안함
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://127.0.0.1:8761/eureka
spring:
application: #gateway service 이름름 name: apigateway-service
cloud:
gateway: #gateway 설정
routes:
- id: first-service #gateway로 연결될 서비스 이름
uri: http://127.0.0.1:8001/ #gateway로 연결될 서비스 uri
predicates: #gateway로 연결될 서비스의 url 매핑
- Path=/first-service/**
filters:
- AddRequestHeader=first-request, first-request-header2
- AddResponseHeader=first-response, first-response-header2
- id: second-service
uri: http://127.0.0.1:8002/
predicates:
- Path=/second-service/**
filters:
- AddRequestHeader=second-request, second-request-header2
- AddResponseHeader=second-response, second-response-header2
이전에 필터 설정 부분을 직접 작성하여 적용했던 방법과 달리 CustomFilter java 파일을 생성하여 처리해보려고 한다. 위의 yml 파일의 내용을 수정하기 전에 CustomFilter java 파일을 먼저 생성하자.
@Component
@Slf4j
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
public CustomFilter() {
super(Config.class);
}
public static class Config{
//put the configuration info
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Custom PRE Filter : request id = {}", request.getId());
//custom post filter
return chain.filter(exchange).then(Mono.fromRunnable(()->{
log.info("Custom POST Filter : response code = {}", response.getStatusCode());
}));
});
}
}
CustomFilter 파일을 다음과 같이 작성 후 @Component
로 등록시켜준다. 여기서 기존 웹 코드들과 다른 점은 Request와 Response가 Servlet이 아닌 Server의 것을 그대로 가져오는 것과 Mono
를 사용하여 RxJava의 비동기 방식으로 진행된다는 점이다.
server:
port: 8000
eureka: #eureka 세팅은 현재 사용 안함
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://127.0.0.1:8761/eureka
spring:
application: #gateway service 이름름 name: apigateway-service
cloud:
gateway: #gateway 설정
routes:
- id: first-service #gateway로 연결될 서비스 이름
uri: http://127.0.0.1:8001/ #gateway로 연결될 서비스 uri
predicates: #gateway로 연결될 서비스의 url 매핑
- Path=/first-service/**
filters:
# - AddRequestHeader=first-request, first-request-header2
# - AddResponseHeader=first-response, first-response-header2
- CustomFilter
- id: second-service
uri: http://127.0.0.1:8002/
predicates:
- Path=/second-service/**
filters:
# - AddRequestHeader=second-request, second-request-header2
# - AddResponseHeader=second-response, second-response-header2
- CustomFilter
다음과 같이 적용시켜주면 된다.
@GetMapping("/check")
public String check(){
return "Hi, there. This is a message from first Service";
}
각 서비스에 간단한 get 요청을 하나 만들었다.
첫번째 서비스로 요청이 정상 실행되었고
두번째 서비스로 요청도 정상 실행되었다.
Gateway에서도 로그를 확인할 수 있다.
Filter기능을 이용하여 Jwt나 Auth의 인증을 추가하여 로그인 기능을 설정하는 것으로 사용할 수 있다!