본문 바로가기

MSA

[KEUPANG] API Gateway 생성

이전 페이지: .env 파일 생성
다음 페이지: docker로 MSA 프로젝트 실행

개요

  • 제일 앞단에서 요청을 받고 처리할 서비스로 전달하는 api gateway를 생성
  • 이후 각 서비스에서 scale-out 이 일어날 가능성을 생각하여 로드 밸런싱 기능 추가
  • keupang은 대규모 서비스를 가장한 프로젝트라는 것을 참고

프로젝트 생성

gateway 와 Eureka Discovery Client 의존성을 추가하여 생성

이때 주의할 점! https://start.spring.io/에서 gateway 의존성 추가 할 때 자동으로 mvc 기능이 추가된 버전을 추가해줌

implementation 'org.springframework.cloud:spring-cloud-starter-gateway-mvc'

이렇게 만들어지면 기존에 사람들이 gateway 만든 블로그를 따라해도 잘 안되는게 느껴질거임. 실행해도 라우팅 잘 안됨

그래서 위에서 mvc를 빼고 

implementation 'org.springframework.cloud:spring-cloud-starter-gateway'

이렇게 수정해줘야함.

어노테이션 추가

eureka server에 등록해야 하므로 @EnableDiscoveryClient 추가

@SpringBootApplication
@EnableDiscoveryClient
public class KeupangGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(KeupangGatewayApplication.class, args);
    }

}

application 설정

라우팅 설정

  • application.yml에 다음과 같이 라우팅 설정
    • 참고로 다양한 라우팅 전략이 있고, api gateway는 실제 서비스할 때 하루종일 켜져있어야 한다는 점을 고려해서 실행 중에 동적으로 새로운 기능에 대한 라우팅 정보를 추가해주는 actuator 를 사용하는 방법도 있음.
    • 저는 기능을 딱 정해두고 개발중이라 사용 안했습니다.
spring:
    application:
        name: keupang-gateway

    cloud:
        gateway:
            routes[0]:
                id: user
                predicates[0]:
                    name: Path
                    args:
                        pattern: /user/**
                uri: lb://user
            routes[1]:
                id: product
                predicates[0]:
                    name: Path
                    args:
                        pattern: /product/**
                uri: lb://product
            discovery:
                locator:
                    enabled: true
  • 여기서 uri에 직접적으로 localhost:8081 처럼 지정해줘도 상관없음
    • 하지만 scale-out을 하면서 추가적인 포트가 생기는 상황을 가정해서 로드 밸런싱 기능 추가
    • lb://user 로 하면 eureka에 등록된 user 라는 이름을 가진 application을 찾아서 디폴트로 라운드 로빈 방식으로 로드밸런싱을 해줌

eureka server 연동

application.yml에 다음 정보 추가

eureka:
    client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
            defaultZone: http://${security_username}:${security_password}@localhost:8761/eureka

이전에 env에 등록해둔 값들을 가져오고, eureka server 주소를 입력함

Dotenv로 env 값 꺼내기

@SpringBootApplication
@EnableDiscoveryClient
public class KeupangGatewayApplication {

    public static void main(String[] args) {
       Dotenv dotenv = Dotenv.configure().directory("./")  // .env 파일 경로 설정
          .load();

       System.setProperty("security_username", dotenv.get("security_username"));
       System.setProperty("security_password", dotenv.get("security_password"));
       SpringApplication.run(KeupangGatewayApplication.class, args);
    }

}

이렇게 꺼내야 application.yml에서 값을 가져다 쓸수 있게 됨. 

이 프로젝트에서 적용한 env에 대한 상세 정보는 https://back-jong.tistory.com/16 에 기술

'MSA' 카테고리의 다른 글

[KEUPANG] EurekaClient 설정  (0) 2024.11.26
[KEUPANG] Eureka Server 생성  (0) 2024.11.25
[KEUPANG] User service project 생성  (0) 2024.11.25
[KEUPANG] config server 생성  (0) 2024.11.25
[KEUPANG] MSA Root Project 생성  (0) 2024.11.25