분류 전체보기 1341

Reactive Streams

FRP(Functional Reactive Programming) Reactive Programing : 함수형 프로그래밍 Reactive : 외부에 이벤트가 발생하면, 거기에 대응하는 방식으로 코드를 작성하는 것 ReactiveX : 외부에서 이벤트가 발생하면 이를 반응하는 프로그래밍(즉, 이벤트 위주의 프로그래밍) 나오게 된 배경 Duality = 상대성 Observer Pattern = 디자인 패턴, 옵져버와 리스너를 통해 이벤트를 동작 Reactive Stream = Reactive 프로그래밍의 표준, JAVA9의 API로 들어가있다. Collection의 Iterator public static void main(String[] args) { //List list = Arrays.asList(1..

Pod 소개

컨테이너의 공동 배포된 그룹이며 쿠버네티스의 기본 빌딩 블록을 대표 쿠버네티스는 컨테이너를 개별적으로 배포하지 않고 컨테이너의 파드를 항상 배포하고 운영 일반적으로 파드는 단일 컨테이너만 포함하지만 다수의 컨테이너를 포함 할 수 있음 파드는 다수의 노드에 생성되지 않고 단일 노드에서만 실행 여러 프로세스를 실행하기 위해서는 컨테이너 당 단일 프로세스가 적합 다수의 프로세스를 제어하려면? → 다수의 컨테이너를 다룰 수 있는 그룹이 필요! Pod 관리 두 가지 장점 파드는 밀접하게 연관된 프로세스를 함께 실행하고 마치 하나의 환경에서 동작하는 것처럼 보임 그러나 동일한 환경을 제공하면서 다소 격리된 상태로 유지 동일한 파드의 컨테이너 사이의 부분 격리 파드의 모든 컨테이너는 동일한 네트워크 및 UTS 네임스..

미니큐브 설치와 소개

미니 큐브 : 무거운 쿠버네티스 대신 가볍게 테스트 가능하게 한 가상 환경 https://blog.naver.com/isc0304/221879359568 Minikube 설치 및 사용 방법 이번 시간은 빠르게 설치할 수 있는 경량화된 쿠버네티스인 Minikube를 설치하고 사용하는 방법에 대해 다... blog.naver.com 1) 도커 설치하기 sudo apt install docker.io -y #도커 설치 sudo usermod -aG docker $USER && newgrp docker #도커를 일반 유저도 사용할 수 있도록 docker의 권한을 수정 docker ps -a # 도커 명령어 실행해보기 2) 미니큐브 다운로드 및 설치 https://minikube.sigs.k8s.io/docs/s..

쿠버네티스 애플리케이션과 서비스 동작 구조와 HTTP 서버 스케일링

실행 중인 파드는 클러스터의 가상 네트워크에 포함돼 있음 어떻게 액세스 할 수 있을까? 외부에서 액세스하려면 서비스 객체를 통해 IP를 노출하는 것이 필요 LoadBalancer라는 서비스를 작성하면 외부 로드 밸런서가 생성 로드 밸런서의 공인 IP를 통해 파드에 연결 가능 (하지만 로컬 쿠버네티스에서는 동작하지 않으며 externalDNS가 필요함, 이 기능은 GKE, EKS 같은 클라우드에서 사용 가능(구글, AWS 계정 필요)) kubectl expose deployment http-go --type=LoadBalancer --name http-go-svc --port=8080 --target-port=8080 #외부에서 접근 가능하도록 서비스를 생성 kubectl get services # 서비스..

Go 언어로 작성한 컨테이너 쿠버네티스에 올리기

보통 배포하려는 모든 컴포넌트의 설명이 기술된 JSON 또는 YAML 매니페스트를 준비 필요 이를 위해서는 쿠버 네티스에서 사용되는 컴포넌트 유형을 잘 알아야 함 여기서는 명령어에 몇 가지 옵션으로 디스크립션을 간단히 전달하여 한 줄로 앱을 실행 kubectl create deploy http-go --image=gasbugs/http-go 파드(pod)란? 쿠버네티스는 kubectl get container와 같이 컨테이너를 취급하지 않는다! 대신 여러 위치에 배치된 컨테이너 개념인 컨테이너 그룹을 파드(Pod)라는 개념을 사용 여러 개의 컨테이너가 하나의 네트워크를 공유한다. 파드의 특징 파드는 하나 이상의 밀접하게 관련된 컨테이너로 구성된 그룹 동일한 리눅스 네임스페이스와 동일한 워커 노드에서 항상..

쿠버네티스에서 실행할 GO언어 컨테이너 작성

1) vim main.go package main import ( "fmt" "github.com/julienschmidt/httprouter" "net/http" "log" "os" ) func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { hostname, err := os.Hostname() if err == nil { fmt.Fprint(w, "Welcome! " + hostname +"\n") } else { fmt.Fprint(w, "Welcome! ERROR\n") } } func main() { router := httprouter.New() router.GET("/", Index) log.Fatal(http.Li..

AWS EKS를 활용한 쿠버네티스 사용

AWS EKS AWS에서 Kubernetes를 손쉽게 실행하도록 하는 관리형 서비스 여러 가용 영역에서 Kubernetes 제어 플레인 인스턴스를 실행하여 고가용성을 보장 비정상 제어 플레인 인스턴스를 자동으로 감지하고 교체 자동화된 버전 업그레이드를 제공 여러 AWS 서비스와 통합되어 다음을 포함한 애플리케이션에 대한 확장성과 보안을 제공 컨테이너 이미지용 Amazon ECR 로드 배포용 Elastic Load Balancing 인증용 IAM 격리용 Amazon VPC AWS EKS 시작하기 https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/getting-started.html Amazon EKS 시작하기 - Amazon EKS 이 페이지에 작업이 필요하..

Ch11. 스프링 트랜잭션 전파(활용) - 복구 REQUIRES_NEW

회원 가입을 시도한 로그를 남기는데 실패하더라도 회원 가입은 유지되어야 한다. 이 요구사항을 만족하기 위해서 로그와 관련된 물리 트랜잭션을 별도로 분리해보자. 바로 REQUIRES_NEW를 사용하는 것이다 /** * memberService @Transactional:ON * memberRepository @Transactional:ON * logRepository @Transactional:ON(REQUIRED_NEW) Exception */ @Test public void recoverException_success() { //given String username = "로그예외_recoverException_success"; //when memberService.joinV2(username); //..

Ch11. 스프링 트랜잭션 전파(활용) - 복구 REQUIRED

앞서 회원과 로그를 하나의 트랜잭션으로 묶어서 데이터 정합성 문제를 깔끔하게 해결했다. 그런데 회원 이력 로그를 DB에 남기는 작업에 가끔 문제가 발생해서 회원 가입 자체가 안 되는 경우가 가끔 발생하게 되었다. 그래서 사용자들이 회원 가입에 실패해서 이탈하는 문제가 발생하기 시작했다. 회원 이력 로그의 경우 여러가지 방법으로 추후에 복구가 가능할 것으로 보인다. 그래서 비즈니스 요구사항이 변경되었다. 회원 가입을 시도한 로그를 남기는데 실패하더라도 회원 가입은 유지되어야 한다. 단순하게 생각해보면 LogRepository 에서 예외가 발생하면 그것을 MemberService에서 예외를 잡아서 처리하면 될 것 같다. 이렇게 하면 MemberService 에서 정상 흐름으로 바꿀 수 있기 때문에 Membe..

Ch11. 스프링 트랜잭션 전파(활용) - 전파 롤백

/** * memberService @Transactional:ON * memberRepository @Transactional:ON * logRepository @Transactional:ON Exception */ @Test public void outerTxOn_fail() { //given String username = "로그예외_outerTxOn_fail"; //when assertThatThrownBy(() -> memberService.joinV1(username)) .isInstanceOf(RuntimeException.class); ; //then : 모든 데이터가 롤백된다. assertTrue(memberRepository.find(username).isEmpty()); assertT..