티스토리 뷰

이제 본격적으로 Gateway에 대해서 정리할거에요.

그럼 먼저 Gateway에 대해서 간단하게 설명드릴게요

 

1. API Gateway가 뭐지?

🧑 나 강사님 Gateway가 뭔가요???
👨 강사님 쉽게 정리하면 단일점이에요. 어디서 요청을 하든 Gateway로 통하게 해서 어떤 요청이 들어와도 응답이 가능하도록 묶어준다고 생각해주세요.
🧑 나 흠.. 그렇군요?? 이해가 잘 되지 않아요.
👨 강사님 음 문지기 같은거라고 생각하면 조금 더 쉬울거에요. 게이트웨이는 클라이언트의 요청에 대한  인증과 권한 부여의 역할도 맡고있고, 서비스 검색통합, 응답캐싱, 속도제한 ,부하 분산, 로깅 등등... 중앙집중식으로 운영할 수 있도록 도와주는 역할이에요..
🧑 나 네에...
👨 강사님 이해하셨죠?
🧑 나 ㅋ 도망가~

 

2. 제대로 이해는 아직 안되지만 만들어보자!

크게 두가지 방법으로 Gateway를 구축할 수 있어요. Zuul을 이용한 방법과 SpringCloud Gateway를 사용하는 방식이에요.

Zuul은 더 이상의 업데이트를 하지 않고 있고 스프링 버젼 2.2까지만 지원하고 있어요.

그래도 많은 예제에서 사용되기 때문에 Zuul로 Gateway를 구축하는 방식과 SpringCloud Gateway를 사용하는 방식으로

나누어서 실습을 진행할게요.

2.1.Zuul을 활용한 프로젝트 생성 

확인해보니 더 이상 2.2버젼은 Spring initialyzr에서 지원하지 않아요.

그리고 대부분 Spring Cloud Gateway로 갈아타는 추세이고 Spring에서도 이 방식을 좀 더 추천하니

Zuul을 활용한 프로젝트 생성은 넘어가도록 할게요.

2.2. Spring Cloud Gateway를 활용한 Service 구축

 

https://start.spring.io/  

해당 사이트에서 다음과 같이 프로젝트를 생성할거에요. 

하나는 gateway-service 그리고 밑에 두개 프로젝트는 게이트웨이에 등록할 서비스에요.! 총 3개의 패키지를 만들어주세요.

 

 

 

그럼 Gateway를 설정하기에 앞서 서비스 두개에 간단한 Mapping을 할게요.

#First Service 

먼저 Frist Service에 Controller를 하나 생성할게요. 

제가 생성한 위치는 다음과 같습니다.

그리고 해당 Controller를 다음과 같이 맵핑해줄게요.

//FirstServiceController
package com.example.firstservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class FirstServiceController {
    @GetMapping("/welcome")
    public String welcome(){
        return "첫번째 서비스에요.";
    }
}

단순 조회에 가깝기 때문에 GetMapping이 적절할거에요. 그리고 /welcome으로 들어가면 "첫번째 서비스에요"라고 출력 될겁니다!

하지만 그 전에 yml 파일도 수정을 해줘야겠어요.

//application.yml

server:
   port: 8081

spring:
   application:
      name: my-first-service

eureka:
   client:
      fetch-registry: false
      register-with-eureka: false

Port는 8081으로! 어플리케이션 명과 eureka 설정은 미리 설정해둘게요. 서비스 임에도 불구하고 false로 되어있는 부분은 아직 까지는 서비스로 등록할 필요가 없기 때문이에요.

#Second Service 

Second Service는 First서비스와 똑같이 만들거에요. 

마찬가지로 Controller를 생성해주고 yml파일을 수정해줄게요.

package com.example.secondservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class SecondServiceController {
    @GetMapping("/welcome")
    public String welcome(){
        return "두번째 서비스에요.";
    }
}
server:
   port: 8082

spring:
   application:
      name: my-second-service

eureka:
   client:
      fetch-registry: false
      register-with-eureka: false

#Test Service 

그럼 이제부터 서비스가 제대로 동작하는지 먼저 테스트 해볼게요.

프로젝트 실행 후에 localhost:8081/welcome으로 접근해보면...

다음과 같은 화면이 출력 되시나요? 

그럼 정말 잘하신거에요! 

Second Service도 문제없이 실행되는 것을 확인했으면 Gateway에 해당 정보를 입력해주러 가야해요

#Apigateway Service 

gateway service는 일단 yml을 수정해줄게요.

server:
   port: 8000

eureka:
   client:
      register-with-eureka: false
      fetch-registry: false
      service-url:
         defaultZone: http://localhost:8761/eureka

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/**

spring.application.name까지는 너무 익숙하지만 cloud부분 부터는 생소하실거에요.

cloud부분 부터는 gateway에 대한 설정이 이루어져요 ,cloud.gateway.routes에서 해당 uri대한 접근이 설정될거에요.

uri는 느낌이 오실거에요 저희가 설정한 서비스의 접근 uri에요. predicates는 어디서 접근할건지 정하는 거에요.

/first-service/** 가 붙은 모든 uri는 이제 frist-service로 취급하겠죠? 마찬가지로 second-service도 설정해준뒤 

실행을 해볼게요. 

 

그리고 저희가 맵핑을 어떻게 했는지 기억하실거에요 그럼 frist-service로 접속 뒤 welcome 메시지를 받기위해서

localhost:8000/first-service/welcome 으로 들어가볼까요?

 

?? 왜 404 에러가 나오는 걸까요... 분명 제대로 설정한거 같은데...?

일단 gateway가 어떤식으로 작동하는지 알아볼필요가 있어요.

🧑 나 강사님!!!!!!!!!!!!! 404에러가 나왔어요!!!!! 전 잘못따라한게 없는데..
👨 강사님 원래 그게 정상적이에요. gateway에서 - Path=/first-service/** 이런식으로 path를 지정해줬던거 기억하시나요?
🧑 나  네!! 기억이 나요 근데 무슨 연관이 있는거에요?
👨 강사님 gateway는 해당 path로 접속하게 되면 정보가 그대로 해당 포트에 붙게돼요. first-service로 예를 들어볼게요. 저희가 접속할때는 localhost:8000/first-service/welcome으로 접속하겠죠?
🧑 나  네 맞아요! 그렇게 접속했어요. 
👨 강사님 gateway에서 path를 인식하면 해당 path는 가지고 해당 포트로 접속해요 /first-service/로 접속하게되면 localhost:8081/first-service 로 인식하게 되는거에요. 해당 path가 붙여넣기 된다고 생각하면 될거에요.
🧑 나 아... 그렇군요 그럼 다시 Mapping 부분을 수정해야겠네요!
👨 강사님 네 맞아요 그리고 RequestMapping을 통해서 맵핑을 해주면 Mapping이 여러개라도 굳이 추가해줄필요 없어요.

#다시 First Service

다시 FristServiceController로 돌아와서 RequestMapping을 설정해줄게요.

아래와 같이 입력하면 해당 RestController에 접속할때 RequestMapping을 먼저 걸칠테니

맵핑할때마다 일일히 /first-service 필요가 없어지겠죠? 

//FirstServiceController
package com.example.firstservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/first-service")
public class FirstServiceController {
    @GetMapping("/welcome")
    public String welcome(){
        return "첫번째 서비스에요.";
    }
}

 

#다시 Second Service

SecondServiceController로 마찬가지로 수정해준 뒤에 다시 실행해볼게요 :)

package com.example.secondservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/second-service")
public class SecondServiceController {
    @GetMapping("/welcome")
    public String welcome(){
        return "두번째 서비스에요.";
    }
}

#다시 테스트

그럼 다시한번 아까와 똑같은 uri로 접속해볼까요?

 

입틀막..

 

설마.. 두번째 서비스도?

 

잘되는게 확인이 되네요.

다음 포스팅에서는 이어서 필터를 만들어 볼거에요. 

감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함