MSA - Docker Swarm (10) 썸네일형 리스트형 [Go MSA with Docker Swarm] 11-Hystrix&Resilience 이번 블로그 포스트에서는, 서비스간 통신이 이뤄질 때 통신이 좀 더 resilient하도록 circuit breaker 패턴을 사용해보겠습니다 Overview 아래 그림과 같은 아키텍처를 한번 생각해보죠 서비스 Y에서 장애가 발생하면 무슨 일이 일어날까요? 예를 들어 서비스 Y가 request들을 계속해서 받지만 response를 주지 않고 계속 기다린다고 합시다. 해당 서비스의 클라이언트 (service N, service A)들은 결국 타임아웃으로 처리 할 것입니다. 그런데 당신의 서비스가 일 초에 100~1000개의 요청을 처리하는 시스템이라면 thread pool이 계속 꽉차게 될것이고, 메모리 사용량이 엄청나게 올라갈 것입니다 + end 클라이언트들은 계속 기다릴 것이고요. 마이크로서비스에서는 .. [Go MSA with Docker Swarm] 09-AMQP 이번 블로그 포스트에서는 go microservice간 RabbitMQ을 사용하여 AMQP 기반 통신을 해보겠습니다. Intro MSA는 애플리케이션의 비즈니스 도메인들을 bounded context기준으로 나누고 서로의 도메인들이 다른 도메인들에게 의존하지 않게 구성합니다. 이방식은 ACID와 달리 데이터들이 eventual consistency합니다. MSA에서 서비스들이 loosely coupled 구성되게 위해 서비스 들간의 통신을 http같은 strict request/response 방식 대신 message queue를 이용하는 방법입니다. 이번 블로그에서는 우리의 "accountservice"가 RabbitMQ를 통해 새로운 서비스로 통신하는 방법을 실습해보겠습니다. 메시지 전송 아주 심플한.. [Go MSA with Docker Swarm] 08-Centralized Config 이번에는 Go Microservice 설정 부분들을 Spring Cloud Config를 사용해 구성해보겠습니다. Intro 마이크로서비스 아키텍처를 가져가는 것 자체가 시스템을 자기 역할만 하는 서비스들로 나누느 것인데 어떤 것을 중심화하는 것이 좀 이상하게 보일 수 있습니다. 그런데 우리가 나누고자 하는 것은 사실 프로세스 및 로직들입니다. 다른 부분들은 centralized하게 가져갈 수 있지 않을까요? 예를들어, 로그들은 elk stack에 기록이 되어야 하거나, 모니터링 등이 있습니다. 사실 컨테이너들과 노드들이 계속 없어지고 생성되는 마이크로서비스 아키텍처에서 각각의 서비스들이 자신만의 설정들을 가지게 하는 것도 또한 골치거리가 될 것입니다. Centralized Configuration을 제.. [Go MSA with Docker Swarm] 07-ServiceDiscovery&LoadBalancing 이번 블로그 시리즈에서는 마이크로서비스 아키텍처에서 핵심 요소들인 service discovery와 load balancing에 대해서 다뤄보겠습니다. Intro 로드 밸런싱은 잘 알려진 주제에 반해 서비스 디스커버리에 대해서는 설명이 필요하다고 생각합니다. "서비스 A가 서비스 B의 위치에 대한 아무 정보가 없다면 어떻게 서비스 B와 통신할 수 있을까요" 다른 말로 10개의 서비스 B 인스턴스가 여러 노드위에서 실행되고 있다고 하면 누군가 이 모든 정보들을 가지고 있어야하지 않을까요? 서비스 B의 IP 주소 또는 호스트 이름이 서비스 A에게 제공되어야지 않을까요? (client-side load balancing) 또는 서비스 A가 해당 정보들을 알고있는 제 3자에게 정보를 물어봐야하지 않을까요? (s.. [Go MSA with Docker Swarm] 06-Healthcheck 마이크로서비스가 더 커지고 복잡해짐에 따라 각 서비스가 Docker Swarm에게 자신이 healthy함을 알려야합니다. 이번 파트에서는 마이크로서비스에 health check을 등록해보겠습니다. 우리의 accountservice 마이크로서비스는 HTTP 통신 데이터베이스 연결 이 되지 않는다면 사실 무용지물입니다 이런 경우가 발생시 자신의 연결상태를 알리기 위해 healthcheck endpoint를 제공하는 방법이 있습니다. 우리의 마이크로서비스들은 http 기반이기 때문에 /health 엔드포인트를 제공하여 문제가 없다면 200 StatusCode를 문제가 있다면 에러 StatusCode를 에러 메시지와 함께 반환하도록 하는 방법입니다. /dbclient/boltclient.go 데이터베이스 연결을.. [Go MSA with Docker Swarm] 05-Docker_Swarm Part5에서는 로컬 환경에서 Docker Swarm cluster을 배포하여 account-service를 실행시키겠습니다. 이번 파트에서는 Docker Swarm & Container Orchestration Docker로 accountservice를 컨테이너화 로컬 Docker Swarm Cluster 세팅 accountservice를 swarm service로 배포 내용을 다루겠습니다. What is Container Orchestration? 애플리케이션이 더 복잡해지고 트래픽이 많아지면 아마 우리는 몇 백대의 서비스 instances들을 다루는 문제에 직면할 것입니다. Container Orchestration은 사용자가 이 서비스 instance들이 실행되고 있는 hardware 혹은 vm을.. [Go MSA with Docker Swarm] 03-Embdded_DB Part3에서는 Accountservice가 더 실용성 있게 만들겠습니다 Accout Domain 정의 Key-Value 저장공간 임베딩 /accounts/:accountId PATH로 오는 HTTP 요청에 대한 json 반환 Account 도메인 정의 - /model/account.go package model type Account struct { Id string `json:"id"` Name string `json:"name"` } Key-Value 저장소 go get github.com/boltdb/bolt /dbclient/boltclient.go package dbclient import ( "encoding/json" "fmt" "github.com/boltdb/bolt" "github.c.. [Go MSA with Docker Swarm] 02-First Go Microservice Part 2에서는 Go Workspace 구축 첫번째 Microservice 개발 : HTTP 서버 Introduction HTTP 기반하여 JSON으로 통신하는 방법이 서비스 간의 유일한 방식은 아니지만 이 블로그 시리즈에서는 HTTP와 JSON을 사용하겠습니다. 사실 많은 유용한 프레임워크 (security, tracing)들은 HTTP 헤더에 의존합니다. grpc같은 다른 방법들도 존재하지만 구현에 집중하기 위해 HTTP로 진행하겠습니다. Go Workspace 구축 mkdir $GOPATH/src/github.com/callistaenterprise cd $GOPATH/src/github.com/callistaenterprise mkdir -p goblog/accountservice cd gobl.. [Go MSA with Docker Swarm] 01-Intro 이 블로그 시리즈에서는 Microservices들을 Go로 작성하며 이 Microservices들을 Docker Swarm과 Spring Cloud / Netflix OSS 환경에서 실행하는 것을 목표로 합니다. Landscape Overview 점선 박스 : 논리적인 Docker Swarm cluster입니다. 하나 또는 여러가지 노드가 될수 있습니다. 파란 박스 : 3rd Party 서비스들입니다. ex ) Spring Cloud , RabbitMQ 연갈색 박스 : 마이크로서비스 Why Microservices in Go? 왜 다른 언어대신 Go를 사용했을까요? 생산성과 재미를 떠나 Go 프로그램들이 차지하는 메모리가 제일 큰 이유입니다. 아래 사진을 보고 Spring boot + Spring Clo.. [Go MSA with Docker Swarm] 00-시작 https://callistaenterprise.se/blogg/teknik/2017/02/17/go-blog-series-part1 2017년에 작성된 Go + Docker Swarm으로 작성한 마이크로서비스 블로그 시리즈를 개인 공부용으로 번역 및 정리하겠습니다. Architecture Overview 이전 1 다음