본문 바로가기
IT/Java

ApiGateway 예제

by 성준하이 2024. 9. 28.
반응형

이전 포스팅에서 ApiGateway 에 대해서 다룬 글이 있다.

 

이번 포스팅에서는 자바에서 어떻게 ApiGateway 를 구성할수 있는지를 보고 예제 소스를 남긴다.

 

ApiGateway 에 대해서는 아래 참고 포스팅 참고 바란다.

 

우선 구현을 위해서는 Java 에서 제공하는 RouteLocator 를 사용하였다.

공식 홈페이지 아래 사이트를 참고 하면 도움 될것이다.

https://spring.io/guides/gs/gateway

 

Getting Started | Building a Gateway

As a good developer, we should write some tests to make sure our Gateway is doing what we expect it should. In most cases, we want to limit our dependencies on outside resources, especially in unit tests, so we should not depend on HTTPBin. One solution to

spring.io

 

그럼 이제 MSA 환경이라고 가정하고 

맨 처음으로 서비스가 들어오는 프로젝트를 하나 만든다.

그리고 분기를 테스트할 각각의 별도 프로젝트를 하나 만든다.

 

아래 사진처럼 프로젝트를 만든다고 생각하면 이해하기 쉽다.

 

그럼 ApiGateway 프로젝트에서 할 작업은 아래와 같다.

  • ApiGateway 를 구현할 RouteLocator Bean 생성
    예제코드는 아래와 같다.
@Configuration
public class apigatewayconf {

     @Bean
     public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
          return builder.routes()
              .route("apigateway1_Test", predicate -> predicate
                  .path("/test/apigateway1/**")
                  .filters(filter -> filter
                     .rewritePath(
                     "/test/apigateway1/(?<path>.*)",
                       "/${path}"
                      )
                 )
                 .uri("http://localhost:8080"))
              .route("apigateway2_Test2", predicate -> predicate
                 .path("/test/**")
                   .uri("http://localhost:8081/"))
             .build();
     }
}

 

각각 설명하면 

  • @Configuration
    스프링 빈 등록을 위해 설정한다.
  • @Bean
    객체가 빈 으로 등록하기 위해 설정한다.
  • RouteLocator
    스프링에서 제공하는 RouteLocator 이다.
  • .route("이름", "설정")
    분기 이름을 설정하고 설정부분에 path, uri 등 설정한다. 자세한 세부내역은 아래 참고 

이렇게 까지 하면 간단히 설명하면

/test/apigateway1 로 들어오는 서비스에 대해서는 localhost:8080 의 프로젝트로 redirect 될 것이고

/test/apigateway2 로 들어오는 서비스에 대해서는 localhost:8081 의 프로젝트로 redirect 될 것이다.

 

.route 이하 세부 설정 관련

세부 설정을 하여 redirect 를 설정할수 있다.

  • 조건 라우팅
.path("/test/apigateway1/**")
.and().header("secret_custom_header")
.and().between(nowTime("20240926"), nowTime("20240928")) // nowTime 함수는 아래 별도 구현 필요
.uri("http://localhost:8081"))

이렇게 헤더값이나 날짜 등으로 추가 설정을 하여 라우팅 가능(and() 를 통해서 계속해서 조건 추가)

 

  • 비중 라우팅
.path("/test/apigateway1/**")
.and().weight("openapi", 8)
.uri("http://localhost:8081"))


.path("/test/apigateway1/**")
.and().weight("openapi", 2)
.uri("http://localhost:8082"))

이런식으로 .weight 설정을 주어 8:2로 비중으로 나뉠수 있다.

카나리아 테스트 등에서 사용하면 도움이 된다.(참고 포스팅 참고)

 

  • filter 라우팅
    현재 예제 코드에서도 적용이 되어있다.
    • .rewrite(regex, replacement)
      현재 적용되어있는 rewrite는
      rewritePath(변경할 문자열정규식 , 변경할 텍스트)
      이므로 예제에서는
      server.com/test/apigateway1/~~~ 로 들어오는 요청은
      localhost:8080/~~~ 로 보내라 라는 의미이다.
    • .stripPrefix(n)
      n은 숫자가 가능하고 숫자만큼 uri 의 값을 제거해준다. 
      예시는 n을 1로 설정하면
      server.com/test/apigateway1/~~~ 로 들어오는 요청은
      localhost:8080/apigateway1/~~~ 로 들어가게 된다.
    • .addRequestParameter("param", "testparam")
      의미 그대로 restapi 호출을 하게 될때 파라미터를 추가한다.
      보안상 특정 param이나 header를 추가하게 되면 도움이 될 것이다.

 


 

그리고 나서 나머지 2개의 프로젝트에 각각 경로에 맞는 api 를 생성해두면 redirect 가 되는걸 확인 할 수 있다.

 

참고로 apigateway 프로젝트에서는 maven 기준 pom.xml 에 

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

추가와

설정 yaml 파일에 

spring.main.web-application-type=reactive 

설정을 추가해야한다.

https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway

 


참고 포스팅

https://thenicesj.tistory.com/266

 

API Gateway란?

요즘 인기있는 디자인 아키텍쳐 중에 가장 많이 언급되고 있는 MSA 를 알고 해당 포스팅을 보는것을 추천한다. 만약 MSA 에 대한 개념을 모른다면 아래 참고포스팅을 한번 보고 해당 포스팅을 읽

thenicesj.tistory.com

https://thenicesj.tistory.com/375

 

DevOps 에서의 Blue-Green 배포, A/B 테스트, Canary Release

이 순서는 무중단 배포 전략 이다. 요즘은 MSA 아키텍처를 많이 지향하고 있는 추세이다. 이런 트렌드에 맞춰 배포 전략도 다양하게 개발되고 발전하여 변화하고 있다. 이번 포스팅 살펴볼 내용

thenicesj.tistory.com

 

반응형

댓글