Eureka Server, MicroService1, MicroService2, API Gateway 이렇게 4가지만 있는 아주 간단한 MSA를 구현해보려고 합니다
발생헀던 대부분의 오류는 버전 설정이 문제였습니다
모든 서버와 서비스의 버전이 동일해야 문제가 발생하지 않았습니다
https://spring.io/projects/spring-cloud
spring boot와 spring cloud의 버전은 위 링크에서 확인할 수 있습니다
적용하려는 서비스의 spring 버전이 '3.0.12' 이어서, 하위 코드에서는 그에 맞춰 설정을 바꿔주었습니다
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.12'
id 'io.spring.dependency-management' version '1.1.3'
}
ext {
set('springCloudVersion', "2022.0.5")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
group = 'springcloud'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
다음과 같이 버전을 설정해주고 eureka-server를 dependencies에 추가해준다
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka
8761번 포트에 바인딩해준다
register은 default가 ture이고, 만약 여기서 true로 한다면 자신에게 자신을 등록시키는 것이 된다
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
@EnableEurekaServer 어노테이션을 추가해준다
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.12'
id 'io.spring.dependency-management' version '1.1.3'
}
ext {
set('springCloudVersion', "2022.0.5")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
// eureka
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
마찬가지로 동일한 버전 설정을 해주고
eureka-client를 dependencies에 추가해준다
spring:
application:
name: user-service
server:
port: 8081
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
register을 true로 만들어주고
defaultZone은 아까 만들었던 Eureka Server의 주소로 지정
그리고 포트번호는 8081로 지정(다른 것으로 변경가능)
@RequestMapping("/user-service")
API Gateway 설정에서 '주소:포트번호/user-service/하위주소' 가 MS1과 연결되도록 하기 위해 controller API를 확인
MS1과 동일
spring:
application:
name: location-service
server:
port: 8082
외에 MS1과 동일
@RequestMapping("/location-service")
API Gateway 설정에서 '주소:포트번호/location-service/하위주소' 가 MS2과 연결되도록 하기 위해 controller API를 확인
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.12'
id 'io.spring.dependency-management' version '1.1.3'
}
ext {
set('springCloudVersion', "2022.0.5")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
group = 'springcloud'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
버전을 동일하게 설정해주고 gateway와 erueka client를 추가 (Zuul은 사용하지 않았습니다)
server:
port: 8000
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:8081/
predicates:
- Path=/user-service/**
- id: location-service
uri: http://localhost:8082/
predicates:
- Path=/location-service/**
포트는 8000
id가 user-service 일 때는 8081로, location-service 일때는 8082로 가도록 설정
localhost:8761/ 로 이동했을 때 나오는 Eureka 서버 화면 입니다.
다음과 같이 user-service, location-service, APIGateway-service가 잘 등록된 것을 볼 수 있습니다
user-service, location-service 모두 API gateway가 잘 라우팅 해주는 것을 볼 수 있습니다
네이버 클라우드를 이용해 localhost가 아닌 외부 서버를 통한 MSA 구현을 시도해보았습니다
하지만 Whitelabel 에러가 났고, 계속 찾아본 결과 내부 포트 연결이 문제였다고 판단하였습니다
다음과 같은 글을 참고하여 에러를 해결하고자 하였으나 잘 되지 않아...
결국은 강제주입으로 msa를 완성하게 되었습니다
구조상 정말 효율적이지 않고 고쳐야 할 점이 많고 반드시 고쳐야한다고 생각되어
후에 여유가 될 때 다시 공부하여 외부 서버 적용 포스팅을 올려보려고 합니다...
https://velog.io/@korea3611/Spring-BootSpring-Cloud-Netflix-Eureka-%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-MSA1
https://velog.io/@korea3611/Spring-Boot-Spring-Cloud-Gateway-%EB%A7%8C%EB%93%A4%EA%B8%B0-MSA2
https://velog.io/@penrose_15/Could-not-find-org.springframework.cloudspring-cloud-starter-aws-parameter-store-config-Required-by-project-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95