ServiceDiscovery - eureka

Jifrozen·2021년 5월 25일
0

msa

목록 보기
1/2

Service Discovery

msa에서는 여러 서비스 간의 호출로 구성이 된다.

일반적으로 IP와 포트를 통해 호출을 하는데, 클라우드 환경에서는 IP가 동적으로 변경되는 일이 많기 때문에 유효한 위치를 알아내는 기능이 필요하다.

필요한 서비스를 찾아주는 일을 서비스 디스커버리가 한다.

Spring Cloud Netflix Eureka

넷플릭스 회사 자사 클라우드 기술을 기부한 제품
1. 유레카 서버에 서비스 등록
2. 클라이언트는 로드밸런서 (API Gateway)에 필요한 정보 요청
3. 서비스 디스커버리가 요청한 정보를 찾아준다


프로젝트 생성

유레카는 클라이언트와 서버 두 부분으로 구성 되어 있다.

서버

의존성 추가

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

다른 서비스와 통신할 수 있는 레지스트리 구축

    @SpringBootApplication
    @EnableEurekaServer
    public class DiscoveryserviceApplication {

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

    }

application.yml

server:
port: 8761

spring:
application:
    name: discoveryservice

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

클라이언트

  1. 자신을 유레카 서버에 등록하고 호스트, 포트, 상태정보, URL, 홈페이지 URL을 보낸다.
  • 유레카 서버는 각 서비스로부터 생존신호 메시지를 받는다
  • 설정된 기간 동안 생존신호 메시지를 박지 못하면 서비스가 삭제된다
  1. 서버로부터 데이터를 가져와서 캐싱하고 주기적으로 변겅사항을 점검한다

의존성 추가

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

@EnableDiscoveryClient는 spring-cloud-commons에 존재하고,

@EnableEurekaClient는 spring-cloud-netflix에 존재하고 유레카만을 위해 작동한다.

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {

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

}

application.yml
server:
port: 0

spring:
application:
    name: user_service

eureka:
instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
    defaultZone: http://127.0.0.1:8761/eureka

.yml파일은 등록에서 더 자세하게 다뤄본다.


등록

여러개 서비스를 등록하면 port 충돌의 위험으로 제대로 작동하지 않는다.
여러 방법을 제시하며 더 나은 해결방법을 찾아낸다
1. .yml파일에서 포트 번호 수정 -> 매번 수정할 수 없음
2. edit configuration 이용
-Dserver.port=9002
3. 터미널에서 포트번호 설정

mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'
  1. 포트 번호를 랜덤으로 할당 - 랜덤포트

       server:
       port: 0
    
       spring:
       application:
           name: user_service
    
       eureka:
       instance:
           instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}



0개의 댓글