도커(Docker), 쿠버네티스(Kubernetes), 프로메테우스(Prometheus) 같은 클라우드 네이티브 기술의 공통점은 무엇일까요? 바로 Go라는 프로그래밍 언어로 만들어졌다는 것입니다. 이 책은 Go의 장점을 활용해 예측할 수 없는 환경에서도 확장 가능하면서 탄력적인 클라우드 네이티브 서비스를 개발하는 방법을 알려줍니다. 특히 Go 프로그래밍 언어가 지닌 로 레벨의 특징, 미들레벨의 디자인 패턴, 하이레벨 아키텍처 고려 사항 등에 맞춘 애플리케이션의 구조과 구성을 확인할 수 있습니다.
이 책에서는 Go를 이용해 간단하지만 모든 기능을 갖춘 분산 키-값 저장소를 구축합니다. 저장소를 구축하면서 중급에서 고급 개발자까지 참고할 수 있는 클라우드 네이티브 관리와 배포 문제를 해결하는 모범 사례를 확인할 수 있습니다. 그리고 왜 클라우드 네이티브 서비스를 개발하는 프로그래밍 언어로 Go를 채택했는지를 자연스럽게 알 수 있습니다.
Contents
Part 1 클라우드 네이티브로의 변화
1장 클라우드 네이티브 애플리케이션이란?
1.1 지금까지의 이야기
1.2 클라우드 네이티브란 무엇인가?
1.2.1 확장성
1.2.2 느슨한 결합
1.2.3 탄력성
1.2.4 관리 용이성
1.2.5 관찰 가능성
1.3 클라우드 네이티브는 왜 중요한가?
요약
2장 왜 Go가 클라우드 네이티브 세상을 지배하는가?
2.1 Go를 만들게 된 계기
2.2 클라우드 네이티브 세계를 위한 기능
2.2.1 컴포지션과 구조 타이핑
2.2.2 이해하기 쉬운 언어
2.2.3 CSP 스타일의 동시성
2.2.4 빠른 빌드 속도
2.2.5 언어의 안정성
2.2.6 메모리 보안
2.2.7 성능
2.2.8 정적 링크
2.2.9 정적 타이핑
요약
Part 2 클라우드 네이티브 Go의 구성
3장 Go 프로그래밍 기초
3.1 기본 데이터 타입
3.1.1 불린
3.1.2 간단한 숫자
3.1.3 복소수
3.1.4 문자열
3.2 변수
3.2.1 단축 변수 선언
3.2.2 제로값
3.2.3 공백 식별자
3.2.4 상수
3.3 컨테이너 타입: 배열, 슬라이스, 맵
3.3.1 배열
3.3.2 슬라이스
3.3.3 맵
3.4 포인터
3.5 제어 구조
3.5.1 for의 재미
3.5.2 if 구문
3.5.3 switch 구문
3.6 에러 제어
3.6.1 에러 정의하기
3.7 함수에 재미를 더하기: 가변인자와 클로저
3.7.1 함수
3.7.2 가변인자 함수
3.7.3 익명 함수와 클로저
3.8 구조체, 메서드, 인터페이스
3.8.1 구조체
3.8.2 메서드
3.8.3 인터페이스
3.8.4 타입 임베딩을 통한 컴포지션
3.9 장점: 동시성
3.9.1 고루틴
3.9.2 채널
3.9.3 Select
요약
4장 클라우드 네이티브 패턴
4.1 Context 패키지
4.1.1 Context가 하는 일
4.1.2 Context 생성
4.1.3 Context 종료 시점과 타임아웃 정의
4.1.4 요청 범위 값의 정의
4.1.5 Context 사용하기
4.2 이 장의 구성
4.3 안정성 패턴
4.3.1 서킷 브레이커
4.3.2 디바운스
4.3.3 재시도
4.3.4 스로틀
4.3.5 타임아웃
4.4 동시성 패턴
4.4.1 팬인
4.4.2 팬아웃
4.4.3 퓨처
4.4.4 샤딩
요약
5장 클라우드 네이티브 서비스 구축
5.1 서비스를 만들어봅시다
5.1.1 키-값 저장소란?
5.2 요구사항
5.2.1 멱등성이란 무엇이고 왜 중요할까?
5.2.2 궁극적인 목표
5.3 제너레이션 0: 핵심 기능
5.3.1 아주 간단한 API
5.4 제너레이션 1: 모놀리스
5.4.1 net/http 패키지를 이용한 HTTP 서버 구성
5.4.2 gorilla/mux 패키지를 이용한 HTTP 서버 구성
5.4.3 RESTful 서비스 만들기
5.4.4 동시성 이슈로부터 안전한 데이터 구조 만들기
5.5 제너레이션 2: 리소스 상태 유지
5.5.1 트랜잭션 로그란 무엇일까?
5.5.2 트랜잭션 로그 파일에 상태 저장하기
5.5.3 외부 데이터베이스에 상태 저장하기
5.6 제너레이션 3: 전송 계층 보안 구현
5.6.1 전송 계층 보안
5.6.2 사설키와 인증서 파일
5.6.3 웹 서비스를 HTTPS로 보호하기
5.6.4 전송 계층 요약
5.7 키-값 저장소의 컨테이너화
5.7.1 생초보를 위한 도커 기초
5.7.2 키-값 저장소 컨테이너 만들기
5.7.3 컨테이너 데이터의 외부화
요약
Part 3 클라우드 네이티브 특징
6장 신인성
6.1 클라우드 네이티브의 핵심은 무엇인가?
6.2 가장 중요한 것은 신인성이다
6.3 신인성은 무엇이고 왜 중요한가?
6.3.1 신인성: 더 이상 운영만을 위한 것이 아니다
6.4 신인성 확보
6.4.1 결함 예방
6.4.2 결함 감내
6.4.3 결함 제거
6.4.4 결함 예측
6.5 The Twelve-Factor App과의 지속적인 관련성
6.5.1 코드베이스
6.5.2 의존성
6.5.3 설정
6.5.4 백엔드 서비스
6.5.5 빌드, 릴리즈, 실행
6.5.6 프로세스
6.5.7 데이터 격리
6.5.8 확장성
6.5.9 폐기 가능성
6.5.10 개발/프로덕션 환경 일치
6.5.11 로그
6.5.12 관리 프로세스
요약
7장 확장성
7.1 확장성이란 무엇일까?
7.1.1 다양한 형태의 확장
7.2 4가지 대표적인 병목
7.3 스테이트와 스테이트리스
7.3.1 애플리케이션 스테이트와 리소스 스테이트의 차이
7.3.2 스테이트리스의 장점
7.4 지연된 확장: 효율성
7.4.1 LRU 캐시를 이용한 효율적 캐싱
7.4.2 효율적인 동기화
7.4.3 메모리 릭
7.4.4 효율성이란
7.5 서비스 아키텍처
7.5.1 모놀리스 시스템 아키텍처
7.5.2 마이크로서비스 시스템 아키텍처
7.5.3 서버리스 아키텍처
요약
8장 느슨한 결합
8.1 강한 결합
8.1.1 강한 결합의 다양한 형태
8.2 서비스 간의 통신
8.3 요청-응답 메시징
8.3.1 일반적인 요청-응답 구현
8.3.2 net/http 패키지를 이용한 HTTP 요청 발행
8.3.3 gRPC를 이용한 원격 프로시저 호출
8.4 플러그인을 이용한 로컬 리소스의 느슨한 결합
8.4.1 플러그인 패키지를 통한 프로세스 내부 플러그인
8.4.2 RPC를 이용한 해시코프의 Go 플러그인 시스템
8.5 육각형 아키텍처
8.5.1 아키텍처
8.5.2 육각형 서비스 구현
요약
9장 탄력성
9.1 왜 탄력성이 문제인가
9.2 시스템이 실패한다는 의미는 무엇인가?
9.2.1 탄력성을 높이는 여러 가지 방법
9.3 연쇄적인 실패
9.3.1 과부하 방지
9.4 다시 시도하기: 요청 재시도
9.4.1 백오프 알고리즘
9.4.2 서킷 브레이킹
9.4.3 타임아웃
9.4.4 멱등법칙
9.5 서비스 중복성
9.5.1 중복성을 위한 설계
9.5.2 오토스케일링
9.6 건강한 헬스 체크
9.6.1 인스턴스가 ‘건강하다’는 것은 어떤 의미일까?
9.6.2 헬스 체크의 세 가지 타입
9.6.3 페일 오픈
요약
10장 관리 용이성
10.1 관리 용이성은 무엇이고 왜 신경 써야 할까요?
10.2 애플리케이션 설정하기
10.2.1 설정 모범 사례
10.2.2 환경 변수를 이용한 설정
10.2.3 커맨드라인 인자를 이용한 설정
10.2.4 파일을 이용한 설정
10.2.5 Viper: 설정 패키지를 위한 스위스 군용 칼
10.3 피처 플래그를 이용한 기능 관리
10.3.1 기능 플래그의 진화
10.3.2 제너레이션 0: 초기 구현
10.3.3 제너레이션 1: 하드코딩된 피처 플래그
10.3.4 제너레이션 2: 설정할 수 있는 플래그
10.3.5 제너레이션 3: 동적인 피처 플래그
요약
11장 관찰 가능성
11.1 관찰 가능성이란 무엇인가?
11.1.1 관찰 가능성은 왜 필요한가?
11.1.2 관찰 가능성은 ‘전통적인’ 모니터링과 어떻게 다른가?
11.2 관찰 가능성의 세 가지 기둥
11.3 OpenTelemetry
11.3.1 OpenTelemetry 컴포넌트
11.4 트레이싱
11.4.1 트레이싱의 개념
11.4.2 OpenTelemetry를 이용한 트레이싱
11.4.3 모두 하나로 합치기: 트레이싱
11.5 지표
11.5.1 푸시, 풀 방식의 지표 수집 비교
11.5.2 OpenTelemetry의 지표
11.5.3 모두 하나로 합치기: 지표
11.6 로깅
11.6.1 로깅 모범 사례
11.6.2 Go 표준 로그 패키지를 이용한 로깅
11.6.3 Zap 로깅 패키지
요약
Author
매튜 A. 티트무스,노승헌
분자 생물학 학위를 취득한 경험이 있는 소프트웨어 개발 업계의 전문가입니다. 클라우드 네이티브 기술과 Go 프로그래밍 언어의 얼리 어답터이자 옹호자이며, 프로덕션 품질 시스템 구축에 필요한 사항에 관해 열정적인 관심이 있습니다. 분산 시스템을 관찰하고 조정하는 전략을 구현하는 데 많은 시간을 보내는 중입니다.
분자 생물학 학위를 취득한 경험이 있는 소프트웨어 개발 업계의 전문가입니다. 클라우드 네이티브 기술과 Go 프로그래밍 언어의 얼리 어답터이자 옹호자이며, 프로덕션 품질 시스템 구축에 필요한 사항에 관해 열정적인 관심이 있습니다. 분산 시스템을 관찰하고 조정하는 전략을 구현하는 데 많은 시간을 보내는 중입니다.