
spring cloud 구성도
Spring Cloud Gateway
- API Gateway는 RESTful 하게 작성된 모든 서비스의 API를 손쉽게 관리하고, 자원의 분배를 수행하는 기능
- API Gateway는 Client의 요청이 하나의 서버로 들어와 각자 목적에 맞는 서비스를 찾아가도록 도와주는 방식
- 각 서버에서 로직을 수행한 뒤 응답 데이터를 사용자에게 로드밸런싱 해주는 역할
API Gateway가 도입되면?
- 각각의 마이크로서비스들은 서로의 포트 번호를 몰라도 된다.
- Front 에서는 요청을 Gateway로만 보내면 되기 때문에 Gateway 포트만 알면 모든 요청을 수행할 수 있다.
- 모든 요청은 Gateway 를 거치기 때문에 로그를 쉽게 다룰 수 있다.
- Gateway 가 요청의 진입점이므로 통합 인증을 수행할 수 있다.
각 마이크로 서비스들은 다른 서버들의 포트를 모두 알고 있지않아도 된다.
만약 포트가 바뀐다면 포트가 바뀐 서버를 제외한 모든 서버는 바뀐 포트번호를 각각 재빌드 해야하지만, Gateway도입을 통해 마이크로서비스들은 Gateway의 포트만 알고있으면 된다.
3가지 명칭
- Route
- 목적지 URI와 Predicates 와 Filter를 이용하여 어떤곳으로 Routing 할 것인지 명시 한 것
- Predicate
- 쉽게 조건이라고 생각하면 된다
- 아래는 user라는 모든 경로를 지정한 것
predicated: -Path=/user/**
3. Filter
-
- Gateway에 들어오는 Request, Response들을 특정 필터를 타게 함으로써 원하는 방식으로 정제하거나 조작, 로그파일 작성을 할 수 있게 명시한 것
Spring Cloud Netflix - Eureka

Eureka Server
"Netflix는 2007년 심각한 DB손상으로 3일간 서비스 장애를 겼었는데, 이에 운영진들과 기술 리더들은 신뢰성 높고 수평확장이 가능한 Cloud System으로 이전을 해야 함을 느꼈었다고 한다. 그리고 결국 MSA를 7년만에 완벽하게 이전하게 되었는데, 이 때 쌓은 경험치를 바탕으로 MSA 기술을 Spring에게 오픈소스로 풀게 되었다. "
위 MSA 기술 중 하나인 Eureka는 Eureka Server에서 각 서비스에 대한 인스턴스를 관리하며, Dashboard에서 한 번에 관리할 수 있게 해준다.
Eureka Server 생성
의존성 추가
Eureka server를 동작시키게 하기 위해 Spring Cloud Eureka Server 의존성을 추가
application.yml
#euraka-server-config
server:
port: 8761 #해당 서버가 동작되는 서버포트
spring:
application:
name: eureka-server #서비스명
eureka:
client:
register-with-eureka: false # 클라이언트 동작여부 (서버로 실행할 경우엔 false)
fetch-registry: false # false로 지정하지 않으면 자신을 디스커버리에 등록한다.
EurekaServerApplication.java
package com.furence.cloud;
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);
}
}
메인 클래스에 @SpringBootApplication 이라는 어노테이션이 붙어있는데, 해당 어노테이션 아래에 @EnableEurekaServer 어노테이션을 추가. 그럼 해당 서버는 EurekaServer 로 동작하게 된다.
localhost:8761

Eureka web
API Gateway 생성하기
의존성 추가
- Gateway를 동작시키게 하기 위해 Spring Cloud Gateway 의존성을 추가
application.yml
#api gateway
server:
port: 8000
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service
# uri: http://localhost:1001
uri: lb://USER-SERVICE # 포워딩할 주소, http://localhost:8000/user 로 들어오면 http://localhost:1001 로 포워딩
predicates:
- Path=/user/** # 해당 gateway 서버의 /user/**로 들어오는 요청은 user-service로 인식하겠다는 조건
- id: manager-service
# uri: http://localhost:1002
uri: lb://MANAGER-SERVICE # 포워딩 할 주소, http://localhost:8000/order 로 들어오면 http://localhost:1002 로 포워딩
predicates:
- Path=/manager/** # 해당 gateway 서버의 /order/**로 들어오는 요은 order-service로 인식하겠다는 조건
config:
enabled: false
application.yml 에 들어가야할 정보
- spring.cloud.gateway.routes: 라우팅에 대한 정보
- spring.cloud.gateway.routes.id: 해당 라우팅이 어떠한 이름으로 라우팅 될 것인지에 대한 이름
- spring.cloud.gateway.routes.uri: 현재 라우팅을 어디에 포워딩 시킬 것인지를 명시
- spring.cloud.gateway.routes.predicates: 조건식으로 특정 요청이 predicates에 맞는 조건으로 들어오면 해당 route를 수행할 것을 지정
API SERVER 생성하기 (user-service, manager-service)
의존성 추가
- Springboot의 일반적인 서버로 동작하기 위해 Spring Web 의존성을 추가
application.yml (user-service)
#user-service
server:
port: 1001
spring:
application:
name: user-service
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka
application.yml (manager-service)
#manager-service
server:
port: 1002
spring:
application:
name: manager-service
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka
USER-SERVER
package com.furence.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
@RestController
@RequestMapping("user")
public class UserApiApplication {
public static void main(String[] args) {
SpringApplication.run(UserApiApplication.class, args);
}
@RequestMapping(method = RequestMethod.GET, path = "/info")
public String getInfo() {
return "I'M user/info";
}
}
MANAGER-SERVER
package com.furence.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
@RestController
@RequestMapping("manager")
public class ManagerApiApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApiApplication.class, args);
}
@RequestMapping(method = RequestMethod.GET, path = "/info")
public String getInfo() {
return "I'M manager/info";
}
}
위 세팅이 종료되었다면, api-gateway로 들어오는 /user/** 요청은 user-server로 라우팅 되며,
마찬가지로 gateway의 /manager/**의 요청은 manager-server로 요청이 라우팅되는것을 확인 할 수 있을 것이다.