송민준의 개발노트

Spring Cloud Config 세팅 본문

웹/MSA

Spring Cloud Config 세팅

송민준 2023. 4. 16. 23:55

공식 사이트

 

1. Spring Cloud Config 구성

 

구성도

Spring Cloud Config분산 시스템에서 외부화된 구성을 위한 서버 측 및 클라이언트 측 지원을 제공한다. 구성 서버를 사용하면 모든 환경에서 애플리케이션의 외부 속성을 관리할 수 있는 중앙 장소가 있다. 클라이언트와 서버 모두에 대한 개념은 Spring EnvironmentPropertySource 추상화에 동일하게 매핑되므로 Spring 애플리케이션과 매우 잘 맞지만 모든 언어로 실행되는 모든 애플리케이션에서 사용할 수 있다. 애플리케이션이 배포 파이프라인을 통해 개발에서 테스트 및 프로덕션으로 이동할 때 이러한 환경 간의 구성을 관리하고 애플리케이션이 마이그레이션할 때 실행하는 데 필요한 모든 것을 갖추고 있는지 확인할 수 있다. 서버 스토리지 백엔드의 기본 구현은 git을 사용한다.(로컬 파일이나 s3와 같은 저장소도 사용 가능)

 

Spring Cloud Bus분산 시스템의 노드를 메시지 브로커와 연결한다. 그런 다음 이 브로커를 사용하여 상태 변경(예: 구성 변경) 또는 기타 관리 지침을 브로드캐스트할 수 있다. 핵심은 Bus가 확장된 Spring Boot 애플리케이션을 위한 분산 Actuator와 같다는 것이다. 또한 전송으로 AMQP 브로커 또는 Kafka에 대한 스타터를 제공한다.

Cloud Config에 refresh를 요청하면 연동된 각 인스턴스가 refresh 되게 한다.

 

Spring Actuator는 어플리케이션을 모니터링 할 수 있게 기능을 제공해주는 것이다. 우아한형제들 포스팅에 관련하여 정리가 잘 되어 있다.

 

AMQP(Advanced Message Queuing Protocol)는 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜, 와이어 레벨 프로토콜이다. AMQP는 바이트 스트림으로 네트워크를 경유하며 송신되는 데이터의 형식을 기술한다. 그래서 구현 언어와 관계 없이 호환 도구와 상호 운용이 가능하다.

구성도는 아래 그림과 같다.

Producer가 Message를 Queue에 삽입하고, Consumer가 Queue에 있는 Message를 가져와 처리한다. 자세한 작동 원리는 이곳에서 확인하자.

 

여기서는 Docker에 Rabbitmq를 세팅해서 기준으로 사용한다.

 

 

2. [실제 구성] Config Server 생성

1) config server 프로젝트 생성

 

2) pom.xml 구성

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config-server</artifactId>
	</dependency>
    <dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-bus-amqp</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-bootstrap</artifactId>
	</dependency>
<dependencies>
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>2021.0.5</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

 

3) application.yml 구성

- private git으로 구성할 경우 user 정보나 ssh 토큰으로 구성하면 된다.(여기선 public)

- 기본 포트는 8888로 구성된다.

spring:
  application:
    name: config-service
# 사용할 rabbitmq 정보
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Camping-Side/camping-config-serivce.git
#         기본 브런치          
          default-label: main
#         git server의 SSL 인증을 비활성화 
#          skipSslValidation: true
#          private repository ??...
#          username: [your username]
#          password: [your password]


# actuator 옵션 어떤 것을 사용할 것인지
management:
  endpoints:
    web:
      exposure:
        include: health, busrefresh

 

- 멀티 매칭의 경우 아래와 같이 세팅 가능

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            simple: https://github.com/simple/config-repo
            special:
              pattern: special*/dev*,*special*/dev*
              uri: https://github.com/special/config-repo
            local:
              pattern: local*
              uri: file:/home/configsvc/config-repo
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            development:
              pattern:
                - '*/development'
                - '*/staging'
              uri: https://github.com/development/config-repo
            staging:
              pattern:
                - '*/qa'
                - '*/production'
              uri: https://github.com/staging/config-repo

 

4) bootstrap.yml 구성

- config에서 프로퍼티 정보를 암호화할 키 값을 세팅해준다. 여기서는 대칭키 기준으로 세팅한다.

encrypt:
  # 대칭키
  key: adfwefjkelkawjfewrkj12345156189

- 암호화 테스트.http

### config encrypt
POST http://localhost:8888/encrypt

user_token_prod

### config decrypt
POST http://localhost:8888/decrypt

972bb7a462be766740dacb2067b66b296bb798fbec7849c66ce3df32b56de59b

 

5) Main Application 구성

@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {

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

}

 

6) 공용으로 쓰일만한 환경설정 정보들 기준으로 영역별 yml 생성

- 따로 repository를 따도 되고 해당 프로젝트에 추가해도 된다.

- 파일 format은 아래와 같다.

 

- 암호화 했을 경우 4)에서 암호화한 데이터를 yml에 작성해주고 포맷은 아래와 같이 {cipher}를 추가해준다.

secret: '{cipher}74cc2cc247f25a2834ff497088ef091c8a79e7251fdb77f7ad4545a4f0212458'

 

3. [실제 구성] 연동 Server 세팅

1) pom.xml 구성

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

 

2) application.yml 구성

management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, busrefresh

 

3) bootstrap.yml 구성

spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888
      name: user-service,config-service
#  profiles:
#    active: dev


# 혹시 여러개의 confg에 profile을 다르게 한다면
#spring.cloud.config.name=myapp,myotherapp
#spring.cloud.config.profile.dev=myapp
#spring.cloud.config.profile.prod=myotherapp

 

4) 사용 예시.http

- 특정 인스턴스에 busrefresh 요청을 하면 연동된 타 인스턴스도 refresh가 실행 된다.

### healthcheck
GET http://localhost:8000/user-service/health_check

### actuator refresh
POST http://localhost:8000/user-service/actuator/refresh

### actuator bus refresh
POST http://localhost:8000/user-service/actuator/busrefresh

 

 

참고 사이트

- CentOS, 인증 key 방식 사용 시 주의점

- 이도원님의 MSA 강의