본문 바로가기

반응형

백엔드 개발

(30)
일체형 아키텍처(monolithic architecture) 분리하기(Hystrix 도입기) - 2 일체형 아키텍처 분리하기(Hystrix 도입기) - 2 Circuit breaker(Hystrix) 도입기 개인 프로젝트를 MSA로 변환하면서 의존성을 가지는 컴포넌트에 대해서 Hystrix라는 라이브러리로 Circuit breaker patten을 적용했다. 그런데 필자가 이 패턴에 대해서 이해가 낮아서 시행착오를 겪었다. 그 과정을 이 글에서 소개해보고자 한다. Hystrix와의 잘못된 만남 처음 histrix를 유저 로그 기록하는 서버에 도입했다. 유저가 특정 컨텐츠를 검색하면 accessToken과 검색 조건을 유저 로그 서버가 받아서 accessToken은 인증 서버로 보내서 인증 후 User Id를 응답받는 부분이 있었기 때문이다. Hystrix의 존재를 알고 있고 Spring에 도입하는 설정..
일체형 아키텍처(monolithic architecture) 분리하기 - 1 일체형 아키텍처(monolithic architecture) 분리하기 - 1 세 가지 형태의 서버 구조 개인프로젝트에서 사용자 로그를 저장하고 조회하는 기능을 기존의 리소스 서버에서 분리했다. 수정 이전의 리소스 서버는 아동 컨텐츠 검색 기능과 사용자의 컨텐츠 조회 사항을 기록하고 메인페이지에 최근에 조회한 컨텐츠를 제공하는 역할을 함께 해주었다. 이번에 사용자의 검색 조건을 사용자 로그로 저장을 하는 기능을 추가하면서 리소스 서버에서 유저 로그와 관련된기능을 분리했다. 이번 글에서는 세가지 서버의 구조를 볼 것이다. 관계형 데이터베이스에서 모든 기능을 처리하는 일체형 아키텍처 사용자 로그용 저장소를 추가한 일체형 아키텍처 사용자 로그만을 다루는 마이크로서비스 아키텍처 점점 개선되는 구조를 보면서 마이크..
[spring cloud] hystrix 도입하면서 alpine linux에서 jvm error 발생 저번에 t아카데미에서 MSA에 관한 세미나에 참석하고 이번에 클라우드 네이티브 자바라는 책을 접하면서(완독은 못하고 일부 읽었다.)퍼블릭 클라우드 서비스를 사용하고 컨테이너 기술을 사용하고 있다면 내가 공부한 내용을 실천해야겠다고 생각했다. OOP의 단일책임원칙처럼 애플리케이션이 가급적 하나의 목적(하나의 도메인이라고 표현해야할지도 모르겠다...)을 가지고 기능하도록 서비스 컴포넌트로 분리하고자 했다. 스토리지를 서비스 컴포넌트마다 하나씩 두고 각 서비스 컴포넌트가 단일 인터페이스로 통신하는 형식으로 바꿔야 겠다는 생각을 했다.사용자 로그를 현재 하나의 컨텐츠를 조회할 때만 기록하는데 사용자가 검색할 때 무엇을 검색했는지 기록에 남기는 요구사항이 있었다. Firestore를 저장소로 사용하고 로직을 작성..
[ssl] aws에 docker와 letsencrypt(certbot) 이용해서 ssl 인증 적용하기 1. ssl를 적용할 수 밖에 없던 과정 수개월째 백수로 지내면서 개인프로젝트를 하고 있다. 개인프로젝트에 ssl을 도입할 수 밖에 없는 이유가 두가지 있었다. 첫째, JWT 기반의 로그인을 하고 있다. JWT는 stateless라는 장점이 있어서 애플리케이션을 확장할 떄 좋지만 보안에 있어서 취약하다. 왜냐하면 사용자 정보가 일부분 들어갈 수도 있고 단순히 해쉬 알고리즘만 안다면 정보를 알 수 있기 때문이다. 그래서 ssl 인증은 필수다. 두번째, 페이스북 로그인 때문이다. 페이스북 로그인을 도입했는데 개발단계에서 localhost를 사용하는 것은 허용되지만 사용에서 https를 사용하지 않는 도메인은 허용하지 않는다. 2. 사전 조사 ssl은 전 회사에서 aws에서 제공해주는 ssl을 이용해서 도입했..
[docker swarm] worker node를 새로 생성했을 열어줘야하는 포트 1. 기존의 컨테이너간 통신 방법(db와 redis와 연결) docker swarm으로 container를 띄우는 공부를 하고 있다.swarm mode에서는 컨테이너를 replicas 옵션을 줘야 다중으로 띄우는 것이 가능하다.spring boot application을 여러개 띄우고자 할 때 가장 궁금했던 것은 컨테이너간 통신이다. 기존에는 properties.yml의 database url이나 redis url에는 container name을 적어주고 bridge network를 생성해서 rdb, redis와 spring application을 연결해줬었다. 2. swarm mode에서의 컨테이너간 통신 방법(db와 redis와 연결) 그런데 swarm mode에서는 container 이름을 사용자가..
[Jenkins] Jenkins에서 Docker build와 Docker push하기 현재 젠킨스를 git hub와 연동해서 master branch에 push하면 자동으로 빌드하도록 설정했다.빌드는 gradle로 하고 unit test도 함께 진행한다.그리고 빌드의 시작과 끝(성공과 실패 모두)은 slack으로 알람을 받을 수 있다.코드에 대한 build 자동화는 끝난 셈이다.그러나 docker image로 build하고 docker hub에 push하는 작업도 자동화가 필요하다.여기까지만 자동화가 되어도 상당히 편하게 개발을 할 수 있을 것같다. 1. 도커 안에서 도커를 돌리는 방식 소개 젠킨스 이미지에서 docker build와 push를 하기 위해서는 docker image 안에 docker를 설치할 필요가 있다.컨테이너에서 docker를 돌리는 방식을 docker in docke..
[Jenkins] 젠킨스를 도커 컨테이너로 사용할 때 주의할 점 + (어떤 aws instance를 사용할까?) 개인 프로젝트에 빌드 자동화를 하기 위해서 젠킨스를 도입하려고 작업 중이다.생각하고 있는 작업의 흐름은 push(혹은 pull request) -> web hook으로 jenkins에 http 요청 -> 빌드(gradle build) -> 성공시 docker build -> docker push으로 진행된다. 1. 정품 = 좋은 것 = Jenkins Official = 정품 Official이라는 말에 공식 이미지를 pull해서 사용했었다.그런데 처음에 실행하고 필요한 라이브러리를 받을 때 부터 뭔가 이상하다.버전때문에 다운받아지지 않는 라이브러리가 꽤나 많다.Docker Hub repository에 들어가보면 update 날짜가 5달 전이다. 2. simple is best? alpine is best?..
[docker machine] docker machine으로 lightsail instance 제어하기( aka 삽질기) 현재 개인 프로젝트에서 docker container를 aws lightsail에 띄워서 서버 구성을 하고 있다. RDBMS, Redis, application web server(using spring boot), Nginx(Image Storage) 이런식으로 구성되어 있는데.사용하는 컨테이너들이 5개가 되다 보니 변경사항이 생길때 마다 Mobaxterm으로 접속해서 커맨드를 치는게 슬슬 귀찮아졌다.그리고 젠킨스를 이용해서 CI Server를 구축하려고 하는데 Jenkins는 다른 Instance를 띄워서 구성하려고 한다.그러면 내가 관리해야하는 Docker Host가 하나 더 늘어나는 셈이라 관리하기 힘들어 질 것같아서. Docker Host들을 효과적으로 관리할 수 있는 Docker Machine..

반응형