Configuration Service

Single Ko·2023년 10월 17일
0

msa

목록 보기
3/3

MSA 서버에서 각각의 마이크로 서비스가 가지고 있어야 될 구성 정보 파일(yaml파일 등..)에 대한 외부의 시스템에서 공유에 대해 알아보자.

  1. application.yml 같은 애플리케이션의 구성 정보 파일이 업데이트되면 마이크로서비스는 새로 빌드 되어야 할 것이다.
  2. 이런 구성 파일을 관리함에 있어서 외부에서 값을 가져오게 하면 동적으로 파일을 가져오는 것이기 때문에 구성 정보의 내용이 바뀌어도 애플리케이션 자체를 새로 빌드 할 필요가 없다.
  • FTP
  • Network File System
  • Git Repo(Local, Remote)
  • Native File Repository

이런 기술들을 이용 할 수 있다.

Spring Cloud Config

  • 분산 시스템 서버, 클라이언트 구성에 필요한 설정 정보(e.g application.yml)를 외부 시스템에서 관리
  • 어떤 파일 저장소를 이용하든 하나의 중앙화 된 저장소에서 구성요소 관리 가능
  • 각 서비스를 다시 빌드하지 않고, 바로 적용 가능
  • 애플리케이션 배포 pipeline을 통해 DEV - UAT - PROD 환경에 맞는 구성 정보 사용

이런 환경 설정 정보들을 분리하였기 때문에 자유도 있고, 궁극적인 애플리케이션 구성이 가능할 것이다.

implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

구성 정보 우선 순위

application.yml -> application-{name}.yml -> application-{name}-{profile}.yml

Application에 명시적인 지시 사항이 없다면 이러한 우선 순위를 가진다. 자세한것에서부터 큰거로!
물론 이것 외 에도 빌드된 패키지 내부가 우선 순위를 가지고, 외부의 구성 정보가 후순위이다.
(외부, 내부의 큰 순서차이가 있고, 그 속에서는 위와 같은 우선순위를 가진다. )

spring:
  cloud:
    config:
      server:
        git:
          uri: file:///D:\study\study_alone\mini_project\msa-ecommerce\git-local-repo

Spring Cloud Config Server에 이렇게 경로를 정해두면 그 안의 yml 파일을 읽어 올 수 있다.

Changed Configuration Values

  • 서버 재기동
  • Actuator refresh 기능 사용
  • Spring Cloud bus 사용

Actuator

  • 애플리케이션 상태, 모니터링
  • Metric 수집을 위한 Http End point 제공
  • /actuator/refresh에 접속하면 변경 사항을 새로 업데이트 해준다.
  • 이 기능을 사용하게 된다면, 마이크로서비스의 애플리케이션 각각마다 재시작은 필요 없지만 그래도 편리한 방법은 아니다. 각 Microservice Application마다 actuator의 refresh에 접속 해야 한다. 이것을 쉽게 사용하기 위해서 Spring Cloud bus 기능을 알아 보겠다.

Spring Cloud bus

what is spring cloud bus?

  • 분산 시스템의 노드(microservice)를 경량 메시지 브로커와 연결(주로 rabbitMq사용)

  • 상태 및 구성에 대한 변경 사항을 연결된 노드에게 전달 (Broadcast)

  • 기존의 p2p 와 달리 메시지 서버인 Middlware를 놓고 메시지를 전달하는 사람이 미들웨어에 전달하면 그 미들웨어에서 메시지를 구독하고 있는 서버에게 전달 사항을 보냄.

  • 왜 그렇다면 MessageQuing 서버를 두는게 유리한가?
    - 서버가 1대1로 주고받는 것 보다 안정성이 높아지고,
    - 서버끼리 서로에 대해 몰라도 주고 받는게 가능해짐.

    각각의 연결된 마이크로 서비스에 클라우드 버스가 직접 데이터를 Push해서 업데이트 사항을 전달해줌.

    AMQP(Advanced Message Queuing Protocol)을 통해 연결 되어 있음.(ex: rabbitMQ)

하나가 Config가 refresh되어서 알게되면 그것을 bus에 알려주고 MQ를 통해 전달 된다는 것이다.

방법
HTTP POST /busrefresh 호출을 하게 된다. -> 마이크로서비스에다 직접 호출해도, Gateway , cloud server어디든 상관없이 한번만 호출하면 해당하는 cloud bus에 연결된 노드에 전달이 된다(Broadcast)

AMQP

  • 메시지 지향 미들웨를 위한 개방형 표준 응용 계층 프로토콜
  • 메시지 지향, 큐잉, 라우팅(P2P, Publisher-Subscriber), 신뢰성, 보안
  • Erlang, RabbitMQ에서 사용
  • 초당 20+ 메시지를 소비자에게 전달
  • 메시지 전달 보장, 시스템 간 메시지 전달
  • 브로커, 소비자(메시지를 받겠다고 했던 시스템) 중심

Kafka 프로젝트

  • Apache Software Foundation이 Scalar 언어로 개발한 오픈 소스 메시지 브로커 프로젝트
  • 분산형 스트리밍 플랫폼
  • 대용량의 데이터를 처리 가능한 메시징 시스템
  • 초당 100K+ 이상의 이벤트 처리
  • Pub/Sub, Topic에 메시지 전달
  • Ack를 기다리지 않고 전달 가능
  • 생산자 중심
  • Pub -> TOPIC에 전달 , 이것을 Subscribe 하고 있는 subscriber들이 update된 Topic을 가져감

Config의 암호화

  • 위와 같은 구성 정보를 암호화하여 사용 가능하다. 암호화 방식은 대칭키와 비대칭키 방식이 있다.

Plain text를 사람이 알아 볼 수 없는 것으로 바꾸는 걸 encryption, 그것을 다시 원래의 글로 바꾸는 것을 decryption

Plain text를 사람이 알아 볼 수 없는 것으로 바꾸는 걸 encryption, 그것을 다시 원래의 글로 바꾸는 것을 decryption

Symmetric Encryption(shared)

  • Using the same key
encrypt:
  key: abcdefghijklmnopqrstuvwxyz0123456789

localhost:8888/encrypt
localhost:8888/decrypt

yaml 파일에 설정을 해놓고, post로 text를 적어서 보내면 됨.

Asymmetric Encryption (RSA Keypair)

  • Private and Public Key

  • Using java keytool

    java key tool을 이용하여 RSA 비대칭 키를 만들 수 있다.

PS D:\study\study_alone\mini_project\msa-ecommerce\keystore> keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=Seungyong Kim, OU=API Development, O=jonecnsulting.co.kr, L=Seoul, C=KR" -keypass "test1234" -keystore apiEncryptionKey.jks -storepass "test1234"

다음에 대해 유효 기간이 90일인 2,048비트 RSA 키 쌍 및 자체 서명된 인증서(SHA256withRSA)를 생성하는 중 : CN=Seungyong Kim, OU=API Development, O=jonecnsulting.co.kr, L=Seoul, C=KR
  • alias - 별
  • keyalg - 알고리즘
  • CN (certification name) - 서명자 이름
  • OU (Organize unit) -
  • O (Oragnazation) - 조직
  • L (Location)
  • C (Country)
  • keypass - password
  • keystore - 저장될 파일이름
keytool -list  -keystore apiEncryptionKey.jks -v
  • 만들어진 키 store를 확인할 수 있음. 들어가면, key store 비밀번호를 입력면 된다. private key가 만들어져 있다. 이제 이것으로 public key를 만들어 사용이 가능하다
keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trustServer.cer
  • rfx : request for cummunication = > 인터넷에서 사용가능한 표준 양식
keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
encrypt:
  key-store:
    location: file:///D:\study\study_alone\mini_project\msa-ecommerce\keystore\apiEncryptionKey.jks
    password: test1234
    alias: apiEncryptionKey
profile
공부 정리 블로그

0개의 댓글