개요
이번에는 config-service를 구현해 보았다. 다른 서비스들에서 공통된 설정 부분을 따로 빼서 한 파일로 만들고, 나중에 빌드를 했을 때 설정만 변경할 수 있기 때문에 바꿀 가능성이 있는 부분도 따로 빼서 처리할 수 있다. 민감한 정보를 그대로 노출시키는 것은 바람직하지 않기 때문에 간단한 대칭키 암호화를 이용하여 처리했다.
Spring Cloud Config Server 설정
dependencies {
// Bus-Kafka
implementation 'org.springframework.cloud:spring-cloud-starter-bus-kafka'
// Config Server
implementation 'org.springframework.cloud:spring-cloud-config-server'
// Actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
bus-kafka를 이용해서 다른 서비스들에 설정을 refresh 해주는 기능을 수행한다. 굳이 카프카가 아니더라도 rabbitmq로도 가능하다. rabbitmq를 사용할 때는 amqp관련 다른 라이브러리를 추가해 주어야 한다.
설정 정보 관련해서 로드하고 처리해주는 config-server도 추가한다.
해당 서비스에 대해서 여러 정보를 볼 수 있는 기능을 제공하는 actuator를 추가하여 refresh 또는 busrefresh를 수행할 수 있다.
@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
}
@EnableConfigServer 어노테이션을 붙여주어야 Config Server로 동작한다.
server:
port: 8888
spring:
config:
import: classpath:secret.yaml
application:
name: config-service
# 카프카 클러스터 주소
kafka:
bootstrap-servers: http://localhost:9092
cloud:
bus: # 카프카 토픽명
destination: delibird-config
config:
server:
git:
uri: https://github.com/ness727/delibird-config
management:
endpoints:
web:
exposure:
include: health, busrefresh
application.yaml은 위와 같이 설정했다.
같은 경로에 있는 secret.yaml을 포함시킨다. 해당 파일에는 대칭키 암호화를 위한 키가 저장되어 있다.

encrypt:
key: 여기다 원하는 키 작성
ㄴ secret.yaml
kafka.bootstrap-servers에 카프카 클러스터가 실행되고 있는 주소를 입력해 준다.
spring.cloud.bus에는 토픽명을 입력해 준다. 해당 이름으로 미리 만들지 않아도 자동으로 만들어준다.
spring.cloud.config.server.git.uri에는 git으로 관리되는 설정 파일이 저장된 위치를 적어주면 된다. 나는 퍼블릭 저장소로 만들어서 그냥 uri만 작성했지만 private일 경우 username과 password를 입력해야 한다.
management.endpoints.web.exposure.include는 나중에 브라우저 같은 걸로 해당 actuator/** 경로에 접근해서 해당 정보를 보거나 실행을 요청할 수 있는 경로를 사용자에게 노출하는 기능이다. 여기에 작성한 기능만 작동한다.

https://github.com/ness727/delibird-config
GitHub - ness727/delibird-config: delibird 서비스의 config 저장소입니다.
delibird 서비스의 config 저장소입니다. Contribute to ness727/delibird-config development by creating an account on GitHub.
github.com
github에는 설정 파일들이 위와 같이 저장되어 있다.
다른 서비스들에 Cloud Config 적용하기
적용법은 각 서비스마다 크게 다르지 않기 때문에 login-service에 적용하는 것만 작성했다. 다른 서비스들에도 각 서비스에 맞는 설정을 해주었다.
// Cloud Config
implementation 'org.springframework.cloud:spring-cloud-starter-config'
// Bus-Kafka
implementation 'org.springframework.cloud:spring-cloud-starter-bus-kafka'
// Actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
먼저 위 의존성을 추가한다.
server:
port: 0
spring:
application:
name: user-service
# ~~~~~~~~~~~~~~ 여기 추가 ~~~~~~~~~~~~~~~
config:
import:
- optional:configserver:http://localhost:8888
cloud:
config:
name: delibird, user-service
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jpa:
hibernate:
ddl-auto: update
show-sql: true
logging:
level:
com.megamaker.userservice: debug
# ~~~~~~~~~~~~~~ 여기 추가 ~~~~~~~~~~~~~~~
management:
endpoints:
web:
exposure:
include: refresh, busrefresh
application.yaml에 작성한 내용이다. 다른 부분은 볼 필요 없고 일단 맨 밑은 actuator 설정인데 위에서 설명했으니 패스하고...
spring.config.import에 설정이 있는 곳을 작성해 준다. 전에는 secrets.yaml 같은 비밀키를 담은 파일을 classpath: 로 추가했지만 이번에는 config-service에서 설정을 받아오기 때문에 설정 서비스의 주소로 설정한다.
spring.cloud.config.name에는 적용할 설정 파일명을 지정한다. 하나만 적용해도 되지만 여러 개를 한 번에 포함시키고 싶으면 콤마(,)로 구분하여 작성한다. 참고로 아래와 같은
- delibird
- user-service
이렇게 작성하면 하나밖에 적용이 안 되니 작성에 유의하자.
실행할 때는 config-service를 먼저!! 실행하고 그다음에 해당 설정 서비스를 참조하는 다른 서비스를 실행시켜야 한다.

설정이 잘 되었다면 실행했을 때 처음에 위와 같이 설정을 가져왔다는 콘솔 로그가 출력된다. 여기서 profile은 말 그대로 상세 프로파일을 설정할 수 있는 부분이다. 크게 application.yaml / user-service.yaml / user-service-dev.yaml 이런 식으로 설정 파일 이름을 지정할 수 있는데 여기서 세 번째의 dev 이런식으로 붙는 부분이 profile이다. 이 프로파일을 다양하게 설정하여 상황에 따라 설정을 변경시킬 수 있다.
대칭키 암호화하기
처음에 config-service의 secret.yaml 파일에 키 정보를 저장했는데 해당 키를 이용해서 대칭키 암호화를 해주는 기능이 있다.
POST [config-service 주소]/encrypt
위 경로로 body에 원하는 값을 담아 요청을 보내면 응답으로 암호화된 결과를 얻을 수 있다.

반대로 decrypt로 바꾼 경로로 요청을 보낸다면 원래 내가 입력했던 내용이 반환된다.


이런 방식으로 github 저장소에 저장되어 있는 설정 파일에 민감한 정보들을 encrypt하여 {cipher}를 접두사로 저장해 두면 해당 서비스에서 설정 파일을 가져다가 사용할 때 decrypt된 원래 원하던 정보로 접근할 수 있다.

decrypt가 잘 되었는지 확인하려면
[config-service 주소]/설정파일명/프로파일명
으로 접속하여 확인하면 된다. 프로파일을 설정하지 않았으면 default라고 작성하면 된다.
여기까지 해서 설정 정보가 잘 적용된 것을 알 수 있었다!!
만약 어떤 서비스가 실행 중일 때 설정을 변경했다면 bus에 연결된 서비스 중 아무 서비스에서 actuator/busrefresh를 호출해주면 된다.

204가 응답되면 설정 적용이 된 것이다.
'공부 > Spring Cloud' 카테고리의 다른 글
| [Spring Cloud] 나를 괴롭히는 CORS 오류 해결하기 (0) | 2024.06.18 |
|---|---|
| [Spring Cloud] EC2에서 Docker Kafka 에러 해결하기 (0) | 2024.05.13 |
| [Spring Cloud][6] Store 마이크로 서비스 구현하기 1 (0) | 2024.05.06 |
| [Spring Cloud][5] JWT, OAuth2 로그아웃 구현하기 (0) | 2024.05.04 |
| [Spring Cloud][4] JWT, OAuth2로 로그인 하기 (0) | 2024.05.03 |