-
클라우드 마이크로 서비스 - API Gateway Service(Netflix Zuul,Filter)2Infra/클라우드 2023. 12. 14. 13:53
API Gateway Service
Netflix Zuul 구현
Step1) First Service, Second Service
- Spring Boot : 2.3.8
- Dependencies : Lombok, Spring Web, Eureka DisCovery Client
Step2) First Service, Second Service
@RestController @RequestMapping("/") public class FirstServiceController{ @GetMapping("/welcome") public String welcome(){ return "Welcome to the Second Service"; } }
First Service-application.yml
server: port: 8081 spring: application: name: my-first-service eureka: client: register-with-eureka:false fetchRegistry:false
Second Service-application.yml
server: port: 8082 spring: application: name: my-second-service eureka: client: register-with-eureka:false fetchRegistry:false
클라이언트 측에서 두 가지 요청이 Zuul이라는 게이트웨이에 도착했을 때 FirstService와 SecondService에 잘 분산이 되서 전달이 되는지 확인하고자 한다.
Step3) Test
8081, 8082 각각의 마이크로 서비스로 접근을 해서 해당하는 서비스를 사용하는 것은 크게 무리가 없을 것이다.
Step4) Zuul Service
- Spring Boot : 2.3.8
- Dependencies : Lombok,Spring Web, Zuul
Step5) Netflix Service
@SpringBootApplication @EnableZuulProxy public class ZuulServiceApplication{ public static void main(String[] args){ SpringApplication.run(ZuulServiceApplication.class, args); } }
application.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
위 yml 파일에서 `zuul :`은 줄 라우트 정보고 추가하는 설정 정보이다. first-service라는 이름과 second-sercie라는 이름으로 두가지 패스를 등록할 것이다. 쉽게 말해서 줄 이라는 API가 8000포트로 다음에 오는 경로가 first-service 시작하는 요청이 들어 오면 8081번이라는 포트로 forwarding(포워딩)을 시킬 거라는 얘기이고 second-service로 시작하는 요청이 들어오면 8082번으로 포워딩을 시키겠다는 의미이다.
Step6) ZuulFilter
마이크로 서비스가 요청이 될 때 ZuulFilter라는 것을 넣어서 요청 사전에 호출되는 특정 작업, 요청 사후에 호출되는 어떤 작업들을 일괄적으로 처리해 한다. API Gateway가 해주는 장점 중에 어떤 비지니스 서비스 로직에 사전 처리,사후 처리를 해주는 것이다. 사전 처리에서 주로 하는 작업은 인증 서비스와 관련한 것이 있고, 사후 관련된 동작을 위해서는 로깅 등의 정보를 넣을 수 있다. 이러한 작업을 해주는 것이 filter이고 이 필터는 사전 filter와 사후 필터로 나누어진다.
Netflix Zuul - Filter 적용
package com.example.zuulservice.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.exception.ZuulException; import org.springframework.stereotype.Component; @Component public class ZuulLoggingFilter extends ZuulFilter { @Override public Object run() throws ZuulException { return null; } @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } }
Zuulfilter 추상 클래스를 상속 받으면서 만들어진 ZuulLogginfFilter 클래스의 인스턴스를 만들어서 스프링 부트 안에다 @Component 역할로 등록 할 것이다. 이 것 외에 스프링에서 사용되는 빈을 용도 별로 지정할 수 있도록 애노테이션을 사용해서 스테레오타입을 등록할 수 있다.
Zuul 필터 추상 클래스의 메서는 구현하기
- run() : 해당 필터가 어떤 동작을 하는지 지정하는 메서드이다.
- filterType() : 이 메서드는 사전 필터인지 사후 필터인지 결정하는 역할을 한다. 해당 메서드에 문자열로 "pre"를 반환해주면 사전 필터가 된다.
- filterOrder(): 필터가 여러개 있을 때 필터 순서를 얘기한다.
- shouldfilter() : 해당 메소드는 해당 필터를 사용할지 말지에 대한 옵션을 결정하 수 있다. 해당 메서드에서 true 값을 반환하면 해당 필터가 사용된다.
run()메소드 구현
@Slf4j @Component public class ZuulLoggingFilter extends ZuulFilter { @Override public Object run() throws ZuulException { log.info("*********** printing logs"); // 사용자가 어디에서 어떤 URI를 요청 했는지 정보를 출력하고 싶다. RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); log.info("*********** printing logs" + request.getRequestURI()); return null; } }
사전 필터가 할일은 사용자의 요청이 들어오게 되면 해당 요청이 어디서 들어왔고 어떤 요청인지에 대해 로그에 값을 출력 해줄 것이다.
웹 프로젝트에 request, response 이런 정보를 가지고 있는 최상위 객체가 RequestContext이다. 현재의 context는 RequestContext의 getCurrentContext()메서드로 얻을 수 있다. 이렇게 해서 ZuulLoggingFilter 클래스는 웹 컨트롤러와 관련된 클래스는 아니었지만 해당 메서드로 context 인스턴스를 통해 HttpServletRequest까지 인스턴스 까지 얻어 올 수 있다.
💡 tip) LoggerFactory
org.sl4j에서 제공하는 LoggerFactory 클래스를 사용하면 간단하게 로고를 출려할 수 있는 인스턴스를 생성할 수 있다.사전 Log 출력
사용자가 어떤 정보를 전달할 때마다 프리필터 로 처리했기 때문에 위와 같은 로고가 출려된다. 이런 기능을 이용해서 지금과 같이 로그를 출력하거나 인증 정보를 체크할 수 있고 아니면 추가적인 변환 작업을 이 안에서 처리할 수 도 있다.
[출처 - Spring Cloud로 개발하는 마이크로 서비스 애플리케이션, 저 Dowon Lee]
'Infra > 클라우드' 카테고리의 다른 글
AWS - VPC 생성 (0) 2024.01.18 AWS - VPC 개념, CIDR 표기법 (0) 2024.01.18 클라우드 마이크로 서비스 - API Gateway Service(Netflix Zuul)1 (0) 2023.12.13 클라우드 마이크로 서비스 - Eureka Service Discovery (0) 2023.12.12 클라우드 마이크로 서비스 - Spring Cloud Netflix Eureka (0) 2023.12.12