Cloud/SpringCloud로 개발하는 MSA

gateway 인증 + Cloud Config + Cloud Bus(rabbitMQ) + 암호화

Tony Lim 2022. 10. 28. 11:48

catalog service , user-service  2개의 서비스가 존재한다.

api gatway 에서 jwt 를 통해 인증을 거친후에 Eureka (service discovery) 에서 실제 service instance 주소를 알아와서 로드 밸런싱을 해주게 된다.

- id: user-service
  uri: lb://USER-SERVICE
  predicates:
    - Path=/user-service/**
    - Method=GET
  filters:
    - RemoveRequestHeader=Cookie
    - RewritePath=/user-service/(?<segment>.*), /$\{segment}
    - AuthorizationHeaderFilter
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
        ServerHttpRequest request = exchange.getRequest();

        if (!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
            return onError(exchange, "no authorization header", HttpStatus.UNAUTHORIZED);
        }

        String authorizationHeader = request.getHeaders().get(HttpHeaders.AUTHORIZATION).get(0);
        String jwt = authorizationHeader.replace("Bearer","");

        if(!isJwtValid(jwt)) {
            return onError(exchange, "JWT token is not valid", HttpStatus.UNAUTHORIZED);
        }

        return chain.filter(exchange);
    };
}

api gatway에서 로그인 서비스를 제외하고 나머지는 다 jwt 검증을 받게 되는 시스템이다.
뒷단의 ms들은 api gateway를 통해서만 접근이 가능함으로 여기서만 인증을 하면 된다.

 


Configuration Service

Spring Cloud Config Server 를 이용하여 local git 에서 yaml 파일 설정을 가져오도록 한다.

yaml 에 적용된 profile 에 따라서 개발 환경 운영 환경 분리해서 적용 시킬 수 있다.

하지만 yaml 파일을 변경후 config server를 통해 instance 가 설정을 읽어오려면 instance도 재기동 시켜줘야한다.

이때 actuator 를 사용하게 된다.

 

actuator 에서 제공하는 Metric (ms 의 상태 정보들)

actuator api 가 service:port/actuator/somthing 방식으로 제공이 된다.

spring:
  cloud:
    config:
      uri: http://localhost:8888
      name: ecommerce

bootstrap yml을 위와 같이 작성한다. localhost:8888은 config-service (spring cloud config server) 가 돌고 있는 주소이다.

config:
  import:
    - classpath:/bootstrap.yml

해당 bootstrap yml을 application.yml 에서 import 한다.

ecommerce.yaml 파일에서 변경하고 싶은 설정 값을 변경후 commit 후에 post 요청으로 actuator/refresh 날리면 해당 설정 변경사항이 반영이 된다.

 

profile 별로 관리하기

spring:
  cloud:
    config:
      uri: http://localhost:8888
      name: ecommerce
  profiles:
    active: dev
    
    
2022-10-26 10:01:23.681  INFO 12797 --- [  restartedMain] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=ecommerce, profiles=[dev], label=null, version=cc054e36510595a33666c4b2bff3143f1faef993, state=null

bootstrap.yml 파일에 위와 같이 설정하면 ecommerce-dev.yml 설정이 적용이 된다.

 

우선순위

구체적일 수록 우선순위가 높다.

[application-name]-[profile].yml 처럼 구체적인것이 가장 우선순위가 높다.

propertySources 에서도 0순위가 application name을 명시한 yml 이 올라가 있다.

 


Spring Cloud Bus

변경된 configuration 을 ms에게 적용하는 방법은

1. 껐다 킨다.

2. actuator refresh Post 요청 보내기

3. spring cloud bus 를 사용하는것이다.

별도의 client 가 /busrefresh 요청을 ms 중 하나에게 보내면 Bus 가 Broadcast 햐여 나머지 ms에게도 변경된 Configuration이 적용될 수 있게 한다.

 

RabbitMQ 설치

https://bluexmas.tistory.com/1171

 

RabbitMQ : Ubuntu에 설치

출처 T.t. :: Windows Server에 RabbitMQ 설치 Ubuntu에서 RabbitMQ 설치 (apt) ::: 삵 (sarc.io) Ubuntu 에서 RabbitMQ 설치하기 :: 조은우 개발 블로그 저장소 추가 bluesanta@bluesanta-desktop:~$ sudo apt li..

bluexmas.tistory.com

wsl2 에 rabbit mq 를 설치 후 기동하려면 sudo service rabbitmq-server start 명령어로 기동해야한다.

sudo rabbitmq-plugins enable rabbitmq_management

명령어를 통해 플러그인들을 기동후에 config-server를 실행해야 제대로 동작한다.

https://spring.io/guides/gs/messaging-rabbitmq/

 

Messaging with RabbitMQ

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

참고했는데 spring boot 같은 경우에는 dependency만 추가 해줘도 user/pw guest/guest 로 rabbit mq랑 connection을 맺어준다. 

 

 

이후 Discover service가 켜져있는 상태에서 config service-> api-gateway -> userv-service 를 기동시킨다.

현재 config service 가 바라보고 있는 설정을 변경해준후에

api gateway 나 userv service에 /actuator/busrefresh를 post 요청으로 날리면 rabbit mq에 등록되어 있는 ms들에게 해당 설정이 변경되었다는것이 broadcast되어 다 잘 전달이된다.

 


암호화(Symmetric)

spring:
  application:
    name: config-service
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          search-locations: file://${user.home}/vscode/spring-cloud/native-file-repo
        git:
#          uri: file:///home/tony/vscode/spring-cloud/git-local-repo
          uri: https://github.com/kuuku123/spring-cloud-config
        default-label: main
encrypt:
  key: alskdjlfksjldkjflksjldkjfklsjdkfljs

config-service의 application.yml 과 bootstrap.yml이다. 해당 key로 암호화 한다. 

config-service가 바라보고 있는 native-file-repo 에는 user-service.yml이 존재한다.

 

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

이는 user-service 에서 config-service가 기동중인 8888번 포트의 프로세스를 통해 user-service.yml을 참조한다.

token:
  expiration_time: 864000000
  secret: user_token_native_user_service

gateway:
  ip: localhost

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/test
    username: '{cipher}418f93032d390f72337f8feed351fb0be7bfabae2d31e52659f9933b7b62bae7'

user-service.yml 에 config-service key로 암호화된 문자를 입력하고 앞에 {cipher}를 붙여주면

해당 설정을 받아서 쓰는 user-service 입장에서는 decrpyt가 완료된 상태로 쓸수 있게 된다.

 

Asymmetric

keytool로 privatekey를 생성후 이를 기반으로 public key를 추출할 수 있다.

encrypt:
#  key: alskdjlfksjldkjflksjldkjfklsjdkfljs
  key-store:
    location: file://${user.home}/vscode/spring-cloud/keystore/apiEncryptionKey.jks
    password: test1234
    alias: apiEncryptionKey

config server에 bootstrap.yml을 설정을 바꾸고 재기동 시켜줘야한다.

'Cloud > SpringCloud로 개발하는 MSA' 카테고리의 다른 글

MS간의 data 동기화 (1. kafka 기본 이론)  (0) 2022.11.02
MS간 통신  (0) 2022.10.29
API Gateway Service  (0) 2022.10.14
Service Discovery  (0) 2021.06.29
Microservice 소개  (0) 2021.06.22