본문 바로가기
spring cloud

API Gateway Service - Spring Cloud Gateway + Eureka

by 킹차니 2022. 3. 1.

이번에는 지금까지 만든 first-service, second-service, apigateway-service를 discovery service(eureka)에 등록해보자.

클라이언트가 " http://localhost:8080/first-service/welcome "로 요청을 보내면 이는 API Gateway가 먼저 받는다. 

이제 API Gateway는 " /first-service/** " 이하는 어떤 uri로 가야하는지 discovery service에게 물어보고 discovery service가 어떤 IP 주소와 포트로 가야하는지 알려주면 API Gateway는 해당 주소로 요청을 보내게 된다.

 

먼저 first-service, second-service를 discovery service에 등록시켜야 한다.

first-service의 yml

 

second-service의 yml

 

apigateway service 역시 discovery service에 등록해준다.

또한 이전과 달리 유레카(discovery service)에 등록된 서비스 이름을 uri에 적어준다.

lb는 load balancer의 약자이다.

 

이제 이전의 discovery service 프로젝트를 실행하고 first-service, second-service, apigateway-service를 실행시킨다.

그리고 discovery service를 브라우저를 통해 접속해보자.

3개의 서비스가 잘 등록된 것을 볼 수 있다.

 

 


이렇게 discovery service를 사용하면 로드 밸런싱 기능을 사용할 수 있다. 우선 first-service, second-service를 각각 하나씩 더 구동해보자. (이전의 포스트에서 소개한 3가지 방법 중 무슨 방법이든 상관 없다.)

본인은 first-service는 9091 포트로, second-service는 9092 포트로 하나씩 더 구동시켰다. 이렇게 구동시키고 discovery service 브라우저에 가면 총 5개의 서비스가 등록된 것을 알 수 있다.

 

이제 우리가 직접 지정한 포트를 사용하지 말고 랜덤포트를 사용해보자.

먼저 first-service의 yml을 아래와 같이 바꿔주고, second-service도 마찬가지로 해준다.

 

이제 랜덤한 포트로 유레카 등록되었다.

 

그런데 만약 " first-service/** "이하로 요청을 보내면 2개의 first-service 중 어디에 요청이 간건지 알 수 없다. 해서 이를 알 수 있도록 하나의 컨트롤러를 하나 만들어 보자.

package com.example.firstservice;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Collections;
import java.util.Enumeration;

@RequiredArgsConstructor
@RestController
@RequestMapping("/first-service")
@Slf4j
public class FirstServiceController {

    private final Environment env; //Environment 의존성 주입

    @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 First Service.";
    }

    // 추가된 메서드
    @GetMapping("/check")
    public String check(HttpServletRequest request) {

        log.info("Server port={}", request.getServerPort());

        log.info("spring.cloud.client.hostname={}", env.getProperty("spring.cloud.client.hostname"));
        log.info("spring.cloud.client.ip-address={}", env.getProperty("spring.cloud.client.ip-address"));

        return String.format("Hi, there. This is a message from First Service on PORT %s"
                , env.getProperty("local.server.port"));
    }
}

이제 이를 테스트해보자.

 

 

 

출처 : 인프런 Lee Dowon님의 강의와 PDF 자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4

'spring cloud' 카테고리의 다른 글

Spring Cloud Bus  (0) 2022.03.06
Spring Cloud Config  (0) 2022.03.05
API Gateway Service - Spring Cloud Gateway - Filter추가하기  (1) 2022.03.01
API Gateway Service - Spring Cloud Gateway  (0) 2022.02.28
API Gateway Service - Netflix Zuul  (0) 2022.02.28