마이크로 서비스 방식으로 개발하면 클라이언트는 각 비즈니스에 따라 다른 서버에 요청을 하고 응답을 하게 된다. (서버에 직접적으로 요청)
하지만 만약 서버의 포트가 변경되는 등과 같은 일이 발생한다면 클라이언트에서 서버를 호출하는 부분을 일일이 수정해주어야 한다.
하여 이와 같은 불편함을 막고, 더 다양한 기능들을 제공하기 위해 API Gateway를 사용하여 클라이언트는 API Gateway에게 요청을 보낸다. 즉 API Gateway는 클라이언트와 서버를 중계해주는 역할을 하는 것이다.
이를 위해 우리는 먼저 Netflix Zuul을 사용해볼 것이다. (스프링 부트 2.4.X 버전 이상부터는 Netflix Zuul사용을 권장하지 않는다. 현재 스프링 팀은 Spring cloud gateway를 사용할 것을 권장한다. )
Netflix Zuul은 API Gateway의 역할을 한다.
아래와 같이 3개의 의존성을 추가한 스프링 부트 프로젝트(2.3.8버전)를 first-service 와 second-service라는 이름으로 두 개 만들었다.
first-service의 yml
server:
port: 8081
spring:
application:
name: my-first-service
eureka:
client:
register-with-eureka: false
fetch-registry: false
first-service의 컨트롤러
package com.example.firstservice;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/")
public class FirstServiceController {
@GetMapping("/welcome")
public String welcome() {
return "Welcome to the First service.";
}
}
second-service의 yml
server:
port: 8082
spring:
application:
name: my-second-service
eureka:
client:
register-with-eureka: false
fetch-registry: false
second-service의 컨트롤러
package com.example.secondservice;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/")
@Slf4j
public class SecondServiceController {
@GetMapping("/welcome")
public String welcome() {
return "Welcome to the Second service.";
}
}
이제 Zuul 서비스 프로젝트를 만들어보자.
아래의 의존성들을 추가하였다.
그리고 main메소드를 가진 ZuulServiceApplication에 @EnableZuulProxy 어노테이션을 추가한다.
package com.example.zuulservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
public class ZuulServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServiceApplication.class, args);
}
}
ZuulService의 yml
server:
port: 8000
spring:
application:
name: my-zuul-service
zuul:
routes:
first-service:
path: /first-service/**
url: http://localhost:8081
second-service:
path: /second-service/**
url: http://localhost:8082
포트를 8000으로 지정하고 /first-service/** 이하의 요청이 오면 8081의 포트에서 구동되고 있는 first-service로 이어주고,
/second-service/** 이하의 요청이 오면 8082의 포트에서 구동되고 있는 second-service로 이어주는 것이다.
이제 이들을 실행시켜 테스트해보면 아래와 같다.
8000 포트로 요청을 하면 uri에 따라 다른 서버로 요청되고 응답되는 것을 알 수 있다.
이제 여기에 간단한 필터를 적용해보자.
아래와 같이 ZuulFilter를 extends하는 간단한 로그 출력 필터를 만든다.
package com.example.zuulservice.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Slf4j
@Component
public class ZuulLoggingFilter extends ZuulFilter {
@Override
public Object run() throws ZuulException {
log.info("**************** printing logs: ");
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info("**************** " + request.getRequestURI());
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
}
해당필터는 client가 어떤 서비스(first인지 second)를 호출했는지를 콘솔에 출력해준다.
이를 테스트해보자.
출처 : 인프런 Lee Dowon님의 강의와 PDF 자료
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
'spring cloud' 카테고리의 다른 글
API Gateway Service - Spring Cloud Gateway + Eureka (0) | 2022.03.01 |
---|---|
API Gateway Service - Spring Cloud Gateway - Filter추가하기 (1) | 2022.03.01 |
API Gateway Service - Spring Cloud Gateway (0) | 2022.02.28 |
Service Discovery - User service 등록하기 (0) | 2022.02.28 |
Service Discovery - Spring Cloud Netflix Eureka (0) | 2022.02.27 |