Spring Cloud 를 이용한 MSA #1. Service Discovery(Eureka)

Bobby·2023년 2월 3일
0

spring cloud

목록 보기
1/6
post-thumbnail

모놀리식 서비스에서 시간이 지나니 기능이 많아지고 코드가 방대해 졌다.

불편한 점이 생기기 시작했다.

유지보수 및 협업이 힘들어졌다. 특히 아주 작은 수정이 일어나도 전체 서비스를 재기동 해야 하는 단점이 있다.
그래서 기능 별로 서버를 분리하게 되었다.(나름 마이크로 서비스의 시작?)

점차 서버가 늘어나게 되고 서버간의 통신하는 과정이 많다보니 서버 환경이 바뀔 때마다(ip 변경, 도메인 변경, 새로운 서버 추가 등등) 한번 씩은 문제가 발생하기 시작했다.

그래서 spring cloud를 도입하게 되었다.

1. spring cloud discovery(eureka)

유레카 서버는 각각 분산된 서버를 등록하고 관리해 주는 미들웨어 이다.(서비스 디스커버리)
각 서버가 시작될 때 유레카 서버에 등록한다. 각 서버에서 다른 서버로 요청할 때는 유레카 서버에서 그 정보를 받아서 요청한다.


2. eureka 서버 생성하기

  • @EnableEurekaServer 어노테이션을 작성해야 유레카 서버로 동작한다.
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

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

}

application.yml

  • 유레카 서버는 따로 설정을 하지 않으면 30초에 한번씩 인스턴스 정보를 갱신한다.
  • 90초 후에도 연결응답이 없으면 연결이 끊어진 것으로 판단하고 등록을 해제 한다.

server:
  port: 8761 # 기본포트 8761

spring:
  application:
    name: discovery # 서버 이름

eureka:
  client:
    register-with-eureka: false # 자기 자신은 등록하지 않음
    fetch-registry: false

일단 실행해보자.

8761번 포트로 잘 등록이 되었다.

http://localhost:8761/ 로 접속하면 현재 유레카에 등록된 서비스들을 볼 수 있다.

  • 현재는 등록된 서비스가 없다.

3. 서비스 등록하기

예제는 간단하게 API 서비스와 AUTH 서비스를 멀티모듈로 구성했다.

  • 참고 -> 멀티모듈 생성하기

  • 유레카 클라이언트는 30초에 한번씩 heartbeat를 날려 연결되어 있음을 알린다.

의존성

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

참고 : Spring Cloud 프로젝트를 사용하기 위해서는 dependencyManagement가 필요함!

ext {
    set('springCloudVersion', "2021.0.5")
}
dependencies {
    // 의존성
}
dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}
  • @EnableDiscoveryClient 어노테이션은 없어도 동작하는데 문제가 없지만 명시적으로 작성한다.
@EnableDiscoveryClient
@SpringBootApplication
public class ApiApplication {

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

}

application.yml

server:
  port: 0 # 랜덤포트

spring:
  application:
    name: api-service # 서비스 이름

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

실행

  • 랜덤포트로 등록한 이유는 서비스간 통신을 할 때 서비스 이름으로 유레카 서버에서 정보를 가져와서 사용하기 때문에 포트가 변해도 통신이 가능하다.

  • 서비스 이름으로 잘 등록 되어 있다.


4. Eureka Rest Api

현재 등록된 전체 앱 정보 조회

GET http://localhost:8761/eureka/apps

앱 정보 상세 조회

GET http://localhost:8761/eureka/apps/{appName}/{instanceId}


전체 코드

profile
물흐르듯 개발하다 대박나기

0개의 댓글