서버 분산했으니 이제 클라이언트 단에서,
직접 서비스를 호출하지 않고 각각의 마이크로서비스로 요청되는 모든 정보에 대해 일괄 처리할 수 있는 프록시 역할이 필요하다.(로드밸런서)
등등
1) RestTemplate
2) Feign Client(스프링클라우드 라이브러리)
-MSA이름으로 호출 가능
-Ribborn 서비스
: 클라이언트 측에 설정해놓고(client-side) 마이크로서비스 호출.
그러나 이건 동기식 서비스.. 업데이트 더이상 안됨
-Netflix Zuul
: 클라이언트가 넷플릭스 줄에 연결하면 얘가 서버에 던져줄 것. 역시나 업데이트 더이상 안된다.
-Spring Cloud Gateway(대체)
: 비동기 서비스 호출 가능


spring:
application:
name: gateway-service
cloud:
gateway:
mvc:
routes:
- id: first-service #when the service comes in,
uri: http://localhost:8081/ #allocate it at this port
predicates:
- Path=/first-service/**
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
server:
port: 9000
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka
-포트는 9000번, 유레카 서버와 연결
-/first-service로 시작하는 클라이언트 요청이 들어오면, 8081 포트로 바인딩한다.

@Configuration
public class FilterConfig {
@Bean
public RouteLocator gatewayRoutes(RouteLocatorBuilder builder){
return builder.routes()
.route(r -> r.path("/first-service/**")
.filters(f -> f.addRequestHeader("first-request","first-request-header")
.addResponseHeader("first-response","first-response-header"))
.uri("http://localhost:8081"))
.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();
}
=> yaml파일 대체
@GetMapping("/message")
public String message(@RequestHeader("first-request") String header)
{
System.out.print(header);
return "Hello world in first service";
}
서버로부터 "first-request"라는 이름의 헤더를 요청 헤더로 받겠다. ->
.route(r -> r.path("/first-service/**")
.filters(f -> f.addRequestHeader("first-request","first-request-header")
.addResponseHeader("first-response","first-response-header"))
.uri("http://localhost:8081"))
프록시가 부여


요청 시 지정한 request header가 껴서 전달되고
응답에도 지정한 response header가 껴서 전달됨을 알 수 있다.
즉, 클라이언트 값을 중간에 가로채서
리퀘스트 혹은 리스폰스 값을 부여하는 역할을 함
mvc:
...
predicates:
- Path=/first-service/**
filters:
- AddRequestHeader=first-request, first-requests-header2
- AddResponseHeader=first-response, first-response-header2
...
predicates:
- Path=/second-service/**
filters:
- AddRequestHeader=second-request, second-requests-header2
- AddResponseHeader=second-response, second-response-header2
gateway:
routes:
- id: first-service #when the service comes in,
uri: http://localhost:8081/ #192.168.45.104 #allocate it at this port
predicates:
- Path=/first-service/** #when first-service comes, allocate 8081 port
filters:
- CustomFilter
- id: second-service
uri: http://localhost:8082/ #192.168.45.104
predicates:
- Path=/second-service/**
filters:
- CustomFilter
gateway:
default-filters:
- name: GlobalFilter
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
routes:

적용 된 순서 참고.
filters:
- name: CustomFilter
- name: LoggingFilter
args:
baseMessage: Hi, there.
preLogger: true
postLogger: true

이런 순서로 적용될 예정

가장 마지막 수행됨.
❗ 만약 가장 최우선으로 두고 싶다면
apply함수의 OrderedGatewayFilter에 Ordered.LOWEST_PRECEDENCE을
Ordered.HiGHEST_PRECEDENCE로 변경해주자.