고딩왕 코범석

[MSA] Service Discovery 본문

Language & Framework/Spring

[MSA] Service Discovery

고딩왕 코범석 2021. 5. 6. 19:48
반응형

외부의 다른 서비스들이 마이크로 서비스를 검색하기 위한 개념

Key, Value로 저장된다고 가정할 때

Key Value
서비스 명들... 서비스의 위치들...

각각의 마이크로서비스가 어디에 누가 저장되어있는지, 요청 정보에 따라 서비스의 위치를 알려주는 역할이다.

스프링에서는 Spring Cloud Netflix Eureka가 있다.

클라이언트가 요청한 것을 load balancer나 api gateway로 전달되고, 요청 정보가 서비스 디스커버리에 전달되어 필요한 서비스가 어디있는지 확인한 후, 해당 마이크로 서비스에 전달한다.

@EnableEurekaServer

  • @SpringBootApplication을 실행시킴
  • 서버의 자격으로 등록을 해주는 @EnableEurekaServer.
  • 메인 메서드 실행 시 이 애플리케이션은 서비스 디스커버리 역할을 해준다고 메모리에 등록을 하는 역할

해당 애플리케이션의 이름설정

spring:
    application:
        name: xxxservice

유레카 클라이언트 설정

서비스 디스커버리는 마이크로서비스가 아닌, 요청이 왔을 경우 어느 마이크로서비스로 가야하는지 알려주는 역할이다. register-with-eureka와 fetch-registry가 디폴트로 true로 설정이 되어있는데, 이걸 false로 선언해야한다. 만약 true로 설정할 경우 이 서비스 디스커버리도 마이크로서비스로 인식이 되기 때문에 굳이 할 이유가 없는 작업이어서 false로 설정해두자.

eureka:
    client:
        register-with-eureka: false
        fetch-registry: false

@EnableDiscoveryClient vs @EnableEurekaClient

EnableDiscoveryClient는 유레카 이외에 consul, zookeeper들이 구현되어있으며, spring-cloud-commons에 기반을 두고 있다. EnableEurekaClient는 유레카 관련만 의존해 있으며, spring-cloud-netflix에 기반을 두고 있다. 만약 msa를 Eureka 기반으로 구성한다면 EnableEurekaClient를 사용하면 되고, 그 외에는 EnableDiscoveryClient를 사용하면 된다.(EnableDiscoveryClient가 좀 더 많은 것들을 구현하고 있으니깐)

@EnableDiscoveryClient 로 내 서비스 등록하기

eureka:
    client:
        # 유레카 서비스로 등록
        register-with-eureka: true
        # 해당 서비스가 검색 되도록 true 설정
        fetch-registry: true
        # 서비스 디스커버리에 내가 만든 서비스 등록하기
        service-url:
            defaultZone: http://127.0.0.1:8761/eureka

서비스를 여러 개의 인스턴스로 실행하는 방법

인텔리제이에서 실행하기

  • 인텔리제이 우측 상단에 Run/Debug Configuration에서 가능
  • 내가 만든 서비스를 카피하여
    • 밑의 Environment를 열어 VM Options에 -Dserver.port=XXXX로 설정해서 여러 포트에 같은 서버를 실행시킬 수 있다.

image-20210506170909193

이렇게 확인이 가능하다.


인텔리제이 내의 터미널에서 실행하기

  • 프로젝트의 최상단으로 이동하기(src, target, pom.xml이 있는 위치)
  • mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=XXXX'
    • -D 옵션을 통해 스프링 부트를 실행할 때 인자를 전달해주는 명령어를 실행해야한다.

image-20210506171822312

마찬가지로 확인하기!


외부 터미널로 실행하기

  • 프로젝트의 최상단으로 이동하기(src, target, pom.xml이 있는 위치)
  • mvn clean
  • mvn compile package 입력
    • 해당 프로젝트를 컴파일, 빌드하는 과정이며 끝나면 target 폴더에 jar파일 생성
  • java -jar -Dserver.port=9004 ./target/'jar 파일 명'

image-20210506172901812

랜덤포트 사용하기 (Load Balancer)

  • yml파일에 port를 0으로 설정하면 스프링부트가 알아서 랜덤하게 포트를 배정해준다.
  • 이 때, 실행한 인스턴스 설정들을 다 지워줘야 한다.

image-20210506190607303

image-20210506190758996

  • 대시보드에는 포트가 0으로 써있지만, 서비스를 실행한 콘솔에는 포트 번호가 명시되어있는 것을 확인

랜덤포트로 여러 서버 인스턴스를 실행했을 때, 대시보드에는 하나의 인스턴스만 표시되는 이유

  • 대시보드에는 host ip + service name(application name) + port로 표기되어있다.

  • application.yml 파일에 표기된 정보에 기반하여 출력되기 때문에 0번 포트로 여러 인스턴스를 돌려도 하나밖에 표기되지 않는다.

  • 이 때, 랜덤포트로 생성된 인스턴스를 대시보드에 따로 표기하는 방법

    eureka:
        instance:
            instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}

    image-20210506191735556

  • 이전과는 다르게 랜덤포트로 설정되어도 서로 다른 인스턴스로 표시된다.

반응형