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
wsl2 에 rabbit mq 를 설치 후 기동하려면 sudo service rabbitmq-server start 명령어로 기동해야한다.
sudo rabbitmq-plugins enable rabbitmq_management
명령어를 통해 플러그인들을 기동후에 config-server를 실행해야 제대로 동작한다.
https://spring.io/guides/gs/messaging-rabbitmq/
참고했는데 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을 참조한다.
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 |