모놀리식 서비스에서 시간이 지나니 기능이 많아지고 코드가 방대해 졌다.
불편한 점이 생기기 시작했다.
유지보수 및 협업이 힘들어졌다. 특히 아주 작은 수정이 일어나도 전체 서비스를 재기동 해야 하는 단점이 있다.
그래서 기능 별로 서버를 분리하게 되었다.(나름 마이크로 서비스의 시작?)
점차 서버가 늘어나게 되고 서버간의 통신하는 과정이 많다보니 서버 환경이 바뀔 때마다(ip 변경, 도메인 변경, 새로운 서버 추가 등등) 한번 씩은 문제가 발생하기 시작했다.
그래서 spring cloud를 도입하게 되었다.
유레카 서버는 각각 분산된 서버를 등록하고 관리해 주는 미들웨어 이다.(서비스 디스커버리)
각 서버가 시작될 때 유레카 서버에 등록한다. 각 서버에서 다른 서버로 요청할 때는 유레카 서버에서 그 정보를 받아서 요청한다.
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
server:
port: 8761 # 기본포트 8761
spring:
application:
name: discovery # 서버 이름
eureka:
client:
register-with-eureka: false # 자기 자신은 등록하지 않음
fetch-registry: false
일단 실행해보자.
8761번 포트로 잘 등록이 되었다.
http://localhost:8761/ 로 접속하면 현재 유레카에 등록된 서비스들을 볼 수 있다.
예제는 간단하게 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
@SpringBootApplication
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
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
랜덤포트로 등록한 이유는 서비스간 통신을 할 때 서비스 이름으로 유레카 서버에서 정보를 가져와서 사용하기 때문에 포트가 변해도 통신이 가능하다.
서비스 이름으로 잘 등록 되어 있다.
GET http://localhost:8761/eureka/apps
GET http://localhost:8761/eureka/apps/{appName}/{instanceId}
전체 코드