## 0. 게이트웨이 서버 프로젝트 생성
![[Pasted image 20231221160829.png]]
- [스프링 부트 프로젝트 생성 페이지](https://start.spring.io/)에서 프로젝트를 생성한다.
```yml
server:
port: 8000
spring:
application:
name: gateway-server
cloud:
gateway:
routes:
- id: configservertest
uri: http://localhost:8001
predicates:
- Path=/print/**
- id: eureka
uri: http://localhost:8002
predicates:
- Path=/eureka
```
- `application.properties`를 `application.yml`로 확장자를 변경한 다음 위의 코드를 입력한다.
- `spring.cloud.gateway.routes` 설정은 게이트웨이를 통해 어떻게 라우팅하는지에 대한 설정이다. 설정 방식은 API 프록시 설정 방법과 똑같다.
- 위 설정을 중 `configservertest`를 예로 들어보자.
- 클라이언트가 `http://localhost:8000/print/hello`로 요청을 보내면 게이트웨이는 `predicates`인 `/print/hello`를 통해 라우팅 경로를 찾는다.
- `/print/hello`는 `/print/**`에 속하기 때문에 라우팅 경로는 `http://localhost:8001`에 해당한다.
- 게이트웨이는 `http://localhost:8001/print/hello`로 요청을 보내고 받은 응답을 클라이언트에게 전달한다.
## 1. 게이트웨이 테스트
```java
@RestController
public class PrintController {
@GetMapping("/print/{text}")
public String printText(@PathVariable("text") String text) {
return text;
}
}
```
- 현재 [[7. Spring Cloud Config를 통한 Config 관리#5. Config 서버 테스트|Config 서버 테스트 서버]]에 `/print/**` 요청을 처리할 컨트롤러가 없다. 케이트웨이가 정상적으로 요청을 분류하는지 테스트하기 위해 컨트롤러를 생성하자.
![[Pasted image 20231221165848.png]]
- 컨트롤러를 생성한 다음 재기동한다. 그리고 `http://localhost:8000/print/hello`로 접속하면 게이트웨이가 정상 작동하고 있는 걸 확인할 수 있다.
## 2. 게이트웨이와 Eureka 서버 연동
```groovy
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
```
- 게이트웨이 서버에 Eureka 클라이언트 의존성을 추가한다.
```yml
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka-manager:qwerty123@localhost:8002/eureka
```
- 게이트웨이 서버의 설정에 위 Eureka 클라이언트 설정을 추가한다. 사용하는 Eureka 서버는 이전에 만든 [[8. Spring Cloud Eureka를 통한 마이크로서비스 모니터링|Eureka 서버]]와 같다.
```yml
spring:
application:
name: gateway-server
cloud:
gateway:
routes:
- id: configservertest
uri: lb://CONFIGSERVERTEST # before : http://localhost:8001
predicates:
- Path=/print/**
```
![[Pasted image 20231221171352.png]]
- 라우팅 설정에서 uri를 `lb://[애플리케이션 name]`으로 변경한다. 여기서 `lb`는 로드밸런서를 의미한다.
## 3. Eureka 서버 연동 테스트
이제 Eureka 서버 연동을 테스트해보자. Eureka를 통해 로드밸런싱이 되고 있다는 걸 확인하기 위해서는 요청을 받은 서버의 Origin을 확인할 수 있어야 한다. 현재 호스트는 `localhost`로 같으니 포트 번호로 서버를 구분할 것이다.
```java
@RestController
public class PrintController {
@GetMapping("/print/{text}")
public String printText(
@PathVariable("text") String text,
@Value("${server.port}") String port) {
return "Server is running on port: " + port + "\n Text: " + text;
}
}
```
![[Pasted image 20231221174605.png]]
- 현재 포트 번호도 텍스트와 함께 출력하도록 서블릿을 수정하자. 포트 번호는`@Value` 어노테이션을 통해 받아올 수 있다.
```powershell
cd [Config 서버 테스트 서버 프로젝트 디렉터리]
./gradlew bootjar
```
![[Pasted image 20231221172038.png]]
- 이제 서버를 수동으로 [[IT 용어 정리 📕#`스케일아웃`|스케일아웃]]해보자.
- 위 명령어를 통해 Jar 파일을 생성한 다음 Jar 파일로 애플리케이션을 실행할 것이다.
![[Pasted image 20231221172824.png]]
```powershell
java -jar '-Dserver.port=[포트 번호]' [jar 파일 경로]
```
- 위 사진처럼 powershell을 3개 실행한 서로 포트 번호를 다르게 하여 Jar 파일을 실행한다.
![[Pasted image 20231221172957.png]]
- Eureka 페이지에 들어가보면 위처럼 원래 실행되고 있던 서버와 방금 실행한 서버 3개가 동시에 실행되고 있다. 이 서버 4개의 상태를 고려하여 Eureka 서버는 로드밸런싱을 할 것이다.
![[ezgif-4-c0821f54cc.gif]]
- `http://localhost:8000/print/hello`로 접속하면 로드밸런싱이 잘 작동되고 있는 것을 확인할 수 있다.