[MSA] Service Discovery - 1

hanana·2023년 10월 25일
0

본 포스팅은 인프런 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 구성요소의 표준

Spring Cloud Netflix Eureka

MSA의 구성요소에서 ServiceDiscovery 역할을 수행

  • 하나의 큰 서비스는 여러개의 인스턴스로 부하분산 처리가 가능
  • 개발하는 모든 MircoService 들은 Spring Cloud Netflix Eureka에 등록
  • 이때 Eureka는 ServiceDiscovery 역할을 수행
    -> 외부의 서버 및 클라이언트에게 MicroService를 검색할 때 사용.
  • ServiceDiscovery는 서비스 등록, 검색에 관련된 작업을 수행
  • Netflix라는 이름이 있는 이유:
    Netflix의 클라우드 기술을 스프링제단에 기부하였음
  • 사용예제
    1. MicroService들을 등록
    2. 클라이언트 혹은 다른 서버가 필요한 요청정보를 APIGateway에 요청
    3. ServiceDiscovery는 요청에 필요한 서버가 어디에 있는지 탐색하여 반환
    4. LoadBalancer를 통해 통신

EurekaServer 구현

* 개발환경(강의버전과 차이존재)
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
  • 서버구성인데 client 설정코드가 있는 이유
    eureka library을 추가한 채 애플리케이션을 구동하면 기본적으로
    eureka client로 등록되는 과정이 default로 설정이 되어있기 때문에, 현재 작업하는 애플리케이션은 client로 등록되는 상황을 막기 위함.

main.java

@SpringBootApplication
@EnableEurekaServer // Server의 작업으로 등록
public class DiscoveryserviceApplication {

    public static void main(String[] args) {
        SpringApplication.run(DiscoveryserviceApplication.class, args);
    }

}
  • @EnableEurekaServer
    EureakServer로 등록하는 Annotation

@EnalbeEurekaServer 에노테이션을 따라가면
Server로 등록하겠는듯 한 설정정보와 연결되어 있음을 확인할 수 있다.


UserService 구현 - 1

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
  • server.port : 0
    application 실행시 매번 random하게 port를 설정하여 실행하는 설정
  • spring.application.name : user-service
    EurekaServer에 인스턴스의 이름을 USER-SERVICE로 등록하는 설정
  • eureka.istance.instance-id
    0번포트로 지정했을때 Server가 같은 인스턴스로 인식하기 때문에,
    랜덤값으로 id를 새로 지정
  • eureka.client
    Eureka 클라이언트 관련 설정
  • eureka.client.defaultZone
    등록할 경로를 지정

main.java

@SpringBootApplication
@EnableDiscoveryClient // 클라이언트로 등록
public class UserserviceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserserviceApplication.class, args);
    }

}

설정을 마쳤다면
Eureka 서버를 실행한 후 클라이언트를 실행하고 유레카 서버로 접속하면
Eureka 대시보드에서비스가 등록된 것을 확인할 수 있다.

UserService 구현 - 2

User Service 한개를 더 띄워본다.

EurekaServer 에 USER-SERVICE가 두개 등록이 되었다.

이를 통해 외부에서 요청이 들어온다면
DiscoveryService를 통해서
어떤 인스턴스가 살아있는지, 사용중인 서버,포트는 어떤것인지

같은 정보값을 받아서 LoadBalancer에 의해 분산된 서비스가 실행됨.


위의 일련의 과정을 통해
scaling시 자동으로 port를 부여하고,
여러개의 instance를 생성
각각의 instance는 discoveryService에 등록이 되고,

APIGateway, ServiceRouter등에 의해 호출될 수 있는 상태가 되고
LoadBalnacer에 의해 부하분산이 가능하게 된다.

profile
성숙해지려고 노력하지 않으면 성숙하기까지 매우 많은 시간이 걸린다.

0개의 댓글