<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
먼저, First service와 Second service를 Eureka server에 등록하고 Gateway service도 등록해 준다. 그러기 위해서 Eureka client 의존성을 설정해준다.
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
Gateway도 등록해 줄 예정이기 때문에 true
로 변경해준다. 유레카 8761에 서비스를 등록하겠다는 뜻으로 보면 된다.
이 외에도 각 Service들도 마저 등록해준다.
# uri: http://localhost:8082/
uri: lb://MY-SECOND-SERVICE
uri 값을 기존 경로에서 네이밍 경로로 바꿔주었다. 이때, lb
는 Discovery Service 안에 있는 MY-SECOND-SERVICE
를 찾겠다. 이런 뜻으로 받아들이면 된다.
조금 더 체크해 주보면 uri 값은 각 서비스 네임으로 바꿔주면 된다. 서비스 네임은 yml 파일에 정의되어 있을 것이다. 이렇게 다 수정을 마쳤으면 서버를 돌려서 게이트웨이가 정상 동작하는지 다른 서비스들이 정상적으로 호출되는지 테스트한다.
나는 이때 java.net.UnknownHostException
오류가 났는데 해결 방법을 기록해 두었다.
이제 각 서비스를 2개씩 기동하도록 설정해 줘야 한다. 방법에는 3가지가 있다.
VM Option에서 다른 포트로 설정해주기
mvn spring-boot:run-Dspring-boot.run.jvmArguments='-Dserver.port=새로운포트번호
로 동작시키기
mvn clean compile package
java -jar -Dserver.port=포트번호 ./target/user-service-0.0.1-SNAPSHOT.jar
마지막은 직접 패키지를 만들고 실행하는 방법이다.
이렇게 3가지 방법이 있다고 보면 된다. 내가 사용하기엔 첫 번째 방법이 제일 무난해서 첫 번째 방법으로 서버를 늘려 줄 것이다. 활용하는 방법은 아래와 같다.
Edit Configuration
을 통해 진행을 해주면 된다.
좌측에서 먼저 서비스를 클릭하고 상단에 복사 버튼을 누르면 바로 아래 (1)
이 추가된 복사된 서비스가 생기게 된다. 그 후에 우측에 VM options
를 수정해 주면 되는데 여기에 -Dserver.port=9091
이렇게 포트를 9091
로 설정해서 생성해주었다.
설정이 다 되고 나면 아까는 없었던 (1)
버전의 서비스가 생긴 것을 확인할 수 있다.
이제 Eureka에 등록된 인스턴스를 확인해 보면 각 서비스들의 포트가 늘어난 것을 볼 수 있다. 각 서버의 경로로 접속을 해 봐도 정상적으로 동작하는 것을 확인할 수 있는데 어떤 포트를 사용하는지 알 수가 없어 답답하다.
server:
port: 0
spring:
application:
name: my-first-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
instance:
prefer-ip-address: true
# instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
먼저, 포트를 랜던 포트인 0
으로 설정해 주었는데 포트를 0
으로 해주면 실질적으로 Eureka 인스턴스에 하나만 표시가 되기 때문에 여러 개의 서버를 켰을 때 알 수 없다는 단점이 있다. 때문에 eureka.instance.instance-id
를 설정해 줘야 한다.
위에서 보면 instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
마지막에 랜덤 값으로 생성되게 설정해 주었다. 이렇게 설정을 마치고 서버를 돌려보면 아래와 같이 나온다.
이때 인스턴스의 Status에 마우스를 올려보면 좌측 하단에 랜덤으로 생성된 Port
번호가 살짝 나오게 되어 해당 서버의 포트를 체크할 수 있다.
두 번째 서버를 생성할 때에는 위에서 했던 과정을 그대로 따라가면 되는데 VM options
에 아무런 값을 안 넣어주면 자동으로 랜덤 포트가 설정되게 된다.
서비스 한 개를 서버 여러대 돌릴 때 일일이 포트를 설정해 주지 않고 위 처럼 랜덤으로 포트를 설정해 주었다. 하지만 어떤 포트를 실행하고 있는지 알 수가 없으니 이를 확인하는 코드를 넣어줘야 한다.
http://localhost:8000/first-service/check
이 경로에서 확인을 해 볼 것이다.
@Slf4j
@RestController
@RequestMapping("/first-service")
@RequiredArgsConstructor
public class FirstServiceController {
private final Environment env;
// @Autowired
// public FirstServiceController(Environment env) {
// this.env = env;
// }
@GetMapping("/check")
public String check(HttpServletRequest request) {
log.info("Server port = {}", request.getServerPort());
return String.format("Hi, there. This is a message from First Service on PORT %s",
env.getProperty("local.server.port"));
}
}
application.yml에 명시되어 있는 설정 내용을 클래스 파일로 가져올 수 있는 여러 방법이 있는데 그 중에서 Environment
를 사용해 봤고 로그는 HttpServletRequest
로 받아서 체크해 봤다.
먼저, Environment
를 주입받아야 하는데 나는 @RequiredArgsConstructor
를 사용해 자동으로 생성자가 한 개인 경우 만들어주어 사용했는데 다른 방법으로 주석을 참고할 수 있다. Spring에서는 생성자를 통해 사용하는 것을 최근에 권장하고 있다고 들었던 것 같다.
log.info("Server port = {}", request.getServerPort());
로그를 찍어보고 출력에서는 env.getProperty("local.server.port")
로 포트를 확인할 수 있게 했다.
이렇게 모두 설정이 되었으면 이제 서버를 돌리고 http://localhost:8000/first-service/check
경로를 실행해 본다.
테스트 실행은 PostMan에서 진행했다.
(1)
서버가 실행이 된 것을 볼 수 있다. 여러번 눌렀을 때 서로 왔다갔다 하면서 쌓이는 것 같다. 이렇게 Load Balancer 코딩을 마무리한다.