본문 바로가기

Spring/API Gateway

1) Spring Boot API Gateway - 1부 Eureka설정

반응형

시작하기에 앞서 api gateway라는게 뭘까? 하고 찾아 보았다. 어떤 기능을 하는것이 왜 사용하고 

그래서 사용하면 뭐가 좋아지는것 인가?

 

api gateway 는 말그래도 api 의 문 역활을 하는 기능을 애기한다.

서비스에 필요한 모든 api를 이 api gateway server를 통해서 요청받게 되는것이다. 

요청받은 api 는 api gateway에 연결되어 있는 마이크로서비스들로 routing 하는 기능을 한다고 생각하면 된다.

 

이렇게 되면 Client에서는 기능별로 해당 API 가 어디에 위치해 있는지 관리할 필요 없이 api gateway만 바라보게 되고 

api 서버에서도 api gateway로드밸런싱이나  응답시간 조절 또는 circuitbreak 같은 기능을 제공해 서버의 안정성을 

도모하게 된다.

 

아래는 지금부터 구성해 볼 서버의 기본 환경을 나타낸 그림이다.

해당 그림에서 유레카 server는 각 서버들( api-gateway , internal-server1, internal-server2)의 상태를 관리하고 api-gateway 서버가 internal-server의 로드밸런싱을 위한 instance 정보를 조회하는 기능으로 사용된다.

 

먼저 Eureka서버에 대해 알아보자. Eureka 서버의 목적과 역활은 무었일까? 

Eureka 서버의 목적은 internal-server 라는 내부 서비스 server가 1대에서 2대로 늘었다고 가정을 하면 

internal-server를 바로보던 내부서비스들은  신규로 추가된 서버에 대해 인지 하지 못하게 되고 이를 위해 다른 내부서비스들의 

재시작등을 진행하게 되게되면 서비스 중단까지 고려를 해야 하는 상황이 생기게된다.

 

Eureka 서버의 목적은 이런 상황에서 내부서비스의 증감에 따른 다른 서비스들의 영향을 없애고 서비스들의 상태를 관리하고자 하는 목적으로 만들어졌다.

 

어떤식으로 Eureka서버가 작동을 하는지 테스트를 통해 알아보자. 

 

1. Eureka server 설정

//eureka-server build.gradle
plugins {
    id 'org.springframework.boot' version '2.5.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.msa'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2020.0.3")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}

그리고 eureaka-server의 run application 파일이다.

package com.msa.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}
//applicaton.yml
server:
  port: 8761

spring:
  application:
    name: eureka-server

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

eureka.client.register-with-eureka : 해당 application을 eureka 서버에 등록되지 여부

eureka.client.fetch-registry : eureka 서버에 등록된 instance 정보를 조회할때 client에 저장된 cache 값을 사용한다는 의미. 

                                                   false이면 cache를 사용하지 않고 계속해서 eureka-serve에서 조회한다.

 

이렇게하면 기본적인 eureka-server의 설정은 끝!

 

2. internal-server 에 설정

//internal-server build.gradle
plugins {
    id 'org.springframework.boot' version '2.5.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.msa'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2020.0.3")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}
//internal-server application.yml
server:
  port: 0

spring:
  application:
    name: auth-service

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

serve.port : 0 으로 설정하게 되면 random으로 port 설정이 된다. 

eureka 설정부분을 보면 앞에서 설정한 eureka-server의 설정된 서버 정보를 defalutZone에 등록.

instance 정보는 해당 application의 instance id 를 표시하는 값을 나타낸다. 해당 id가 eureka-server에 등록된다.

 

여기까지 설정하고유레카 서버와 internal 서버를 실행해보자.

 

 

정상적으로 eureka-server가 실행되고 internal-server도 정상 등록되었다.

이제 api gateway에서 어떻게 eureka-server에 등록된 service들을 가져와서 사용하는지에 대해 

2부에서 알아보자.