[MSA]Spring Cloud Gateway& Eureka 개념 및 예제

이민우·2023년 12월 26일
3

Spring Boot

목록 보기
16/20

최근 Spring Cloud로 개발하는 마이크로서비스 애플리케이션 강의 Spring Cloud에 대해 학습한 것을 정리하고자한다.

이번 글에서는 Eureka개념과 Eureka Server 생성 예제를 정리한다.


Eureka는 무엇인가?

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를 제거한다.

Eureka Server 구축해보기

Service discovery?

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에서 확인 가능합니다!

nameDefaultDescription
eureka.client.register-with-eurekatrue이 인스턴스가 다른 사용자가 검색 할 수 있도록 해당 정보를 eureka 서버에 등록해야하는지 여부를 나타냅니다. 경우에 따라 인스턴스가 검색되는 것을 원하지 않는 반면 다른 인스턴스를 검색하려는 경우도 있습니다.
eureka.client.fetch-registrytrue이 클라이언트가 유레카 서버에서 유레카 레지스트리 정보를 가져와야하는지 여부를 나타냅니다.
eureka.client.service-url유레카 서버와 통신하기위한 정규화 된 URL 목록에 대한 가용성 영역 맵 각 값은 단일 URL이거나 쉼표로 구분 된 대체 위치 목록 일 수 있습니다. 일반적으로 유레카 서버 URL은 프로토콜, 호스트, 포트, 컨텍스트 및 버전 정보를 전달합니다. 예 : http://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/ 변경 사항은 eurekaServiceUrlPollIntervalSeconds에 지정된대로 다음 서비스 URL 새로 고침주기에 런타임에 적용됩니다.

API Gateway Service

  1. Proxy 역할을 함

  2. 단일 진입로를 통해 일관적으로 작업을 처리하고자 필요성이 증가하게됨

  3. 따라서 api gateway만 상대하면 됨

  4. 할 수 있는 것들

  • 인증, 권한 부여
  • 검색 통합
  • 응답캐시
  • 정책, qos다시 시도, 회로차단기
  • 속도제한
  • 부하분산
  • 로깅, 추적, 상관 관계
  • 헤더, 쿼리 문자열 청구 변환

gateway yml

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

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.name:{spring.application.name}:{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

profile
백엔드 공부중입니다!

0개의 댓글

관련 채용 정보