SCG+Eureka+Swagger 최신버전 맛보기(1)

한태민·2022년 7월 25일
1
post-thumbnail

서론

Project Repository
https://github.com/taeminHan/NyanYumUnivServer

냥냠대 서비스를 시작한지 오래됐지만 새로운 기능을 추가하기 위해 계속해서 달려왔다. POSTMAN을 벗어나 Swagger를 적용하여 API 문서화라는 작업을 하였으며 계속해서 REST API를 개발 하고 있었다.

새로운 크루원이 오면서 내 코드들이 창피한 순간이 찾아왔고 각자 다른 파트를 개발하며 빠른 진행하고 싶었기에 기존 monolithic한 프로젝트를 Micro Service Architecture로 변경을 진행 하였다. 물론 아직까지도 내 기준에 부합하는 MSA를 만들지는 못했다....ㅜㅜ

이 글은 SpringBoot에서 간단하게 MSA를 구축한 과정과 함께 SwaggerZuul을 이용하지 않고 Spring에서 권장하는 SpringCloudGateWay(SCG)를 사용해 보겠습니다.

🔔 정보 공유 보다는 일기에 가까운 내용이다보니 많이 스킵된 내용이 많습니다.

⚠️ 이번 프로젝트에서는 Docker를 사용하지 않습니다.

⚠️ 일단 작성해 놓고 설명은 천천히 추가 하겠습니다...

⚠️ 내용 오류를 말씀해주시면 수정하겠습니다.

0. 환경

냥냠대 개발에 사용했던 것들은 다음과 같다.

OpenJDK 17.0.2
Spring 5.x.x, Spring-Boot-Starter 2.6.6

dependency
spring-cloud-starter-netflix-eureka-client 3.1.1
spring-cloud-starter-netflix-eureka-server 3.1.1
spring-cloud-starter-gateway 3.1.1
springfox-boot-starter 3.0.0
spring-boot-starter-webflux (중요)

1) pom.xml

dependency

client(Eureka 서버를 제외한 다른 프로젝트)
		<!--Swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!--Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!-- GateWay -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>3.1.1</version>
        </dependency>
		<!--Webflux-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
Eureka Server 한정

위에서 spring-cloud-starter-netflix-eureka-cleint를 server로 바꿔주기만 하면된다.
나머지는 동일하게 적용 (혹시나 그럴일은 없겠지만 Eureka에는 Swagger를 적용 할 필요가 없다.)

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>3.1.1</version>
        </dependency>

💡Point

Webflux 가 중요하다. 다른분들의 블로그나 StackOverFlow를 보더라도 대부분이 zuul + Swagger를 이용한 게시물의 구현방법, 과정, 질문들이였다.

처음에는 zuul과 SCG(SpringCloudGateway)도 마찬가지로 똑같이 구현하면 될 것 같다고 생각했다. 하지만 구현과정에서 SCG는 Netty를 이용하고 있다는 것을 알게되었다.

하지만 SCG + Swagger를 적용한 확실한 정보가 부족한 편이였다.

SCG와 Swagger를 제대로 사용하기 위해서는 Webflux를 써야한다.

Spring Cloud Gateway, Swagger, Eureka 각각의 최신버전 적용방법은 다른 분들이 올리신 좋은 글이 많으니 보고 나서 최종 적용을 해보자.

1. 구현

server.port, appplication.name 등 과 같은 personal 설정은 각자 개인에 맞게 적용하자.

1) Eureka

spring:
  application:
    name: NYU-Eureka
  cloud:
    compatibility-verifier:
      enabled: false

server:
  port: 80

eureka:
  instance:
    hostname: localhost
  server:
    enable-self-preservation: true

enable-self-preservation:

  server:
    enable-self-preservation: true

일시적인 네트워크 장애로 인한 서비스 해제 막기 위한 자기 보호 모드 (디폴트 true, 운영에선 반드시 true)

2) GateWay

application.yml

하나하나 살펴보자

eureka

eureka:
  instance:
    instance-id: NYU-GateWay
    prefer-ip-address: true
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:80/eureka

Eureka에 client 등록을 위하여 instance.instance-id를 설정

전체 코드

server:
  port: 82

spring:
  application:
    name: NYU-GateWay
  cloud:
    gateway:
      routes:
        - id: MSA Service-1
          uri: lb://MSA Service-1
          predicates:
            - Path=/MSA Service-1/**, /nyu/user/**, /nyu/store/**, /nyu/banner/**, /nyu/admin/**

        - id: MSA Service-2
          uri: lb://MSA Service-2
          predicates:
            - Path=/MSA Service-2/**, /nyu/img/**
    compatibility-verifier:
      enabled: false

eureka:
  instance:
    instance-id: NYU-GateWay
    prefer-ip-address: true
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:80/eureka

3) MSA Service-1

server:
  port: 83

spring:
  application:
    name: MSA Service-1

eureka:
  instance:
    instance-id: MSA Service-1
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:80/eureka

springfox:
  documentation:
    openApi:
      v3:
        path: /MSA Service-1/v3/api-docs
    swagger:
      v2:
        path: /MSA Service-1/v2/api-docs

3)MSA Service-2

spring:
  application:
    name: MSA Service-2
    
server:
  port: 81

eureka:
  instance:
    instance-id: MSA Service-2
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:80/eureka


springfox:
  documentation:
    openApi:
      v3:
        path: /MSA Service-2/v3/api-docs
    swagger:
      v2:
        path: /MSA Service-2/v2/api-docs

일단 1차 과정은 끝..!

일단 application.yml에서 설정하는 부분은 대충 끝났으니 이제 자바 코드로 돌아오겠습니다.

회사 일이 빨리 끝난다면...ㅠㅠㅠ

profile
BackEnd Devloper

0개의 댓글