312 lines
10 KiB
Markdown
312 lines
10 KiB
Markdown
# MSA using SpringCloud
|
|
|
|
## Development Environment
|
|
`Windows 10` `JDK 11.0.6` `SpringBoot 2.3.2.RELEASE` `Maven 3.6.3` `Git 2.22.0.windows.1` `intellij`
|
|
[`Spring Cloud Hoxton.SR6`](https://spring.io/projects/spring-cloud) 에서 `SR8` 로 업그레이드 [`RabbitMQ 3.8.6`](https://www.rabbitmq.com/download.html)
|
|
[`Erlang/OTP 23.0`](https://www.erlang.org/downloads) [kafka_2.13-2.6.0](https://kafka.apache.org/downloads)
|
|
|
|
|
|
|
|
## Table of Contents
|
|
|
|
- ~~Config Server (환경설정 외부화)~~
|
|
- ~~Feign (REST Client & Circuit Breaker)~~
|
|
- ~~Eureka (Service Registry & Discovery)~~
|
|
- ~~Zuul (Proxy & API Gateway)~~
|
|
- ~~OAuth2, JWT (Security)~~
|
|
- ~~Spring Cloud Stream (EDA, 비동기 마이크로서비스 구성)~~
|
|
- Sleath, Papertrail, Zipkin (Logging Tracker)
|
|
- Hystrix + Turbine (Circuit Breaker & Dashboard, 여러 대의 WAS 한번에 모니터링)
|
|
|
|
---
|
|
|
|
***- Config Server (환경설정 외부화)<br />***
|
|
자세한 설명은 [Spring Cloud - Spring Cloud Config Server](https://assu10.github.io/dev/2020/08/16/spring-cloud-config-server/) 를 참고
|
|
> [Messaging with RabbitMQ](https://spring.io/guides/gs/messaging-rabbitmq/) <br />
|
|
> [AMQP doc](https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/reference/htmlsingle/#boot-features-amqp) <br />
|
|
> [JCE jar download](https://www.oracle.com/java/technologies/javase-jce-all-downloads.html)
|
|
>
|
|
```shell script
|
|
HOW TO RUN
|
|
|
|
-- rabbitMQ 서버 실행
|
|
C:\rabbitmq_server-3.8.6\sbin>rabbitmq-service.bat start
|
|
|
|
-- rabbitMQ 관리자 UI 확인
|
|
http://localhost:15672/
|
|
|
|
-- 현재 프로젝트 실행
|
|
mvn spring-boot:run
|
|
|
|
-- 컨피스 서버 구동 확인
|
|
http://localhost:8889/actuator
|
|
|
|
-- 컨피그 서버 JSON Payload 확인
|
|
http://localhost:8889/member-service/default/
|
|
http://localhost:8889/member-service/dev
|
|
|
|
-- 현재 실행중인 환경정보 확인
|
|
http://localhost:8090/actuator/env
|
|
|
|
-- port 재설정하여 서비스 띄우기
|
|
C:\> mvn clean install
|
|
C:\configserver\target>java -jar configserver-0.0.1-SNAPSHOT.jar
|
|
C:\member-service\target>java -Dserver.port=8090 -jar member-service-0.0.1-SNAPSHOT.jar
|
|
C:\member-service\target>java -Dserver.port=8091 -jar member-service-0.0.1-SNAPSHOT.jar
|
|
|
|
-- actuator bus 종단점 호출하여 설정정보 변경 전파
|
|
POST http://localhost:8090/actuator/bus-refresh
|
|
|
|
-- 변경된 설정정보 확인
|
|
GET http://localhost:8090/member/name?nick=JU
|
|
GET http://localhost:8091/member/name?nick=JU
|
|
|
|
-- 컨피그 서버 암호화 키로 암호화/복호화된 패스워드 확인
|
|
POST http://localhost:8889/encrypt
|
|
|
|
POST http://localhost:8889/decrypt
|
|
|
|
```
|
|
|
|
---
|
|
|
|
***- Feign (REST Client & Circuit Breaker)***<br />
|
|
자세한 설명은 [Spring Cloud - Spring Cloud Feign](https://assu10.github.io/dev/2020/06/18/spring-cloud-feign/) 를 참고
|
|
|
|
---
|
|
|
|
***- Eureka (Service Registry & Discovery)***<br />
|
|
자세한 설명은 [Spring Cloud - Spring Cloud Eureka](https://assu10.github.io/dev/2020/08/26/spring-cloud-eureka/)와
|
|
[Spring Cloud - Spring Cloud Eureka (상세 설정편)](https://assu10.github.io/dev/2020/12/05/spring-cloud-eureka-configuration/)를 참고
|
|
|
|
```shell script
|
|
HOW TO RUN
|
|
|
|
-- rabbitMQ 서버 실행
|
|
C:\rabbitmq_server-3.8.6\sbin>rabbitmq-service.bat start
|
|
|
|
-- port 재설정하여 서비스 띄우기
|
|
C:\> mvn clean install
|
|
C:\configserver\target>java -jar configserver-0.0.1-SNAPSHOT.jar
|
|
C:\member-service\target>java -Dserver.port=8090 -jar member-service-0.0.1-SNAPSHOT.jar
|
|
C:\member-service\target>java -Dserver.port=8091 -jar member-service-0.0.1-SNAPSHOT.jar
|
|
C:\event-service\target>java -Dserver.port=8070 -jar event-service-0.0.1-SNAPSHOT.jar
|
|
C:\event-service\target>java -Dserver.port=8071 -jar event-service-0.0.1-SNAPSHOT.jar
|
|
|
|
-- actuator bus 종단점 호출하여 설정정보 변경 전파
|
|
POST http://localhost:8090/actuator/bus-refresh
|
|
|
|
-- 변경된 설정정보 확인
|
|
GET http://localhost:8090/member/name?nick=JU
|
|
GET http://localhost:8071/event/name?nick=JU
|
|
|
|
-- 유레카 서버 구축 후 재기동
|
|
C:\> mvn clean install
|
|
C:\configserver\target>java -jar configserver-0.0.1-SNAPSHOT.jar
|
|
C:\eurekaserver\target>java -jar eurekaserver-0.0.1-SNAPSHOT.jar
|
|
|
|
-- 유레카 콘솔 확인
|
|
http://localhost:8761/
|
|
|
|
-- 유레카 서비스 등록 후 재기동
|
|
C:\eurekaserver\target>java -jar eurekaserver-0.0.1-SNAPSHOT.jar
|
|
C:\member-service\target>java -jar member-service-0.0.1-SNAPSHOT.jar
|
|
C:\event-service\target>java -Dserver.port=8071 -jar event-service-0.0.1-SNAPSHOT.jar
|
|
C:\event-service\target>java -Dserver.port=8070 -jar event-service-0.0.1-SNAPSHOT.jar
|
|
|
|
-- 유레카 서버에 등록된 레지스트리 내용 확인
|
|
http://localhost:8761/eureka/apps/
|
|
|
|
-- 특정 서비스 레지스트리 확인
|
|
http://localhost:8761/eureka/apps/event-service
|
|
|
|
-- RestTemplate 적용 후 API 호출
|
|
http://localhost:8090/member/gift/flower
|
|
|
|
-- Feign 적용 후 API 호출
|
|
C:\> mvn clean install
|
|
C:\configserver>java configserver-0.0.1-SNAPSHOT.jar
|
|
C:\member-service\target>java -Dserver.port=8090 -jar member-service-0.0.1-SNAPSHOT.jar
|
|
C:\member-service\target>java -Dserver.port=8091 -jar member-service-0.0.1-SNAPSHOT.jar
|
|
C:\event-service\target>java event-service-0.0.1-SNAPSHOT.jar
|
|
|
|
GET http://localhost:8070/event/member/hyori
|
|
```
|
|
|
|
---
|
|
|
|
***- Zuul (Proxy & API Gateway)***<br />
|
|
자세한 설명은 [Spring Cloud - Netflix Zuul(1/2)](https://assu10.github.io/dev/2020/08/26/netflix-zuul/)와
|
|
[Spring Cloud - Netflix Zuul(2/2)](https://assu10.github.io/dev/2020/09/05/netflix-zuul2/),
|
|
[Spring Cloud - Netflix Zuul(Ribbon) Retry](https://assu10.github.io/dev/2020/12/06/netflix-zuul-retryable/)를 참고
|
|
|
|
```shell script
|
|
HOW TO RUN
|
|
|
|
-- 유레카 콘솔 접속하여 주울 등록되었는지 확인
|
|
http://localhost:8761/
|
|
|
|
-- 주울이 잘 떴는지 확인
|
|
http://localhost:5555/actuator/env
|
|
|
|
-- 주울이 라우팅하고 있는 경로 확인
|
|
http://localhost:5555/actuator/routes
|
|
|
|
-- 주울을 통해 이벤트 서비스의 REST API 호출 (feign)
|
|
http://localhost:5555/event-service/event/member/assu
|
|
|
|
-- 컨피그 저장소 설정값 변경 후 내용 전파
|
|
POST http://localhost:5555/actuator/bus-refresh
|
|
|
|
-- 주울 수동 매핑된 경로로 라우팅되는지 확인
|
|
http://localhost:5555/evt/event/member/hyori
|
|
|
|
-- `api` 프리픽스 붙인 후 라우팅 확인
|
|
http://localhost:5555/api/evt/event/member/hyori
|
|
|
|
-- 주울을 통해 회원 서비스의 REST API 호출 (RestTemplate)
|
|
http://localhost:5555/api/mb/member/gift/flower
|
|
|
|
-- 사전/사후 필터 동작 확인 (상관관계 ID 생성 및 하위 서비스에 전파/응답 헤더에 상관관계 ID 삽입)
|
|
http://localhost:5555/api/mb/member/name/hyori
|
|
|
|
```
|
|
|
|
---
|
|
|
|
***- OAuth2, JWT (Security)***<br />
|
|
자세한 설명은 [Spring Cloud - OAuth2, Security(1/2)](https://assu10.github.io/dev/2020/09/12/spring-cloud-oauth2.0/) 와
|
|
[Spring Cloud - OAuth2, Security(2/2)](https://assu10.github.io/dev/2020/09/30/spring-cloud-oauth2.0-2/)를 참고
|
|
|
|
```shell script
|
|
HOW TO RUN
|
|
|
|
-- 액세스 토큰 획득
|
|
[POST] http://localhost:8901/auth/oauth/token
|
|
|
|
-- 액세스 토큰으로 사용자 정보 조회
|
|
[GET] http://localhost:8901/auth/user
|
|
|
|
-- OAuth2 로 회원 서비스 보호 후 API 호출
|
|
[GET] http://localhost:8090/member/name/rinda
|
|
|
|
-- 권한 있는 사용자(assuAdmin) 의 액세스 토큰과 함께 PUT 메서드 API 호출
|
|
[PUT] http://localhost:8090/member/rinda
|
|
|
|
-- oauth2 전파 (이벤트 서비스에서 회원서비스 호출)
|
|
[GET] http://localhost:5555/api/evt/event/userInfo/rinda
|
|
|
|
-- JWT 인증 서버 설정 후 액세스 토큰 획득
|
|
[POST] http://localhost:8901/auth/oauth/token
|
|
|
|
-- JWT 토큰 획득 후 인증 확인
|
|
[GET] http://localhost:8090/member/gift/manok
|
|
```
|
|
---
|
|
|
|
***- Spring Cloud Stream (EDA, 비동기 마이크로서비스 구성)***<br />
|
|
|
|
자세한 설명은 [Spring Cloud Stream, 분산 캐싱 (1/2)](https://assu10.github.io/dev/2020/10/01/spring-cloud-stream/) 와
|
|
[Spring Cloud Stream, 분산 캐싱 (2/2)](https://assu10.github.io/dev/2020/10/02/spring-cloud-stream-2/) 를 참고
|
|
|
|
```shell script
|
|
HOW TO RUN
|
|
|
|
-- 주키퍼 실행
|
|
C:\kafka_2.13-2.6.0\bin\windows>.\zookeeper-server-start.bat ..\..\config\zookeeper.properties
|
|
|
|
-- 카프카 실행
|
|
C:\kafka_2.13-2.6.0\bin\windows>.\kafka-server-start.bat ..\..\config\server.properties
|
|
|
|
-- 카프카 토픽 리스트 조회
|
|
C:\kafka_2.13-2.6.0\bin\windows>.\kafka-topics.bat --list --zookeeper localhost:2181
|
|
__consumer_offsets
|
|
mbChangeTopic
|
|
springCloudBus
|
|
|
|
-- 메시지 발행/수신 확인
|
|
[POST] http://localhost:8090/member/assu
|
|
|
|
-- 레디스 설치확인
|
|
C:\Users\ju>netstat -an|findstr 6379
|
|
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING
|
|
C:\Users\ju>redis-cli
|
|
127.0.0.1:6379> ping
|
|
PONG
|
|
127.0.0.1:6379> set key value
|
|
OK
|
|
127.0.0.1:6379> get key
|
|
"value"
|
|
127.0.0.1:6379>
|
|
|
|
-- 레디스 실행
|
|
redis-server.bat 실행
|
|
|
|
-- 모든 키 확인
|
|
127.0.0.1:6379> keys *
|
|
1) "member"
|
|
|
|
-- key-value 확인 (get 은 String 만 다루므로 여기선 에러로 표시)
|
|
127.0.0.1:6379> get member
|
|
(error) WRONGTYPE Operation against a key holding the wrong kind of value
|
|
|
|
-- 모든 키 삭제
|
|
127.0.0.1:6379> flushall
|
|
OK
|
|
|
|
-- 레디스 캐싱 데이터 무효화
|
|
[GET] http://localhost:8070/event/1234
|
|
|
|
[DELETE] http://localhost:8090/member/userInfo/1234
|
|
|
|
[GET] http://localhost:8070/event/1234
|
|
```
|
|
|
|
---
|
|
|
|
***- Sleath, Papertrail, Zipkin (Logging Tracker)***<br />
|
|
|
|
---
|
|
|
|
***- Hystrix + Turbine (Circuit Breaker & Dashboard, 여러 대의 WAS 한번에 모니터링)***<br />
|
|
|
|
---
|
|
|
|
## Server Diagram
|
|
TO-DO...
|
|
|
|
---
|
|
|
|
## How to run
|
|
```shell script
|
|
-- 현재 프로젝트 바로 실행하기
|
|
mvn spring-boot:run
|
|
|
|
-- parent-pom 이 위치한 디렉터리안에 있는 메이븐 pom.xml 파일을 실행
|
|
mvn clean package
|
|
|
|
-- rabbitMQ 플러그인 활성화
|
|
C:\rabbitmq_server-3.8.6\sbin>rabbitmq-plugins enable rabbitmq_management
|
|
|
|
-- rabbitMQ 서비스 중지
|
|
C:\rabbitmq_server-3.8.6\sbin>rabbitmq-service.bat stop
|
|
|
|
-- rabbitMQ 서비스 설치
|
|
C:\rabbitmq_server-3.8.6\sbin>rabbitmq-service.bat install
|
|
|
|
-- rabbitMQ 서비스 재기동
|
|
C:\rabbitmq_server-3.8.6\sbin>rabbitmq-service.bat start
|
|
|
|
-- 각각 터미널 창에서 서비스 띄우기
|
|
java -jar /target/fares-1.0.jar
|
|
|
|
-- 서비스 확인
|
|
http://localhost:8080/actuator/
|
|
http://localhost:8888/licensingservice/default
|
|
|
|
```
|
|
|
|
---
|
|
|
|
<br /><br /><br /><br />
|
|
 thanks! |