티스토리 뷰

-해당글은 아래 포스팅에서 이어집니다.

https://ggparkitbank.tistory.com/119 

 

[MSA] Spring Cloud로 개발하는 MS 어플리케이션 (Gateway)-3-

이제 본격적으로 Gateway에 대해서 정리할거에요. 그럼 먼저 Gateway에 대해서 간단하게 설명드릴게요 1. API Gateway가 뭐지? 🧑 나 강사님 Gateway가 뭔가요??? 👨 강사님 쉽게 정리하면 단일점이에요.

ggparkitbank.tistory.com

지난 시간에 이어서 Gateway에서 Filter를 지정하는 방법을 알아볼거에요. 

그 전에 간단하게 어떤식으로 동작하는지 알아야 겠죠?

 

Client > Gateway > Predicate > Pre Filter & Post Filter (작업 환경은 Property or Java Code) > Service

Gateway에서 클라이언트로 부터 어떤요청을 받았는지 확인하고 Predicate에서는 요청에 대한 조건을 봐줘요

그 다음엔 Pre Filter 통해서 서비스로 이동해요 필터조건을 을 거친 정보를 가지고 다시 Post Filter로 돌아와요

마지막으로 Post Filter를 통해서 정제된 데이터를 다시 응답하는 과정을 거친다는데 ... 무슨 소리인지 잘 모르겠네요.. 

하지만 실습을 진행하다보면 금방 이해 할 수 있을거에요.

 

#java를 활용한 Gateway Filter

자 그럼 한번 만들어 볼게요. 일단 Configuration 파일을 하나 만들어야 하는데

저는 해당 위치에 생성을 했어요. 

 

그리고 다음과 같이 코드를 작성해줬어요.

# FilterConfig.java

 package com.example.apigatewayservice;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder){
        return builder.routes()
                .route(r -> r.path("/first-service/**")
                        .filters(f-> f.addRequestHeader("first-request","first-request-header")
                                .addResponseHeader("first-response","first-response-header"))
                        .uri("http://localhost:8081/"))
                .route(r -> r.path("/second-service/**")
                        .filters(f-> f.addRequestHeader("second-request","second-request-header")
                                .addResponseHeader("second-response","second-response-header"))
                        .uri("http://localhost:8081/"))
                .build();
    }
}

@Configuration을 통해서 해당 클래스가 Configuration임을 명시했어요.

   :@Configuraion에 대해서 조금 더 디테일하게!, Configuration임을 명시를 해주면 스프링 프로젝트가 실행됨에 따라서 먼저 Configuration으로 등록되어 있는 Class들을 모아서 등록하게 돼요 그리고 밑에 있는 @Bean통해서 객체를 등록 하게  될거에요!

@Bean을 통해서 새로운 객체를 만들것을 명시해줄게요.

그리고 그 객체의 리턴 형태는 RouteLocator에요 생각해보면 저번에 application.yml 파일에 Routes가 있었죠?

그거랑 동일한 아이에요.

자 그럼 천천히 살펴 볼게요. 그리고 람다 식으로 작성되어있는데, 람다 식을 모르신다면, 굳이 깊게 파지 않아도 돼요.

그냥 가상의 메서드를 만들어서 결과값을 받고, 빠이빠이 하겠다는 개념이에요

 

1. 첫번째 route 정보에 path는 /frist-service/**로 설정

                .route(r -> r.path("/frist-service/**")

2. 그리고 해당 path로 접속하면 아래의 기능을 수행하겠다는 의미에요.

 .filters(f-> f.addRequestHeader("first-request","first-request-header")
    .addResponseHeader("first-response","first-response-header"))
 .uri("http://localhost:8081/"))

 

근데... 이거 어디서 많이 보지 않았나요?

//application.yml

spring:
   application:
      name: apigateway-service
   cloud:
      gateway:
         routes:
            - id: fisrt-service
              uri: http://localhost:8081
              predicates:
                 - Path=/first-service/**
            - id: second-service
              uri: http://localhost:8082
              predicates:
                 - Path=/second-service/**

path를 설정하고... uri를 연결해줬던.. yml에서 설정했었죠? 네 맞아요 filter를 제외하면 yml에서 routes정보를

입력했던것과 똑같은 작업이었어요!

 

그럼 계속해서 filter를 조금 더 살펴볼까요?

 .filters(f-> f.addRequestHeader("first-request","first-request-header")
    .addResponseHeader("first-response","first-response-header"))

뭐라고 쓰여있긴한데, addRequestHeader? 보니까 Requestheader를 추가해주겠다는 의미 같네요.

frist-request라는 키에 frist-request-header라는 벨류값을 넣어준것 같아요.

ResponseHeader에도 똑같이 넣어줬네요. 그럼 이게 어떤식으로 동작하는지 한번 알아볼까요?

그 전에 Requestheader를 보내주기위해 Mapping을 하나 더 해볼게요!

#또 다시 first-Service

@GetMapping을 통해서 /message라는 경로값으로 맵핑을 했어요.

@RestController
@RequestMapping("/first-service")
public class FirstServiceController {
    @GetMapping("/welcome")
    public String welcome(){
        return "첫번째 서비스에요.";
    }
    @GetMapping("/message")
    public String message(@RequestHeader("first-request") String header ){
        System.out.println(header);
        return "나는.. 첫번째 메시지 서비스에요.";
    }
}

 

아까 RequestHeader에 키값이 "first-request"였던거 기억나시나요? 해당 값으로 header를 보내도록 할거에요.

header 안에는 응답값이 담기게 될거구요!

그럼 한번 실행해볼까요?

localhost:8000/first-service/message로 접속하면 이런 화면이 나올거에요.

 

그리고 First-Application의 Console창을 한번 확인해볼게요.

혹시.. 성공하셨나요? 그렇다면 백따봉입니다. 저는 몇번 실패했거든요 :(

다음으로는 Response도 확인해야겠죠? Chrome기준으로 F12를 통해서 개발자 콘솔을 킨 뒤에

Network에 들어가 볼게요. 만약 Network가 비워져있다면 새로고침을 한번 눌러주세요.

Name밑에 message라고 쓰여진게 보이나요? 클릭해주세요. 그럼 Header/Priview/Response ... 이렇게 나올텐데

Header에서 Response Headers를 보시면 하단에 first-response가 보이시나요?

그렇다면 정말 수고하셨어요. 성공이네요. 

first-response는 저희가 filter에서 설정한 값이에요!. filter는 이렇듯 요청 혹은 응답 시 여러가지 작업을 할 수 있도록

도와줘요 꼭 Header가 아니더라도 다양하게 쓸 수 있어요!  여유가 있으시다면 Second도 마찬가지로 확인해보시면

좋을것 같아요 다음 포스팅엔 yml를 통해서 설정해보도록 할게요. 감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함