본 포스팅은 인프런 Dowon Lee님의
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의를 토대로 작성되었습니다.
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
* 2018년 gartner 제단에서 공개한 사실상의 MSA 구성요소의 표준
MSA의 구성요소에서 ServiceDiscovery 역할을 수행
- 하나의 큰 서비스는 여러개의 인스턴스로 부하분산 처리가 가능
- 개발하는 모든 MircoService 들은 Spring Cloud Netflix Eureka에 등록
- 이때 Eureka는 ServiceDiscovery 역할을 수행
-> 외부의 서버 및 클라이언트에게 MicroService를 검색할 때 사용.- ServiceDiscovery는 서비스 등록, 검색에 관련된 작업을 수행
- Netflix라는 이름이 있는 이유:
Netflix의 클라우드 기술을 스프링제단에 기부하였음- 사용예제
1. MicroService들을 등록
2. 클라이언트 혹은 다른 서버가 필요한 요청정보를 APIGateway에 요청
3. ServiceDiscovery는 요청에 필요한 서버가 어디에 있는지 탐색하여 반환
4. LoadBalancer를 통해 통신
* 개발환경(강의버전과 차이존재)
windows11
SpringBoot 2.7.17
JAVA 17
application.yml
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false #default : true
fetch-registry: false #default : true
main.java
@SpringBootApplication
@EnableEurekaServer // Server의 작업으로 등록
public class DiscoveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryserviceApplication.class, args);
}
}
@EnalbeEurekaServer 에노테이션을 따라가면
Server로 등록하겠는듯 한 설정정보와 연결되어 있음을 확인할 수 있다.
application.yml
server:
port: 0 #Random Port 사용
spring:
application:
name: user-service
eureka:
instance:
#instance id를 지정
#hostname:instance_id:random_value
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
client:
register-with-eureka: true # Eureka서버에 클라이언트로 등록하겠다는 설정
fetch-registry: true # Eureka 서버로부터 인스턴트들의 주기적으로 가져오겠다는 설정
#서비스 위치를 지정해주는 설정
service-url:
#아래 경로에 MicroService로 등록
defaultZone: http://127.0.0.1:8761/eureka
main.java
@SpringBootApplication
@EnableDiscoveryClient // 클라이언트로 등록
public class UserserviceApplication {
public static void main(String[] args) {
SpringApplication.run(UserserviceApplication.class, args);
}
}
설정을 마쳤다면
Eureka 서버를 실행한 후 클라이언트를 실행하고 유레카 서버로 접속하면
Eureka 대시보드에서비스가 등록된 것을 확인할 수 있다.
User Service 한개를 더 띄워본다.
EurekaServer 에 USER-SERVICE가 두개 등록이 되었다.
이를 통해 외부에서 요청이 들어온다면
DiscoveryService를 통해서
어떤 인스턴스가 살아있는지, 사용중인 서버,포트는 어떤것인지
같은 정보값을 받아서 LoadBalancer에 의해 분산된 서비스가 실행됨.
위의 일련의 과정을 통해
scaling시 자동으로 port를 부여하고,
여러개의 instance를 생성
각각의 instance는 discoveryService에 등록이 되고,
APIGateway, ServiceRouter등에 의해 호출될 수 있는 상태가 되고
LoadBalnacer에 의해 부하분산이 가능하게 된다.