Project Repository
https://github.com/taeminHan/NyanYumUnivServer
냥냠대 서비스를 시작한지 오래됐지만 새로운 기능을 추가하기 위해 계속해서 달려왔다. POSTMAN을 벗어나 Swagger를 적용하여 API 문서화라는 작업을 하였으며 계속해서 REST API를 개발 하고 있었다.
새로운 크루원이 오면서 내 코드들이 창피한 순간이 찾아왔고 각자 다른 파트를 개발하며 빠른 진행하고 싶었기에 기존 monolithic한 프로젝트를 Micro Service Architecture로 변경을 진행 하였다. 물론 아직까지도 내 기준에 부합하는 MSA를 만들지는 못했다....ㅜㅜ
이 글은 SpringBoot에서 간단하게 MSA를 구축한 과정과 함께 Swagger를 Zuul을 이용하지 않고 Spring에서 권장하는 SpringCloudGateWay(SCG)를 사용해 보겠습니다.
🔔 정보 공유 보다는 일기에 가까운 내용이다보니 많이 스킵된 내용이 많습니다.
냥냠대 개발에 사용했던 것들은 다음과 같다.
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 (중요)
<!--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>
위에서 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>
Webflux 가 중요하다. 다른분들의 블로그나 StackOverFlow를 보더라도 대부분이 zuul + Swagger를 이용한 게시물의 구현방법, 과정, 질문들이였다.
처음에는 zuul과 SCG(SpringCloudGateway)도 마찬가지로 똑같이 구현하면 될 것 같다고 생각했다. 하지만 구현과정에서 SCG는 Netty를 이용하고 있다는 것을 알게되었다.
하지만 SCG + Swagger를 적용한 확실한 정보가 부족한 편이였다.
SCG와 Swagger를 제대로 사용하기 위해서는 Webflux를 써야한다.
Spring Cloud Gateway, Swagger, Eureka 각각의 최신버전 적용방법은 다른 분들이 올리신 좋은 글이 많으니 보고 나서 최종 적용을 해보자.
server.port
, appplication.name
등 과 같은 personal 설정은 각자 개인에 맞게 적용하자.
spring:
application:
name: NYU-Eureka
cloud:
compatibility-verifier:
enabled: false
server:
port: 80
eureka:
instance:
hostname: localhost
server:
enable-self-preservation: true
server:
enable-self-preservation: true
일시적인 네트워크 장애로 인한 서비스 해제 막기 위한 자기 보호 모드 (디폴트 true, 운영에선 반드시 true)
하나하나 살펴보자
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
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
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
일단 application.yml에서 설정하는 부분은 대충 끝났으니 이제 자바 코드로 돌아오겠습니다.
회사 일이 빨리 끝난다면...ㅠㅠㅠ