이전 포스팅에서 ApiGateway 에 대해서 다룬 글이 있다.
이번 포스팅에서는 자바에서 어떻게 ApiGateway 를 구성할수 있는지를 보고 예제 소스를 남긴다.
ApiGateway 에 대해서는 아래 참고 포스팅 참고 바란다.
우선 구현을 위해서는 Java 에서 제공하는 RouteLocator 를 사용하였다.
공식 홈페이지 아래 사이트를 참고 하면 도움 될것이다.
https://spring.io/guides/gs/gateway
그럼 이제 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를 추가하게 되면 도움이 될 것이다.
- .rewrite(regex, replacement)
그리고 나서 나머지 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
https://thenicesj.tistory.com/375
'IT > Java' 카테고리의 다른 글
Spring 내부에서 요청 파라미터 처리 과정 (12) | 2024.10.06 |
---|---|
[Error] Invalid character found in method name / HTTP method names must be tokens (12) | 2024.10.05 |
Char To Int (The method parseInt(String) in the type Integer is not applicable for the arguments (char))(getNumericValue) (8) | 2024.09.16 |
모던 자바(Modern JAVA) 란? (19) | 2024.09.02 |
@Order 어노테이션 (10) | 2024.08.24 |
댓글