이번에는 지금까지 만든 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에 등록시켜야 한다.
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 |