• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@Loadbalanced 관련

21.07.14 12:18 작성 조회수 387

0

- spring-boot: v2.5.2

- cloud: 2020.0.3

예제처럼 따라했는데, user-service -> order-service로의 접근시에는 gateway를 통하지 않고 바로 통신합니다.
유레카에서 해당 서비스 IP/PORT 아이피를 바로 얻어갑니다

아래는 /user 조회시 주문 정보까지 가져올 때 gateway 로그입니니다. 

/user호출

  |- 해당 호출에서 rest로 /order 호출 

이면 gateway에서 /order 로깅이 되어야 하는데 출력이 되지 않네요.

2021-07-14 12:10:01.325  INFO 48697 --- [ctor-http-nio-3] com.socurites.cloud.filter.GlobalFilter  : Global filter: baseMessage: Spring Cloud Gateway Global Filter
2021-07-14 12:10:01.327  INFO 48697 --- [ctor-http-nio-3] com.socurites.cloud.filter.GlobalFilter  : Global Filter Start: request id -> 96706a17-38
2021-07-14 12:10:01.328  INFO 48697 --- [ctor-http-nio-3] c.s.c.filter.AuthorizationHeaderFilter   : Authorization> authorizationHeader: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjYzg5N2Q3ZmQ3OTU0NjFiYmVjYjFhNjE1YTE5ZjU1OSIsImV4cCI6MTYyNjIzMzI4MH0.RIMPVoIUb8UNsrTOC4UTfmG3VXF-NdwqUlzTsNIxqjr2Fp0A50DGcmBQc6qwZ6Ucwi8-kraU9FuYCgMM_nIM2Q
2021-07-14 12:10:01.331  INFO 48697 --- [ctor-http-nio-3] c.socurites.cloud.filter.LoggingFilter   : Logging filter: baseMessage: Inner Logging Filter
2021-07-14 12:10:01.332  INFO 48697 --- [ctor-http-nio-3] c.socurites.cloud.filter.LoggingFilter   : Logging PRE Filter: request uri -> http://localhost:8080/users/cc897d7fd795461bbecb1a615a19f559
2021-07-14 12:10:01.461  INFO 48697 --- [ctor-http-nio-3] c.socurites.cloud.filter.LoggingFilter   : Logging POST Filter: response code -> 200 OK
2021-07-14 12:10:01.461  INFO 48697 --- [ctor-http-nio-3] com.socurites.cloud.filter.GlobalFilter  : Global Filter End: response code -> 200 OK
2021-07-14 12:14:07.516  INFO 48697 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration

그래서 예제처럼 @Loadbalanced를 쓰려면 uri에서 "/order-service"를 제거해야만 나옵니다.

먼가 설정을 빠뜨린 것 같은데 잘 모르곘네요

답변 2

·

답변을 작성해보세요.

1

안녕하세요, 이도원입니다. 

다음과 같이 사용자의 상세 정보를 요청하게 되면, 

http://ip_address:8000/user-service/users/[user_id]

ex)

해당 사용자가 주문한 주문 내역이 같이 보여지게 됩니다. 이때 RestTempalte에서는 order-service에 요청하기 위해서 user-service.yml 파일로 부터 다음과 같은 주소를 사용하고 있습니다. 

order_service:
url: http://ORDER-SERVICE/order-service/%s/orders

위에서 보시는 것처럼, EUREKA에 등록된 ORDER-SERVICE라는 애플리케이션명을 통해 직접 order service에 접속하고 있기 때문에, apigateway-service를 거치지 않고 바로 요청하게 됩니다. 만약 위 정보를 아래와 같이 apigateway를 거쳐서 접속하도록 수정한다면 apigateway-service에 해당 로그가 출력되는 것을 보실 수 있을겁니다. 

order_service:
# url: http://ORDER-SERVICE/order-service/%s/orders
url: http://ip_address:8000/order-service/%s/orders

위 로그는 apigateway-service에 대한 내용인데, 첫번째 request id -> c5045b2f-53는 user-service에 대한 요청이고, 두번째 request id -> 3925e9cb-1는 user-service에서 order-service를 요청한 내용입니다.

추가로, 위와 같이 Eureka의 ORDER_SERVICE라는 애플리케이션명 대신 직접 ip address를 지정해서 사용하실 경우에는 user-service에서 RestTemplate 빈을 등록하실 때 @LoadBalanced 어노테이션을 넣지 말고 실행하시기 바랍니다.

    @Bean
// @LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}

감사합니다. 

0

고성빈님의 프로필

고성빈

2021.08.12

- spring-boot: v2.5.2

- cloud: 2020.0.3

예제처럼 따라했는데, user-service -> order-service로의 접근시에는 gateway를 통하지 않고 바로 통신합니다.
유레카에서 해당 서비스 IP/PORT 아이피를 바로 얻어갑니다

아래는 /user 조회시 주문 정보까지 가져올 때 gateway 로그입니니다. 

/user호출

  |- 해당 호출에서 rest로 /order 호출 

이면 gateway에서 /order 로깅이 되어야 하는데 출력이 되지 않네요.

그래서 예제처럼 @Loadbalanced를 쓰려면 uri에서 "/order-service"를 제거해야만 나옵니다.

먼가 설정을 빠뜨린 것 같은데 잘 모르곘네요

안녕하세요, 이도원입니다. 

다음과 같이 사용자의 상세 정보를 요청하게 되면, 

http://ip_address:8000/user-service/users/[user_id]

ex)

해당 사용자가 주문한 주문 내역이 같이 보여지게 됩니다. 이때 RestTempalte에서는 order-service에 요청하기 위해서 user-service.yml 파일로 부터 다음과 같은 주소를 사용하고 있습니다. 

위에서 보시는 것처럼, EUREKA에 등록된 ORDER-SERVICE라는 애플리케이션명을 통해 직접 order service에 접속하고 있기 때문에, apigateway-service를 거치지 않고 바로 요청하게 됩니다. 만약 위 정보를 아래와 같이 apigateway를 거쳐서 접속하도록 수정한다면 apigateway-service에 해당 로그가 출력되는 것을 보실 수 있을겁니다. 

위 로그는 apigateway-service에 대한 내용인데, 첫번째 request id -> c5045b2f-53는 user-service에 대한 요청이고, 두번째 request id -> 3925e9cb-1는 user-service에서 order-service를 요청한 내용입니다.

추가로, 위와 같이 Eureka의 ORDER_SERVICE라는 애플리케이션명 대신 직접 ip address를 지정해서 사용하실 경우에는 user-service에서 RestTemplate 빈을 등록하실 때 @LoadBalanced 어노테이션을 넣지 말고 실행하시기 바랍니다.