게이트웨이 - Actuator, Global Filter, Local Filter

johaS2·2025년 2월 9일

Actuator

  • 스프링 어플리케이션의 기능을 엔드 포인트로 제공하는 의존성
  • 가동중인 스프링 클라우드 게이트웨이에 새로운 라우팅을 추가하고 삭제할 수 있다.

의존성 추가

  • Gateway, Spring Boot Actuator 필수 !
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'

Actuator 설정

management.endpoint.gateway.enabled=true
management.endpoints.web.exposure.include=gateway

라우팅 명령어

  • 존재하는 라우팅 확인
    GET : /actuator/gateway/routes

  • 라우터 추가 - JSON Body
    POST : /actuator/gateway/routes/{id}

  • 리프래쉬 : 추가 or 제거 후 꼭 해줘야함 !
    POST : /actuator/gateway/refresh

Global Filter

  • 모든 라우팅에 대해서 자동 적용되는 필터
  • 클라이언트의 요청은 필터 -> 마이크로서비스 -> 필터 형태로 이동되며, 마이크로서비스를 접근하기 이전이면 pre, 이후면 post라고 명명한다.
  • 각각의 필터는 Order값을 가질수 있다

Global Filter 작성법

package com.example.scg.component;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class G1Filter implements GlobalFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        System.out.println("pre global filter order -1");

        return chain.filter(exchange)
                .then(Mono.fromRunnable(() -> {

                    System.out.println("post global filter order -1");
                }));
    }

    @Override
    public int getOrder() {

        return -1; // 필터 실행 순서 ( 낮을수록 먼저 실행 됨 )
    }
}

Local Filter

  • 특정 라우트에만 적용되는 필터, 라우트 설정에서 직접 추가함

필수 의존선

  • Gateway, Lombok

Local Filter 작성

package com.example.scg.component;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
public class L1Filter extends AbstractGatewayFilterFactory<L1Filter.Config> {

    public L1Filter() {

        super(Config.class);
    }


    @Override
    public GatewayFilter apply(Config config) {

        return (exchange, chain) -> {

            if (config.isPre()) {
                System.out.println("pre local filter 1");
            }

            return chain.filter(exchange)
                    .then(Mono.fromRunnable(() -> {

                        if (config.isPost()) {

                            System.out.println("post local filter 1");
                        }
                    }));
        };
    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class Config {
        private boolean pre;
        private boolean post;
    }
}

특정 라우팅에 지역 필터 등록

spring.cloud.gateway.routes[0].filters[0].name=L1Filter
spring.cloud.gateway.routes[0].filters[0].args.pre=true
spring.cloud.gateway.routes[0].filters[0].args.post=true
profile
passionate !!

0개의 댓글