gateway에 등록한 route를 찾지 못하는 경우 해결방법

CHEESE·2022년 8월 31일
1

Spring Cloud + MSA

목록 보기
10/13
post-thumbnail

문제

Spring Cloud Eureka로 Eureka 서버 프로젝트를 띄우고 Spring Cloud Gateway와 마이크로서비스를 각각 Eureka 클라이언트로 등록했다.
Gateway에 마이크로서비스에 대한 route 정보를 등록하고 gateway 서버를 통해 마이크로서비스 uri를 호출했는데 호출이 되지 않는다. (404)
마이크로서비스를 직접 접근할 때에는 호출이 되는 상황!

application.yml (Gateway)

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/**

Microservice

@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를 붙여줘야 해서 가독성을 해친다.

gateway 설정을 변경한다.

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.routesfilters 부분에서 RewritePath 속성을 통해 다음과 같이 지정하면 prefix를 서비스의 엔드포인트마다 붙이지 않아도 오류 없이 통신이 가능하다.

0개의 댓글