MSA(MicroService Architecture) (2) - 간단한 localhost 상에서의 구현

Sadie·2024년 6월 1일
0

Spring And JPA

목록 보기
9/9

Eureka Server, MicroService1, MicroService2, API Gateway 이렇게 4가지만 있는 아주 간단한 MSA를 구현해보려고 합니다



버전 설정

발생헀던 대부분의 오류는 버전 설정이 문제였습니다
모든 서버와 서비스의 버전이 동일해야 문제가 발생하지 않았습니다

https://spring.io/projects/spring-cloud
spring boot와 spring cloud의 버전은 위 링크에서 확인할 수 있습니다

적용하려는 서비스의 spring 버전이 '3.0.12' 이어서, 하위 코드에서는 그에 맞춰 설정을 바꿔주었습니다



Eureka Server

build.gradle

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에 추가해준다


application.yml

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로 한다면 자신에게 자신을 등록시키는 것이 된다


EurekaApplication

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

@EnableEurekaServer 어노테이션을 추가해준다



MS1

build.gradle

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에 추가해준다


application.yml

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로 지정(다른 것으로 변경가능)


Controller API 확인

@RequestMapping("/user-service")

API Gateway 설정에서 '주소:포트번호/user-service/하위주소' 가 MS1과 연결되도록 하기 위해 controller API를 확인



MS2

build.gradle

MS1과 동일

application.yml

spring:
  application:
    name: location-service

server:
  port: 8082

외에 MS1과 동일

Controller API 확인

@RequestMapping("/location-service")

API Gateway 설정에서 '주소:포트번호/location-service/하위주소' 가 MS2과 연결되도록 하기 위해 controller API를 확인



API Gateway

build.gradle

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은 사용하지 않았습니다)


application.yml

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 에러가 났고, 계속 찾아본 결과 내부 포트 연결이 문제였다고 판단하였습니다

https://velog.io/@refinedstone/MSA-Eureka%EC%9D%98-%EC%99%B8%EB%B6%80-%EC%84%9C%EB%B2%84-%EB%A7%A4%ED%95%91%EB%AC%B8%EC%A0%9C

https://github.com/nhnacademy-be4-My-Books/etc/issues/111

https://www.inflearn.com/questions/768937/%EB%8B%A4%EB%A5%B8%EC%84%9C%EB%B2%84%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4-lb-main-service%EA%B0%80-%EC%9E%91%EB%8F%99%EC%9D%84-%EC%95%88%ED%95%A9%EB%8B%88%EB%8B%A4

다음과 같은 글을 참고하여 에러를 해결하고자 하였으나 잘 되지 않아...
결국은 강제주입으로 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

0개의 댓글