Spring Cloud Eureka로 Eureka 서버 프로젝트를 띄우고 Spring Cloud Gateway와 마이크로서비스를 각각 Eureka 클라이언트로 등록했다.
Gateway에 마이크로서비스에 대한 route 정보를 등록하고 gateway 서버를 통해 마이크로서비스 uri를 호출했는데 호출이 되지 않는다. (404)
마이크로서비스를 직접 접근할 때에는 호출이 되는 상황!
server:
port: 8000
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: apigateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
@GetMapping("/health_check")
public String status(){
return String.format("It's working in user service on PORT %s", env.getProperty("local.server.port"));
}
localhost:8000/user_service/health_check
로 접근하면 gateway 서버는 Eureka 서버에 등록된 USER_SERVICE 이름을 가진 클라이언트를 찾는다.
그 후 URI를 그대로(/user_service/health_check
) 요청하는 것이다.
하지만 마이크로서비스에는 매핑 정보가 /health_check
로 등록되어 있기 때문에 404에러가 발생한다.
/user_service/health_check
로 마이크로서비스의 매핑 정보를 변경하면 gateway 서버가 요청을 그대로 전달해도 오류 없이 통신이 가능하다.
/user_service
prefix를 붙여줘야 해서 가독성을 해친다.spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
filters:
- RewritePath=/user-service/(?<segment>.*), /$\{segment}
spring.cloud.gateway.routes
의 filters
부분에서 RewritePath
속성을 통해 다음과 같이 지정하면 prefix를 서비스의 엔드포인트마다 붙이지 않아도 오류 없이 통신이 가능하다.