스프링 마이크로서비스 코딩 공작소
이론은 탄탄하게, 실습은 실무에 가깝게!
스프링 부트 2와 스프링 클라우드 2로 구현하며 배우는 컨테이너 기반의 마이크로서비스
마이크로서비스에서는 배포가 중요한 이슈다. 스프링 클라우드를 사용하면 마이크로서비스의 빌드와 배포를 최소화할 수 있고, 이런 의미에서 스프링 부트와 스프링 클라우드의 조합은 매력적이다. 20년간 자바를 사용해온 클라우드 엔지니어인 저자가 현업에서 활용 가능한 컨테이너 기반의 마이크로서비스 코드를 수록했으며, 최신 스프링 부트와 스프링 클라우드 2 버전에 호환되는 실용적인 예제를 직접 실행하며 마이크로서비스의 개념을 확실히 이해할 수 있다. 특히 예제가 도커 기반으로 구성되어 있어 여러 서비스를 실행하고 테스트하기 쉽다. 또한, 개발 패턴, 라우팅 패턴, 클라이언트 회복성 패턴, 구축/배치 패턴 등 마이크로서비스의 여섯 가지 핵심 패턴도 함께 설명한다. 스프링을 사용하면서 클라우드에서 애플리케이션을 개발하고자 하는 분들에게 추천한다.
«스프링 마이크로서비스 코딩 공작소»는 1~3장까지 공개합니다.
전자책 구입
목차
- 1장 스프링, 클라우드와 만나다
- 1.1 마이크로서비스란?
- 1.2 스프링은 무엇이고 마이크로서비스와 어떤 관련이 있을까?
- 1.3 책에서 다루는 내용
- 1.4 대상 독자
- 1.5 스프링 부트로 마이크로서비스 구축
- 1.6 애플리케이션 구축 방식을 바꾸는 이유
- 1.7 클라우드란 정확히 무엇인가?
- 1.8 왜 클라우드와 마이크로서비스인가?
- 1.9 마이크로서비스는 코드 작성 이상을 의미
- 1.9.1 마이크로서비스 핵심 개발 패턴
- 1.9.2 마이크로서비스 라우팅 패턴
- 1.9.3 마이크로서비스 클라이언트 회복성 패턴
- 1.9.4 마이크로서비스 보안 패턴
- 1.9.5 마이크로서비스 로깅 및 추적 패턴
- 1.9.6 마이크로서비스 빌드 및 배포 패턴
- 1.10 스프링 클라우드로 마이크로서비스 구축
- 1.10.1 스프링 부트
- 1.10.2 스프링 클라우드 컨피그
- 1.10.3 스프링 클라우드 서비스 디스커버리
- 1.10.4 스프링 클라우드/넷플릭스 히스트릭스와 리본
- 1.10.5 스프링 클라우드/넷플릭스 주울
- 1.10.6 스프링 클라우드 스트림
- 1.10.7 스프링 클라우드 슬루스
- 1.10.8 스프링 클라우드 시큐리티
- 1.10.9 프로비저닝
- 1.11 예제로 배우는 스프링 클라우드
- 1.12 예제와 관련성 확인
- 1.13 요약
- 2장 스프링 부트로 마이크로서비스 구축
- 2.1 아키텍트의 이야기: 마이크로서비스 아키텍처 설계
- 2.1.1 비즈니스 문제의 분해
- 2.1.2 서비스 세분화의 확정
- 2.1.3 서비스 사이의 대화: 서비스 인터페이스
- 2.2 마이크로서비스를 사용하지 않아야 할 때
- 2.2.1 분산 시스템 구축의 복잡성
- 2.2.2 서버 스프롤(server sprawl)
- 2.2.3 애플리케이션 유형
- 2.2.4 데이터 변환과 일관성
- 2.3 개발자 이야기: 스프링 부트와 자바로 마이크로서비스 생성
- 2.3.1 기본 골격 프로젝트로 시작
- 2.3.2 스프링 부트 애플리케이션 부팅: Bootstrap 클래스 작성
- 2.3.3 마이크로서비스의 출입구 만들기: 스프링 부트 컨트롤러
- 2.4 데브옵스 이야기: 혹독한 런타임 구축
- 2.4.1 서비스 어셈블리: 마이크로서비스의 패키징과 배포
- 2.4.2 서비스 부트스트래핑: 마이크로서비스의 구성 관리
- 2.4.3 서비스 등록과 디스커버리: 클라이언트가 마이크로서비스와 통신하는 방법
- 2.4.4 마이크로서비스의 상태 전달
- 2.5 모든 관점에서
- 2.6 요약
- 3장 스프링 클라우드 컨피그 서버로 구성 관리
- 3.1 구성(그리고 복잡성) 관리
- 3.1.1 구성 관리 아키텍처
- 3.1.2 구현 선택
- 3.2 스프링 클라우드 컨피그 서버 구축
- 3.2.1 스프링 클라우드 컨피그 부트스트랩 클래스 설정
- 3.2.2 파일 시스템과 스프링 클라우드 컨피그 서버 사용
- 3.3 스프링 클라우드 컨피그와 스프링 부트 클라이언트의 통합
- 3.3.1 스프링 클라우드 컨피그 서버의 의존성 설정
- 3.3.2 스프링 클라우드 컨피그를 위한 라이선싱 서비스 구성
- 3.3.3 스프링 클라우드 컨피그 서버로 데이터 소스 연결
- 3.3. 4 @Value 애너테이션으로 프로퍼티 직접 읽기
- 3.3.5 깃과 스프링 클라우드 컨피그 서버 사용
- 3.3.6 스프링 클라우드 컨피그 서버에서 프로퍼티 갱신
- 3.4 중요한 구성 정보 보호
- 3.4.1 암호화에 필요한 오라클 JCE jar 파일을 내려받아 설치
- 3.4.2 암호화 키 설정
- 3.4.3 프로퍼티 암호화 및 복호화
- 3.4.4 클라이언트 측에서 암호화하도록 마이크로서비스 구성
- 3.5 마치며
- 3.6 요약
- 4장 서비스 디스커버리
- 4.1 서비스 위치 찾기
- 4.2 클라우드에서 서비스 디스커버리
- 4.2.1 서비스 디스커버리 아키텍처
- 4.2.2 스프링과 넷플릭스 유레카를 사용한 서비스 디스커버리
- 4.3 스프링 유레카 서비스 구축
- 4.4 스프링 유레카에 서비스 등록
- 4.5 서비스 디스커버리를 사용해 서비스 검색
- 4.5.1 스프링 DiscoveryClient로 서비스 인스턴스 검색
- 4.5.2 리본 지원 스프링 RestTemplate을 사용한 서비스 호출
- 4.5.3 넷플릭스 Feign 클라이언트로 서비스 호출
- 4.6 요약
- 5장 나쁜 상황에 대비한 스프링 클라우드와 넷플릭스 히스트릭스의 클라이언트 회복성 패턴
- 5.1 클라이언트 회복성 패턴이란?
- 5.1.1 클라이언트 측 부하 분산
- 5.1.2 회로 차단기
- 5.1.3 폴백 처리
- 5.1.4 벌크헤드
- 5.2 클라이언트 회복성이 중요한 이유
- 5.3 히스트릭스 시작
- 5.4 스프링 클라우드와 히스트릭스를 위한 라이선싱 서버 설정
- 5.5 히스트릭스를 사용한 회로 차단기 구현
- 5.5.1 조직 마이크로서비스에 대한 호출 타임아웃
- 5.5.2 회로 차단기의 타임아웃 사용자 정의
- 5.6 폴백 프로세싱
- 5.7 벌크헤드 패턴 구현
- 5.8 히스트릭스 세부 설정
- 5.8.1 히스트릭스의 구성 재검토
- 5.9 스레드 컨텍스트와 히스트릭스
- 5.9.1 ThreadLocal과 히스트릭스
- 5.9.2 HystrixConcurrencyStrategy 동작
- 5.10 요약
- 6장 스프링 클라우드와 주울로 서비스 라우팅
- 6.1 서비스 게이트웨이란?
- 6.2 스프링 클라우드와 넷플릭스 주울 소개
- 6.2.1 주울 스프링 부트 프로젝트 설정
- 6.2.2 주울 서비스를 위한 스프링 클라우드 애너테이션
- 6.2.3 유레카와 통신하는 주울 구성
- 6.3 주울에서 경로 구성
- 6.3.1 서비스 디스커버리를 이용한 자동 경로 매핑
- 6.3.2 서비스 디스커버리를 이용한 수동 경로 매핑
- 6.3.3 정적 URL을 이용한 수동 경로 매핑
- 6.3.4 경로 구성을 동적으로 로딩
- 6.3.5 주울과 서비스 타임아웃
- 6.4 주울의 진정한 힘! 필터
- 6.5 상관관계 ID를 생성하는 주울의 사전 필터 작성
- 6.5.1 서비스 호출에서 상관관계 ID 사용
- 6.6 상관관계 ID를 전달받는 사후 필터 작성
- 6.7 동적 경로 필터 작성
- 6.7.1 기본적인 경로 필터 작성
- 6.7.2 run( ) 메서드 구현
- 6.7.3 경로 전달
- 6.7.4 종합
- 6.8 요약
- 7장 마이크로서비스의 보안
- 7.1 OAuth2 소개
- 7.2 작게 시작: 스프링과 OAuth2로 1개의 엔드포인트 보호
- 7.2.1 EagleEye OAuth2 인증 서비스 설정
- 7.2.2 클라이언트 애플리케이션을 OAuth2 서비스에 등록
- 7.2.3 EagleEye 사용자 구성
- 7.2.4 사용자 인증
- 7.3 OAuth2를 사용한 조직 서비스 보호
- 7.3.1 스프링 시큐리티와 OAuth2 jar 파일을 각 서비스에 추가
- 7.3.2 OAuth2 인증 서비스 통신을 위한 서비스 구성
- 7.3.3 서비스의 접근 대상 정의
- 7.3.4 OAuth2 액세스 토큰 전파
- 7.4 자바스크립트 웹 토큰과 OAuth2
- 7.4.1 JWT 발행을 위한 인증 서비스 수정
- 7.4.2 마이크로서비스에서 JWT 사용
- 7.4.3 JWT 토큰 확장
- 7.4.4 JWT 토큰에서 사용자 정의 필드 파싱
- 7.5 마이크로서비스 보안을 마치며
- 7.6 요약
- 8장 스프링 클라우드 스트림을 사용한 이벤트 기반 아키텍처
- 8.1 메시지와 EDA, 마이크로서비스의 사례
- 8.1.1 동기식 요청-응답 방식으로 상태 변화 전달
- 8.1.2 메시징을 사용해 서비스 간 상태 변화 전달
- 8.1.3 메시지 아키텍처의 단점
- 8.2 스프링 클라우드 스트림 소개
- 8.2.1 스프링 클라우드 스트림 아키텍처
- 8.3 간단한 메시지 생산자와 소비자 작성
- 8.3.1 조직 서비스의 메시지 생산자 작성
- 8.3.2 라이선싱 서비스에서 메시지 소비자 작성
- 8.3.3 실제 메시지 서비스 보기
- 8.4 스프링 클라우드 스트림 사용 사례: 분산 캐싱
- 8.4.1 레디스로 조회 캐싱
- 8.4.2 사용자 정의 채널 정의
- 8.4.3 종합: 메시지를 받으면 캐시 삭제
- 8.5 요약
- 9장 스프링 클라우드 슬루스와 집킨을 이용한 분산 추적
- 9.1 스프링 클라우드 슬루스와 상관관계 ID
- 9.1.1 라이선싱과 조직 서비스에 스프링 클라우드 슬루스 추가
- 9.1.2 스프링 클라우드 슬루스의 추적 분석
- 9.2 로그 수집과 스프링 클라우드 슬루스
- 9.2.1 스프링 클라우드 슬루스/페이퍼트레일의 실제 구현
- 9.2.2 페이퍼트레일 계정 생성과 syslog 커넥터 구성
- 9.2.3 도커 출력을 페이퍼트레일로 리다이렉션
- 9.2.4 페이퍼트레일에서 스프링 클라우드 슬루스의 추적 ID 검색
- 9.2.5 주울로 HTTP 응답에 상관관계 ID 추가
- 9.3 오픈집킨으로 분산 추적
- 9.3.1 스프링 클라우드 슬루스와 집킨 의존성 설정
- 9.3.2 집킨 연결을 위한 서비스 설정
- 9.3.3 집킨 서버 설치 및 구성
- 9.3.4 추적 레벨 결정
- 9.3.5 집킨으로 트랜잭션 추적
- 9.3.6 더 복잡한 트랜잭션의 시각화
- 9.3.7 메시징 추적 수집
- 9.3.8 사용자 정의 스팬 추가
- 9.4 요약
- 10장 마이크로서비스의 배포
- 10.1 EagleEye: 클라우드의 핵심 인프라스트럭처 설정
- 10.1.1 아마존 RDS로 PostgreSQL 데이터베이스 생성
- 10.1.2 아마존에 레디스 클러스터 구축
- 10.1.3 ECS 클러스터 생성
- 10.2 인프라스트럭처를 넘어: EagleEye 배포
- 10.2.1 ECS에 EagleEye 서비스 수동으로 배포
- 10.3 빌드 및 배포 파이프라인 아키텍처
- 10.4 실제 빌드 및 배포 파이프라인
- 10.5 깃허브와 Travis CI로 빌드 및 배포 시작
- 10.6 Travis CI에서 서비스 빌드
- 10.6.1 핵심 빌드 런타임 구성
- 10.6.2 사전 빌드 도구 설치
- 10.6.3 빌드 실행
- 10.6.4 소스 제어 코드에 태그 달기
- 10.6.5 마이크로서비스 빌드와 도커 이미지 생성
- 10.6.6 도커 허브에 이미지 올리기
- 10.6.7 아마존 ECS에서 서비스 시작
- 10.6.8 플랫폼 테스트 시작
- 10.7 빌드 및 배포 파이프라인을 마치며
- 10.8 요약
- 부록 A 데스크톱에서 클라우드 실행
- A.1 필수 소프트웨어
- A.2 깃허브에서 프로젝트 내려받기
- A.3 장별 구조
- A.4 프로젝트 빌드 및 컴파일
- A.5 도커 이미지 빌드
- A.6 도커 컴포즈로 서비스 시작
- 부록 B OAuth2 그랜트 타입
- B.1 패스워드 그랜트
- B.2 클라이언트 자격 증명 그랜트
- B.3 인가 코드 그랜트
- B.4 암시적 그랜트
- B.5 토큰을 리프레시하는 방법