Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
를 수강하면서 작성한 글입니다.
사용자가 설정한 라우팅 설정에 따라서 각각 엔드포인트로 클라이언트 대신해서 요청하고 응답을 받으면 다시 클라이언트에 전달해주는 프록시 역할을 하게됩니다. 시스템의 내부 구조는 숨기고 외부의 요청에 대해서 적절한 형태로 가공해서 응답할 수 있는 장점을 가지고 있습니다.
마이크로서비스가 3개가 있다고 가정했을 때 클라이언트 사이드에서 마이크로서비스를 직접호출하는 그림입니다.
클라이언트 측에서 마이크로서비스의 주소를 직접 입력해서 요청을 받고 응답을 받는다고 생각하면 됩니다.
만일 새로운 마이크로서비스가 추가되거나 기존에 있었던 마이크로서비스의 주소가 변경되거나 파라미터 인자값이 변경되었다고 했을 때 마이크로서비스 자체는 독립적으로 빌드되고 배포되기 때문에 문제가 없지만 클라이언트 사이드에서는 마이크로 서비스의 주소를 직접 이용해서 호출했었기 때문에 클라이언트 사이드도 같이 수정 배포가 되어야합니다. 그러다 보니 아래와 같이 단일 진입점을 가지고 있는 형태로써 개발이 필요하게 되었고 API Gateway가 등장하게 되었습니다.
우선 2개의 마이크로서비스를 Clone 받아주시기바랍니다.
first-service
second-service
이글에서는 Spring Cloud gateway생성에 대해서만 코드를 작성하도록 하겠습니다. apigateway-service github
build.gradle
...
ext {
set('springCloudVersion', "2021.0.4")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
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}"
}
}
...
위와 같이 의존성을 추가해줍니다.
application.yml
server:
port: 8000
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: first-service
uri: http://localhost:8081/
predicates:
- Path=/first-service/**
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
first-service에 대한 요청은 다음과 같이 하면됩니다.
http://localhost:8000/first-service/**
second-service에 대한 요청은 다음과 같이 하면됩니다.
http://localhost:8000/second-service/**
우선 Clone 받은 first-service와 second-service를 모두 실행한 상태에서 apigateway-service를 실행해보겠습니다.
first-service, second-service 모두 apigateway를 통해 잘 호출됩니다.
API Gateway를 통해 서비스를 호출해봤습니다. 다음 글에서는 필터를 한번 적용해보도록 하겠습니다.
제가 잘못이해하고 있거나 잘못 작성한 부분이 있다면 지적, 비판, 피드백 뭐든 해주시면 감사하겠습니다!