🍀 ServiceDiscovery
- Microservice 가 시작 될 때, 서비스 레지스트리에 자신을 등록하고, 다른 서비스 필요로 할 때 해당 레지스트리를 조회해서 서비스의 위치를 알아낼 수 있게 한다.
- 각각의 서비스를 ServiceDiscovery에 등록하고 이후 LB가 ServiceRegistry에 위치를 물어보고 나온 곳을 통해 호출하는 것이다.
왜 ServiceDiscovery 가 필요할까?
API Gateway만 존재해도 해당 인스턴스의 IP를 직접 호출 할 수 있다. 하지만 어떤 서비스가 도메인을 사용하는 것이 아닌 IP를 사용한다던가 LB를 사용해 호출을 하게 된다면 그에 필요한 추가 설정이나 IP를 추가적으로 변경해주어야 하기 때문입니다
하지만 ServiceDiscovery를 사용하면 인스턴스의 ID나 이름을 통해 호출을 할 수 있기 때문에 추가 작업이 발생하지 않을 수 있습니다.
🍀 Spring Cloud Netflix Eureka
- ServiceDiscovery에 사용되는 오픈 소스 솔루션 중 하나이다.
- Microservice 간의 상호 발견과 통신에 도움을 준다
- 등록된 서비스들의 상태를 주기적으로 체크하고, 서비스의 가용성 정보를 최신 상태로 유지한다.
- 대시보드를 통해 연결된 서비스와 상태를 한 눈에 파악 할 수 있다.
🍀 Eureka 서버를 등록하고 서비스 등록하기 ( 실습 )
★ Eureka 서버 설정
1. pom.xml (maven)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 의존성을 주입해주어야 하는데 여기서 중요한 것은 server 인것이다. server의 역할을 하고자 하는 것이기 때문에 등록을 진행할때 이렇게 진행해주어야 한다.
2. DiscoveryServiceApplication.java
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryserviceApplication.class, args);
}
}
- @EnableEurekaServer 어노테이션을 통해 서버라는 것을 등록해줍니다
- 명시하지 않아도 작동되는 것을 확인할 수 있는데 이것은 명시를 통해 이 서비스가 eureka 서버의 역할 하고 있다고 하는 용도가 있습니다
3. application.yml
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false
fetch-registry: false
- yml 파일에 위와 같이 설정해준다. 포트번호는 8761이라는 것을 확인할 수 있고 해당 Eureka서버의 이름은 discoveryservice이다
- register-with-eureka 는 Eureka 서버로 부터 인스턴스들의 정보를 주기적으로 가져와 갱신 할 것인가를 설정하는 속성이다. 하지만 서버역할을 하는 것은 자기자신을 갱신한다는 의미가 되기 때문에 false로 설정한다
4. 등록 이후 대시보드
- 이후에 작동을 시켜본후에 localhost:8761을 해본다면 이러한 대시보드를 확인해볼 수 있다.
- 아직 등록된 서비스가 없기 때문에 Instances currently registered with Eureka 에 아무것도 없다는 것을 확인 할 수 있다.
- Eureka에서 서비스는 Application(key):Status(value) 형식으로 등록된다.
★ 서비스 (userService) 설정
1. pom.xml (maven)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 위와 달리 서비스의 역할을 하는 서버는 client가 붙은 것을 확인할 수 있다. 이로써 Eureka 서버에 등록할 준비가 되었다.
2. UserServiceApplication.java
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
- 여기도 어노테이션을 등록해주어 명시해준다. 다른건 Client라는 것이다.
3. application.yml
server:
port: 9001
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
- 이렇게 해준다면 해당 서비스가 갱신될때 자동으로 될 것이고 defaultZone 에 등록된 서버가 eureka 서버인것을 확인 할 수 있다. 여기서 /eureka 를 url에 붙여준 이유가 정확한 EndPoint가 http://localhost:8761/eureka 이기 때문이다.
4. UserService 구동 방법 및 구동 후 확인
서비스를 구동하는 방식은 다양하게 존재한다.
1. 그냥 run 버튼 누르기
별다른거 없이 그냥 재생버튼 처럼 생긴 run 버튼을 누르면 된다.
2. VM 옵션을 이용해서 재생
3. maven 명령어를 통해 터미널에서 실행 ( 1 )
mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'
4. jar 파일을 이용해서 사용 ( target 이 필요하다 )
- 빌드 시 생성된 모든 것을 삭제한다.
mvn clean
- 컴파일을 통해 target 폴더 생성
mvn compile package
- 실행
java -jar -Dserver.port=9004 ./target/user-service-0.0.1-SNAPSHOT.jar
- 구동 후 대시보드 확인
Application 에 USER-SERVICE 라는 이름으로 등록된 각각의 Status의 포트번호가 적힌 것을 확인 할 수 있다.
5. UserService 포트 변환 ( 랜덤 포트번호 )
- 앞서 4개의 방법을 알아보았지만 우리가 여러 어플리케이션을 실행하겠다고 매번 코드에서 포트번호를 바꿔주는 것은 매우 귀찮다 그것을 대비해 만들어진 랜덤 포트번호 방법이 있다.
- 바로 해당 서비스의 서버 포트를 0으로 바꿔주는 것인데 그저 0으로만 바꿔주면 eureka의 입장에서는 0의 번호가 연속되어서 저장되기 때문에 4개해도 그저 0이 연속되어 저장된다. 그래서 추가로 해야할 설정이 있다.
eureka:
instance:
instance-id:${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
- 이렇게 설정해준다면 해당 값이 랜덤한 instance id가 생성되어 저장된다는 것을 확인할 수 있다.
- 또한 실행 할 때 그저 mvn spring-boot:run 을 실행함으로써 굉장히 편해지는 것을 확인 할 수 있다.
'MSA > MSA 강좌 - 이도원 강사님' 카테고리의 다른 글
👨👧👦6. Spring Cloud Config (0) | 2024.04.01 |
---|---|
👨👧👦5. User Microservice 와 API Gateway - Security와 Filter 적용 (0) | 2024.03.30 |
👨👧👦 4. User & Catalogs & Orders Microservice (0) | 2024.03.29 |
👨👧👦 3. UserMicroservice ( 사용자 서비스 제작 ) - 1 (0) | 2024.03.28 |
👨👧👦 2. API Gateway Service (feat. Spring Cloud gateway) (0) | 2024.03.27 |