최근 Spring Cloud로 개발하는 마이크로서비스 애플리케이션 강의 Spring Cloud에 대해 학습한 것을 정리하고자한다.
이번 글에서는 Eureka개념과 Eureka Server 생성 예제를 정리한다.
Eureka는
클라우드 환경의 다수의 서비스(예: API 서버)들의 로드 밸런싱 및 장애 조치 목적을 가진 미들웨어서버이다.
로드 밸런싱 : 특정 서비스를 제공하는 서버가 여러대가 있을 때 트래픽을 한 서버에 몰리지 않게 분산해주는 기술이다.
미들웨어 : 데이터를 주고 받는 양쪽의 서비스(웹의 예로 클라이언트와 API 서버)의 중간에 위치해 매개 역할을 하는 소프트웨어다.
Eureka는 이러한 미들웨어 기능을 하기 위해 각 연결된 서비스의 IP / PORT /InstanceId
를 가지고 있고 REST기반으로 작동한다.
Eureka는 Client-Sever 방식으로 Eureka Server에 등록된 서비스는 Eureka Client
로 불린다.
위 그림은 Eureka Server와 Eureka Client의 프로세스다.
각 서비스를 Eureka Server에 등록하게 되면 Eureka Server는 각 Eureka Client의 IP / PORT / InstanceId
를 저장한다.
이후 Eureka Client가 다른 Eureka Client에게 요청을 보낼 때 Eureka에서 받아온 정보를 가지고 요청을 보낼 수 있다.
서비스가 Eureka Server에 등록될 때 자신이 살아있다는 상태값을 보낸다.
그리고 Eureka Server는 다른 Eureka Client의 정보들을 제공하고 서비스는 Local Cache에 저장한다.
이후 30초(Default)마다 Eureka Server에 Heartbeats 요청을 보내고 Eureka Server는 90초 안에 Headerbeats가 도착하지 않으면 해당 Eureka Client를 제거한다.
Spring Eureka가 해주는 역할 ⇒ 포트 여러개를 하나에 등록 시켜서 사용
외부에서 마이크로서비스를 검색해서 사용하기 위해 사용
key // value로 지정
client ↔ loadbalancer ↔ discoveryservice ↔ msa1, msa2, ms3
그럼 Eureka Server의 이해를 마쳤으니 구축을 해보도록 하자!
Maven의 의존성은 다음과 같다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
설치후 꼭 다음과 같이 메인 클래스에 @EnableEurekaServer
어노테이션을 붙여 Eureka Server임을 알려준다.
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryserviceApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryserviceApplication.class, args);
}
}
application.yml은 다음과 같다.
server:
port: 8761
spring:
application:
name: discovery-service
eureka:
client:
register-with-eureka: false #eureka server를 registry에 등록할지 여부
fetch-registry: false #registry에 있는 정보들을 가져올지 여부
eureka server와의 연동 관련하여 기본적으로 사용되는 속성 값은 아래와 같다. 자세한 eureka server 설정 관련 내용은 Spring Cloud Eureka Property에서 확인 가능합니다!
name | Default | Description |
---|---|---|
eureka.client.register-with-eureka | true | 이 인스턴스가 다른 사용자가 검색 할 수 있도록 해당 정보를 eureka 서버에 등록해야하는지 여부를 나타냅니다. 경우에 따라 인스턴스가 검색되는 것을 원하지 않는 반면 다른 인스턴스를 검색하려는 경우도 있습니다. |
eureka.client.fetch-registry | true | 이 클라이언트가 유레카 서버에서 유레카 레지스트리 정보를 가져와야하는지 여부를 나타냅니다. |
eureka.client.service-url | 유레카 서버와 통신하기위한 정규화 된 URL 목록에 대한 가용성 영역 맵 각 값은 단일 URL이거나 쉼표로 구분 된 대체 위치 목록 일 수 있습니다. 일반적으로 유레카 서버 URL은 프로토콜, 호스트, 포트, 컨텍스트 및 버전 정보를 전달합니다. 예 : http://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/ 변경 사항은 eurekaServiceUrlPollIntervalSeconds에 지정된대로 다음 서비스 URL 새로 고침주기에 런타임에 적용됩니다. |
Proxy 역할을 함
단일 진입로를 통해 일관적으로 작업을 처리하고자 필요성이 증가하게됨
따라서 api gateway만 상대하면 됨
할 수 있는 것들
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
application.yml 파일에 Micro Service 정보를 등록한다. cloud.gateway.routes.uri는 기존과 다르게 lb://Eureka Server에 등록된 Micro Service Name으로 설정한다. cloud.gateway.routes.predicates에는 micro service path정보를 입력해준다. predicates에 입력된 Path와 client에서 요청 정보가 설정된 Path 맞을 경우 route.uri에 등록된 micro service로 포워딩 해준다.
이제 서버를 구동하고 http://localhost:8761을 입력하면 다음과 같은 Eureka Dashboard가 출력된다.
기존의 실습을 위해 Instance에 등록되있는 client들을 확인 할 수있다.
Eureka Client로 등록하기 위해서는 아래와 같은 의존성을 추가해야한다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml은 다음과 같다.
server:
port: 0 ## 0으로 설정시 랜덤 포트
spring:
application:
name: my-first-service
eureka:
client:
fetch-registry: true
register-with-eureka: true # eurkea서버로부터 인스턴스들의 정보를 주기적으로 가져올지 설정하는 속성, true시 받겠다는 뜻
service-url:
defaultZone: http://localhost:8761/eureka
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
{spring.application.instance_id:${random.value}} 이부분은 아래 사진처럼 다음과 같이 instance에 표시되는걸 확인할 수 있다!!
참고
https://sabarada.tistory.com/61
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