filter
종류
- prefilter : 사전에 호출
- postfilter : 사후에 호출
작업 방법
방법1) 자바코드로 작업
방법2) 프로퍼티(property)로 작업
predicate : 요청정보가 들어오면 어떤 것인지 판단
방법1) 자바 코드 작업
기존에 설정해둔 application.yml에서 routes를 주석처리 해준다. 자바코드로 작성해보자!
apigateway-service 프로젝트
Config.java클래스 생성
@Configuration을 추가하게 되면 Spring Boot가 처음 Bootsrap에 의해서 작동을 하게 될 때 @Configuration이 달려있는 Annotation을 모아서 메모리에 먼저 등록하는 작업을 한다.
이때 등록하는 빈의 이름을 RoterLocator로 등록한다.
application.yml에서 router작업해준 것을 자바코드에 해주는 것이다.
@Configuration
public class FilterConfig {
@Bean
public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
return builder.routes()
// first-service 등록
.route(r -> r.path("/first-service/**") // #1 r값이 전달되면 path를 확인하고
.filters(f -> f.addRequestHeader("first-request", "first-request-header") // #2 필터를 적용해서
.addResponseHeader("first-response", "first-response-header")) // 👀 chaining 함수
.uri("http://localhost:8081")) // #3 uri로 이동시켜준다.
// second-service 등록
.route(r -> r.path("/second-service/**")
.filters(f -> f.addRequestHeader("second-request", "second-request-header")
.addResponseHeader("second-response", "second-response-header"))
.uri("http://localhost:8082"))
.build();
}
}
path로 들어온 주소를 uri의 값 주소로 보내준다.
filters의 addRequestHeader는 Request(요청) 헤더에 추가 할 데이터를 키와 값 쌍으로 넣어주고,
addResponseHeader는 Response(응답) 헤더에 추가할 데이터를 키와 값 쌍으로 넣어준다.
👀 chaining 함수
하나의 결과 값을 계속이어서 작성할 수 있는 것
first-service Contoller
@RestController
@RequestMapping("/first-service")
@Slf4j
public class FirstServiceController {
@GetMapping("/welcome")
public String welcome() {
return "Welcome to the First service";
}
// ✔ 여기추가!
@GetMapping("/message")
public String message(@RequestHeader("first-request") String header) {
log.info(header); // @Slf4j로 log를 간편하게 사용가능
return "Hello world in First Service.";
}
}
second-service Contoller
@RestController
@RequestMapping("/second-service")
@Slf4j
public class SecondServiceController {
@GetMapping("/welcome")
public String welcome() {
return "welcome to the second service";
}
// ✔ 여기추가!
@GetMapping("/message")
public String message(@RequestHeader("second-request") String header) {
log.info(header);
return "Hello World in Second Service.";
}
}
3개 프로젝트 모두 재실행하고 크롬에서 확인
콘솔에 first-request의 vaule값인 log가 보인다.
response값은 브라우저에서 개발자 도구에 들어가면 확인할 수 있다.
크롬에서 설정 > 도구 더보기 > 개발자 도구 > Network
방법2) property 작업(.yml 사용)
Configuration, Bean 어노테이션만 주석처리 하면 자바로 설정했던 내용이 적용되지 않는다.
//@Configuration
public class FilterConfig {
// @Bean
public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {...}
application.yml
저번에 설정해두었던 설정에 filter를 추가해보자
cloud:
gateway:
routes:
- id: first-service
uri: http://localhost:8081/
predicates:
- Path=/first-service/**
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
위 파일에 predicates와 같은 레벨로 filter 정보를 추가한다.
//... 생략
filters:
- AddRequestHeader=first-request, first-request-header2
- AddResponseHeader=first-response, first-response-header2
//...생략
filters:
- AddRequestHeader=second-request, second-request-header2
- AddResponseHeader=second-response, second-response-header2
전체 application.yml 보기
server:
port: 8000
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http;//localhost:8761/eureka
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: first-service
uri: http://localhost:8081/
predicates:
- Path=/first-service/**
filters:
- AddRequestHeader=first-request, first-request-header2
- AddResponseHeader=first-response, first-response-header2
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
filters:
- AddRequestHeader=second-request, second-request-header2
- AddResponseHeader=second-response, second-response-header2
서버를 재실행한다.
이번에는 포스트맨에서 확인해보자!
잘 실행되었다.
Header탭에 들어가 filter로 적용해둔 response값을 확인할 수 있다.