마이크로서비스(first-service) 생성
@Slf4j
@RestController
@RequestMapping("/first-service")
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);
return "Hello World in the first service.";
}
}
server:
port: 8081
spring:
application:
name: my-first-service
eureka:
client:
register-with-eureka: false
fetch-registry: false
게이트웨이(apigateway-service) 생성
server:
port: 8000
eureka:
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: gateway-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
필터에서 Request Header값을 "first-request-header2"로 주고 있어서 에러가 발생하지 않는다.
@Slf4j
@Component
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
@Override
public GatewayFilter apply(Config config) {
//Custom pre-filter
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 status code -> {}", response.getStatusCode());
}));
};
}
public static class Config {
//put the configuration properties
}
public CustomFilter(){
super(Config.class);
}
}
spring:
application:
name: gateway-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
- CustomFilter
@Slf4j
@Component
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
@Override
public GatewayFilter apply(GlobalFilter.Config config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Global filter baseMessage: {}", config.getBaseMessage());
if(config.isPreLogger())
log.info("Global filter starts! request id -> {}", request.getId());
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
if(config.isPostLogger())
log.info("Global filter ends! response status code -> {}", response.getStatusCode());
}));
};
}
@Data
public static class Config {
//put the configuration properties
String baseMessage;
boolean preLogger;
private boolean postLogger;
}
public GlobalFilter(){
super(Config.class);
}
}
spring:
application:
name: gateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter
args: #Config클래스 properties
baseMessage: Spring Cloud Gateway GlobalFilter
preLogger: true
postLogger: true
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
- CustomFilter
@Slf4j
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Logging filter: baseMessage -> {}", config.getBaseMessage());
if(config.isPreLogger())
log.info("Logging pre-filter: request uri -> {}", request.getURI());
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
if(config.isPostLogger())
log.info("Logging post-filter: response status code -> {}", response.getStatusCode());
}));
};
}
@Data
public static class Config {
//put the configuration properties
String baseMessage;
boolean preLogger;
private boolean postLogger;
}
public LoggingFilter(){
super(Config.class);
}
}
spring:
application:
name: gateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter
args: #Config클래스 properties
baseMessage: Spring Cloud Gateway GlobalFilter
preLogger: true
postLogger: true
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
- name: CustomFilter
- name: LoggingFilter
args:
baseMessage: Hi there!
preLogger: true
postLogger: true