티스토리 뷰

728x90

클라우드 기반의 마이크로서비스는 확장성을 중요시하는 현 시대에서 거를 수 없는 흐름이다. 대부분의 시스템은 Monolith라고 말하는 한 덩어리의 시스템으로 구축하는 것으로 충분하겠지만 확장의 한계를 알 수 없는 스타트업이나 대규모 시스템에서는 마이크로서비스로 구축하는 것이 권장된다.

 

이 글을 써보려는 이유는 2년 정도 전에 만들어 둔 기반 코드를 최신 라이브러리로 업데이트 하는 것도 있고, 검색을 많이 해보지는 않았지만, 우리말로 기본적인 Microserivce 구조를 생성하고 그 코드에 대한 설명을 해놓은 포스트를 거의 보지 못했단든 점 때문이다. 2년 정도가 지나도 여전히 찾기 힘들어보인다.

 

마이크로서비스를 만드는 것은 보기에는 단순해 보이지만 굉장히 많은 부분에서 고민할 부분들이 있다.

간단하게 생각해 봐도 특정한 서비스가 죽어도 다른 서비스는 영향을 받지 않아야 하는 것이나 여러 개의 마이크로서비스 간에 걸친 트랜적션처리 하는 상황을 생각해 보면 얼핏 생각해봐도 해결하기 쉽지가 않다. 이런 문제를 해결하기 위해서 이벤트 브로커, Hystrix Circuit Breaker, SAGA 같은 새로운 이름의 기법들이 줄줄이 도입되어 마이크로서비스 학습 접근성을 떨어뜨리는 요소가 된다. 그래도 그 나마 스프링 생태는 다른 오픈 소스의 Kubernates 기반의 오케스트레이션에 비해서 단순한 편이고 편의성도 높은 편이라 이런 문제에 대한 코딩이 단순한 편이다.

 

난도가 높지만, 가장 범용적인 Kubernates로 오픈 마이크로서비스 플랫폼으로 비스한 내용을 정리해 보고 싶긴한데, 너무 내용이 많을 것 같아 엄두가 나지 않는다. 어렵다기 보다는 이벤트 브로커를 도입하는 게 더 복잡한 경우가 있어 직접 코딩해야 하는 경우가 더 간략하지만 코딩량은 많아져서 정리하기 힘들다는 의미다.

 

* 이 시리즈에 작성할 내용

어느 시스템이든 구조는 모두 비슷하다. 처음에 시작하는 코드는 한번 잘 만들어 놓으면 다시 처음부터 구현할 필요가 없다. 이번 기회에 한번 정리하면서 앞으로 수년을 사용할만한 기반 코드를 작성하면 좋을 것 같아서 여기에 기록해 놓는다. 솔직히 기본 소스를 만드는 건 며칠이면 충분하지만 살을 붙이고 이걸 기록하는 게 더 힘든 부분인 것 같다. 어차피 시간이 지난 후 나는 지금의 내가 아니다. 기록만이 흔적이 된다.

 

프로그램을  Visual Studio Code와 STS로 각각 작성해 보았는데, 스프링 마이크로서비스는 STS로 개발하는 게 훨씬 생산성이 높다. 그래서 오랜만에 STS를 사용했다. 빌드 툴은 gradle 언어는 groovy로 작성했다. 반복적인 부분은 lombok과 ModelMapper로 코딩을 최소화 했다. 작업은 도커를 사용하지 않았다. OS는 리눅스기반은 우분투이다.

Messaing framework를 사용할지는 모르겠다. 실제 이벤트 브로커를 기능상 구현하는 것이 어렵지는 않기 때문에 node.js express 기반 코딩처럼 하는 것이 데모를 위해서 더 나을 수는 있는데 실제 서비스에서는 axon 같은 프레임워크가 더 관리가 용의하다. 믿거나 말거나 물론 나는 기관에서 일해서 상용 클라우드를 실제 서비스로 사용한 적은 없다.

 

기본적으로 Rest API 형식의 서비스, 가장 간단한 형식의 가입, 로그인 기능은 Spring Security와 JWT를 이용한 인증으로 구현, 데이터베이스 기술은 JPA를 사용한다. 보안 url의 JWT 검증은 gateway에서 AbstractGatewayFilterFactory를 상속하여 reactive로 작성한다. 예시용 코드이기 때문에 마이크로 서비스로 메모나 파일관리 같이 단순한 것을 붙이면 좋을 것 같다. 

 

Discovery - Eureka Discovery Server - 대시보드 로그인 설정 적용

Gateway, load blancer - Spring Cloud API Gateway Server, - JWT검증은 Gateway에서, 권한 확인은 Microservice에서 한다.

Centeralized Config - Spring Cloud Config Server

Cloud Bus - Config의 동적 설정을 위해서 amqp에 포함된 RabbitMQ를 사용한다. Config 저장용으로는 git의 private repository

Config 내용은 Java Cryptograph Extension(자바 9부터는 기본적용)을 사용하여 대칭키 방식으로 암호화 적용한다.

Tracing - Spring Cloud Sleuth와 Zipkin을 사용 - 단순한 web 설정을 사용한다.

Client Service - 마이크로서비스간 통신을 위해서 Open Feign client, Feign ErrorDecoder를 사용한다.

Circuit Breaker - Netflix Hystrix. 캐시 서버까지 가지는 않고, 장애 시 fallback을 실행하는 수준으로만 작성할 것 같다.

통합로깅 - Logstash, ElasticSearch, Kibana

데이터베이스는 MySQL 기반한다.

AWS EC2에 도커로 deploy하는 것도 기록하면 좋긴한데 실제로 올려볼지 로컬에서 도커라이징할지는...

728x90
댓글