반응형

Spring Cloud Gateway에서는 일반적으로 POST /actuator/gateway/refresh 를 사용하여 라우팅 동적반영을 지원한다.

다만, actuactor에서 gateway 엔드포인트를 활성화해야 하는데, 만약 사용하지 않는다면 아래와 같이 직접 refresh 이벤트를 호출하는 컨트롤러를 만들어서 호출하면 된다.

 

@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class SpringCloudGatewayController {
    private final ApplicationEventPublisher applicationEventPublisher;

    @PostMapping("/refresh")
    public Mono<Void> refresh() {
        this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
        return Mono.empty();
    }

 

반응형

'Spring > Spring Cloud' 카테고리의 다른 글

[Spring Cloud] Gateway + OAuth2 Client  (0) 2022.11.21
Spring Cloud Gateway 다중 포트 가능 여부  (0) 2022.10.24
Spring Cloud Gateway  (0) 2022.10.24
반응형
plugins {
	id 'org.springframework.boot' version '2.7.5'
}

...
	implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

 

spring:
  cloud:
    gateway:
      routes:
      - id: test
        uri: http://httpbin.org
        predicates:
        - Path=/get
        filters:
        - TokenRelay=
  security:
    oauth2:
      client:
        registration:
          login-client:
            provider: uaa
            client-id: login-client
            client-secret: secret
            authorization-grant-type: authorization_code
            scope: openid,profile,email,resource.read
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        provider:
          uaa:
            authorization-uri: http://localhost:8090/uaa/oauth/authorize
            token-uri: http://localhost:8090/uaa/oauth/token
            user-info-uri: http://localhost:8090/uaa/userinfo
            user-name-attribute: sub
            jwk-set-uri: http://localhost:8090/uaa/token_keys

 

IDP

https://github.com/spring-cloud-samples/sample-gateway-oauth2login

 

수정사항

uaa-server/build.gradle

 

installUrl = 'https://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.43/bin/apache-tomcat-8.5.43.zip'

=> installUrl = 'http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.43/bin/apache-tomcat-8.5.43.zip'

 

uaa-server/uaa.yml

 

redirect-uri: http://localhost:8080/login/oauth2/code/login-client

=> 자신 redirect uri로 설정

 

 

참고

https://www.baeldung.com/spring-cloud-gateway-oauth2

https://jainkku.tistory.com/m/90

 

https://cloud.spring.io/spring-cloud-static/spring-cloud-security/2.2.2.RELEASE/reference/html/#_client_token_relay_in_spring_cloud_gateway

https://github.com/spring-cloud-samples/sample-gateway-oauth2login

 

반응형
반응형

일반적으로 경량화 API Gateway 제품들은 단일 포트로 요청을 받아 Gateway 기능을 수행한다. 하지만 일부 제품에서는 다중 포트를 열어 특정 포트마다 특정 엔드포인트로 라우팅하는 기능도 제공한다.

 

Spring Cloude Gateway를 이용하여 API Gateway를 구현할 때 위와 같이 다중 포트를 열 수 있는지 리서치를 해보았다.

 

Spring Cloud Gateway에는 Spring Boot 및 Spring Webflux에서 제공하는 Netty 라이브러리가 반드시 필요하다. 당연하게도 Netty 자체에서는 다중 포트를 열어 각각의 Server 구성이 가능하다.

import reactor.core.publisher.Mono;
import reactor.netty.DisposableServer;
import reactor.netty.http.server.HttpServer;

public class MultiAddressApplication {
	public static void main(String[] args) {
		HttpServer httpServer = HttpServer.create();
		DisposableServer server1 = httpServer
				.host("localhost") 
				.port(8080)        
				.bindNow();

		DisposableServer server2 = httpServer
				.host("0.0.0.0") 
				.port(8081)      
				.bindNow();

		Mono.when(server1.onDispose(), server2.onDispose())
				.block();
	}
}

 

하지만 Spring Cloud Gateway 내부 로직에서 사용하는 Webflux는 단일 포트만으로 처리할 수 있는 것으로 판단된다. 

 

아래는 해당 기능을 요청한 이슈들이지만 결국 block 되었다.

https://github.com/reactor/reactor-netty/issues/67

https://github.com/spring-projects/spring-boot/issues/12035

 

 

 

 

 

 

반응형

'Spring > Spring Cloud' 카테고리의 다른 글

[Spring Cloud Gateway] 라우팅 동적반영(refresh)  (0) 2024.03.17
[Spring Cloud] Gateway + OAuth2 Client  (0) 2022.11.21
Spring Cloud Gateway  (0) 2022.10.24
반응형

공식문서 : link

getting started : link

 

1. 개요

Spring Cloud Gateway는 API Gateway 기능을 구현할 수 있는 라이브러리로 대표적인 기능으로는 routing, filtering 있다.

@SpringBootApplication
public class DemogatewayApplication {
	@Bean
	public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
		return builder.routes()
			.route("path_route", r -> r.path("/get")
				.uri("http://httpbin.org"))
			.route("host_route", r -> r.host("*.myhost.org")
				.uri("http://httpbin.org"))
			.route("rewrite_route", r -> r.host("*.rewrite.org")
				.filters(f -> f.rewritePath("/foo/(?<segment>.*)", "/${segment}"))
				.uri("http://httpbin.org"))
			.route("hystrix_route", r -> r.host("*.hystrix.org")
				.filters(f -> f.hystrix(c -> c.setName("slowcmd")))
				.uri("http://httpbin.org"))
			.route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org")
				.filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback")))
				.uri("http://httpbin.org"))
			.route("limit_route", r -> r
				.host("*.limited.org").and().path("/anything/**")
				.filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter())))
				.uri("http://httpbin.org"))
			.build();
	}
}

 

 

2. 설정 클래스

- org.springframework.cloud.gateway.route.RouteDefinition  : 라우터 IO

- org.springframework.cloud.gateway.route.Route : RouteDefinitionRouteLocator에서 RouteDefinition을 Route로 변경

- org.springframework.cloud.gateway.route.Route.AsyncBuilder : Route Builder

- org.springframework.cloud.gateway.route.Route.Builder : Route Builder

 

3. 중요 클래스

org.springframework.cloud.gateway.route.CachingRouteLocator

- Route를 캐싱하는 클래스

- RefreshRoutesEvent 이벤트를 받아 RouteLocator에서 라우터를 다시 읽어 캐시 갱신

- 요청이 들어올 경우 RoutePredicateHandlerMapping.lookupRoute에서 CachingRouteLocator.getRoutes를 호출하여 캐싱된 Route 리스트 Get

 

org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping

- 클라이언트 요청에 대해 알맞은 라우팅을 lookup하는 클래스

 

org.springframework.cloud.gateway.handler.FilteringWebHandler

- 글로벌 필터와 라우터에 등록되어 있는 필터를 합쳐 필터를 수행한다.

 

org.springframework.cloud.gateway.filter.NettyRoutingFilter

- 실제 라우팅 URI에 요청하는 필터

 

org.springframework.cloud.gateway.actuate.AbstractGatewayControllerEndpoint, GatewayControllerEndpoint

- 실제 actuate 요청을 받는 컨트롤러

-  5. actuator 설정 참조

 

4. 요청 흐름도

0. Client Request

 

1. reactor.netty.http.server.HttpServer.HttpServerHandle.onStateChange

 

2. org.springframework.http.server.reactive.ReactorHttpHandlerAdapter.apply

 

3. org.springframework.web.server.adapter.HttpWebHandlerAdapter.handle

 

4. org.springframework.web.reactive.DispatcherHandler.handle

 

5. org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping.getHandlerInternal

 

6. org.springframework.cloud.gateway.handler.FilteringWebHandler.handle

 

7. org.springframework.cloud.gateway.handler.FilteringWebHandler.DefaultGatewayFilterChain.filter

 

 

5. actuator 설정

- pom.xml

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

 

- application.yml

management:
  endpoints:
    web:
      exposure:
        include: 
          - gateway
  endpoint:
    gateway:
      enabled: true

 

- endpoints

  • GET /actuator/gateway/globalfilters: Displays the list of global filters applied to the routes.
  • GET /actuator/gateway/routefilters: Displays the list of GatewayFilter factories applied to a particular route.
  • POST /actuator/gateway/refresh: Clears the routes cache.
  • GET /actuator/gateway/routes: Displays the list of routes defined in the gateway.GET /actuator/gateway/routes/{id}: 특정 route 설정 정보
  • GET /actuator/gateway/routes/{id} : Displays information about a particular route.
  • POST /actuator/gateway/routes/{id}: Add a new route to the gateway.
  • DELETE /actuator/gateway/routes/{id}: Remove an existing route from the gateway.

 

 

참고

https://blog.jungbin.kim/spring/2021/02/27/spring-cloud-gateway-route-locator.html

https://dlsrb6342.github.io/2019/05/14/spring-cloud-gateway-%EA%B5%AC%EC%A1%B0/

DB를 이용한 동적반영

https://medium.com/bliblidotcom-techblog/spring-cloud-gateway-dynamic-routes-from-database-dc938c6665de

반응형

+ Recent posts