스프링 클라우드 컨피그 서버를 사용해 마이크로서비스의 구성을 중앙화해서 관리하는 방법에 관한 챕터
이번 장에도 spring-cloud 폴더 하위에 config-server 프로젝트가 생긴다.
구성 서버 == spring cloud config server
이전장까지 시스템 환경의 모습은
이러했고 이번 구성 중앙화 챕터를 거치면서 spring cloud config server가 추가되면
이런 모습이 된다.
❓ 구성 서버 설정에 고려사항
1 구성 저장소의 저장 유형을 선택
2 client가 먼저 접속할 서버를 결정 between 구성 서버(컨피그)와 검색 서버(유레카) 중에서
3 구성 보안을 강화 (== API에 대한 무단 접근을 막고 중요한 정보는 일반 텍스트로 저장X)
❓ 저장 유형이라는게 '구성서버는 무엇을 저장하는가 ' 가 아니라 '구성서버는 어떤 저장 유형을 지원하는가' 이다! 그럼 구성서버는 어떤 저장 유형을 지원하는가
이번 챕터에서는 로컬 파일 시스템을 사용한다.
로컬 파일 시스템을 사용하려면 native 스프링 프로필을 활성화한 후 --> 구성 서버를 시작해야 한다. 구성 저장소의 위치는 spring.cloud.config.server.native.searchLocations 속성으로 지정
❓ 어떤 서버에 먼저 클라이언트가 접근해야하는가
basicly)
client가 구성 서버에 먼저 접속 --> 구성을 검색하며 -->구성에 따라 검색
서버(유레카)에 자기 자신을 등록
also)
client가 검색 서버에 먼저 접속 --> 구성 서버 인스턴스를 찾은 다음 --> 구성 서버에서 구성을 가져올 수도 있음
각 접근 방식에는 장단점이 있음
구성 서버에 먼저 접속 하는 방식으로 이번장 진행 --> 검색 서버(유레카)의 구성 정보를 구성 서버(cofig server)에 저장
❓ 보안을 왜 강화해야하는가
b/c 구성 정보는 중요한 정보로 취급해야 하므로 구성 정보를 전송하거나 저장할 때는 보안에 신경써야 함. --> so 런타임 관점에서는 구성 서버가 에지 서버를 통해 외부로 노출될 이유가 없음.
(개발이 진행 중일 때는 구성 서버 API에 접근해 구성을 확인하는 것이 유용하지만, 상용 환경에서는 구성 서버에 대한 외부 접근을 차단해야 함!)
구성 전송 보안 by https
마이크로서비스나 config 서버 API 사용자의 구성 정보 요청 : HTTPS를 사용하는 에지 서
버에 의해 보호.
구성 저장 보안 by 대칭키 (암호화)
구성 저장소 접근 권한이 있는 사람이 민감 정보 steal 을 막기위해서 : 구성 정보를 암호화해서 디스크 저장 (config server는 대칭 키와 비대칭 키를 모두 지원) (비대칭 키가 더 안전하지만 관리는 어렵)
구성 서버는 클라이언트가 구성을 검색할 수 있도록 REST API를 공개
이번장 api 엔드포인트
/actuator: 모든 마이크로서비스가 노출하는 표준 actuactor endpoint (❗상용 환경에선 잠겨있어야 함.)
/encrypt & /decrypt: 중요한 정보를 암호화하고 해독하기 위한 엔드포인트 (❗상용 환경에선 잠겨있어야 함.)
/{microservice}/{profile}: 지정한 마이크로서비스의 스프링 프로필 구성을 반환.
spring-cloud 하위에 'config-server' project 생성
security와 config server 의존성 추가
메인 클래스에 @EnableConfigServer 추가
application.yml 구성 추가
gateway에 라우팅 규칙 추가
위의 그림처럼 /config 뭐시기 로 들어오는 요청은 구성서버로 라우팅 된다
dockerfile 추가 하고 compose파일에 추가
구성 서버의 Dockerfile은 8888 포트가 8080 포트를 대신한다는 점 외에는 다른 마이크로서비스와 같음
민감한 구성 매개 변수는 표준 도커 컴포즈 환경 파일인 .env 파일로 외부화
공통 빌드 파일인 settings.gradle에 구성 서버를 추가
1 클라이언트에 config와 retry 의존성 넣어주기
2 구성 파일(application.yml)을 구성 저장소로 옮기고, 이름을 spring.application.name 속성에 지정된 클라이언트 이름으로 변경
얘만 냅두고 나머지 다 옮기기
3 src/main/resources 폴더에 이름이 bootstrap.yml인 파일을 추가한다 (구성 서버에 연결하는 데 필요한 구성 정보가 담겨 있음)
4 도커 컴포즈 파일에 구성 서버 접근에 필요한 자격 증명을 추가
(위에서 해씀 )
5 스프링 부트 기반의 자동 테스트를 실행할 때는 구성 서버를 사용하지 않도록 비활성화
spring.cloud.config.enabled=false
이랬던 곳에
이런식으로 다 바꿔주기
src/main/resources/bootstrap.yml 파일 : 구성 서버에 연결할 때 필요한 클라이언트 구성이 담김
애플리케이션 이름이 지정된 spring.application.name 속성 외에는 모든 구성 서버 클라이언트의 구성이 같음 .
메시지 소비자인 product, resources, recommendation 서비스의 구성 파일에도 구성을 추가해주고
메시지 프로듀서인 product-composite 서비스의 구성 파일에도 추가해주기
구성 서버 접속을 위한 자격 증명과 활성화할 스프링 프로필만 해주면 된다.
스프링 프로필 정보 이런식으로 주면된다
구성 저장소 모든 구성파일들을 이동시킨 후에--> 액추에이터 엔드포인트나 유레카, RabbitMQ, 카프카 접속 정보와 같이 각 클라이언트가 공통으로 사용하는 구성 정보를 정리해 모든 클라이언트가 공유하는 application.yml 파일로 옮기기
설정들이 완료됐으니 빌드해볼까나
음.. 기대도안했다..^
지난번이랑 같은 에러
엊그제 민서가 빌드는 되었다고 해서 민서 코드랑 비교하면서 봐밨다
implement 하고 있는 ProductCompositeService 에서 return 값이 잘못되어있었다
저자의책에서는 이내용을 소개를 안해줬다! 내잘못인지 헷갈리지만 어잘수없지 그래도 방법을 찾았다 다시 빌드를 해보자
아까건 넘어갔지만 테스트 관련해서 fail 에러가 난다
음.. test없이 빌드를 하면 성공이 되지만 무슨소용인가..
^이론상으로^
curl https://dev-usr:dev-pwd@localhost:8443/config/product/docker -ks
-- 응답에서 여러 개의 프로퍼티 소스와 그 속성들이 포함되어있음 (property source-우선순위에 따라 반환된다)
curl -k https://dev-usr:dev-pwd@localhost:8443/config/encrypt --data-urlencode "hello world"
curl -k https://dev-usr:dev-pwd@localhost:8443/config/decrypt -d 9eca39e823957f37f0f0f4 d8b2c6c46cd49ef461d1cab20c65710823a8b412ce
12장에서는 스프링 클라우드 컨피그 서버를 사용해 마이크로서비스의 구성을 중앙화해서관리하는 방법을 배웠음
마이크로서비스 수가 중가 --> 관리하고 업데이트해야 하는 구성 파일 수도 증가가 당연 🤗
so) 스프링 클라우드 컨피그 서버를 사용
for) 모든 마이크로서비스의 구성 파일을 중앙 구성 저장소에 두고 관리
구성 서버 : HTTP 기본 인증을 사용해 구성 정보를 보호하므로 자격 증명을 제공하는 사용자만 API를 사용 可
config 서버는 서비스 개발 중에 configuration 파일이 너무 많아져서 (우리 프로젝트에서도 resources폴더 밑에 프로퍼티나 yml파일들이 db, s3, 등드을 사용하면서 많아진것처럼 ) 관리가 힘들 때 사용하는 방법인 것 같음. 그래서 개발환경에서 편리성을 위해 개발된 서버인 것 같다.
음~ 그렇군~