https://yummy0102.tistory.com/370
Spring Framework
- EJB의 복잡성에 대한 대안으로 갭랃되어 두각을 나타냄
- 2004년에 버전 1.0 공개
- DI와 XML 기반 설정으로 POJO를 그대로 사용할 수 있다
- Spring을 걷어내도 Object를 그대로 사용할 수 있다
- 현재는 Annotaion이 중심이다
- 복잡한 설정
- 컴포넌트 스캔, 디스패쳐 서블릿, 뷰 리졸버, 웹 jar 들 설정
- 대안으로 Modern Framework 들이 등장하였다
- Convention Over Configuration
- 복잡한 설정보다는 규약이나 관례 등의 약속들로 어플리케이션을 구성
- Ruby On Rails
- Python Django
Spring Boot
- Spring에서도 Modern Framework의 장점을 받아들이고, MSA에 최적화된 환경을 개발한 것이 Spring Boot이다
- Auto Configuration
- Spring Boot Starter Projects
- Embedded Server Intergration
- Acutator
1. Auto Configuration
- 특정 jar가 class path 안에 있을 경우 해당 설정을 자동화
- Spring MVC jar가 class path 안에 있으면 Dispathcer Servlet을 자동으로 구성한다
- Convention Over Configuration
- 특정 폴더에 넣으면 자동으로 인식 - template, static
- 정해진 이름대로 파일을 만들면 자동으로 인식 - application.yml, application-dev.yml
- @SpringBootApplication
- @EnableAutoConfiguration + @ComponentScan + @Configuration
2. Spring Boot Starter Projects
- 자주 사용하는 의존성을 패키지화하여 제공한다
- 매번 수십개의 의존성을 추가하지 않아도 1개만 등록하면 관련된 모든 의존성이 추가된다
- ex) Spring Boot Stater Web
- 다양한 Starter Project들이 존재한다
3. Embedded Server Intergration
- Embedded Server로 독립으로 실행할 수 있는 웹 서비스 구성이 가능하다
- Default는 Tomcat Server이지만 변경이 가능하다
- Jetty, Undertow...
- 웹 서비스를 구성하고 배포하는 작업을 최소화할 수 있다
- Production에서 사용이 가능하다
4. Actuator
Actuator를 사용한 모니터링 화면
- 따로 모니터링 환경을 구성하지 않고 기본적인 지표 확인이 가능하다
- 운영중인 애플리케이션의 healthm metrics 등을 확인이 가능하다
- REST API로 쉽게 확인할 수 있다
- Spring 앱과 연동되어 있는 DB 등과 같은 미들웨어의 상황도 파악이 가능하다
Spring Cloud
- MSA에 최적화된 개발을 위하여 Spring 진영에서 제공하는 오픈소스
- 분산 환경에서 적용될 수 있는 다양한 아키텍처 패턴들을 구현함
- 설정 정보 관리
- 서비스 디스커버리
- 회로 차단기 등..
- 기존 Spring Application 들과 쉽게 통합이 가능하다
- 다양한 프로젝트들을 제공한다
- Maven 의존성 추가 및 어노테이션 추가만으로 구성이 가능하다
- 코드 작성이 거의 없이 대부분의 기능 구성이 가능함
Spring Cloud와 Netflix OSS
- Netflix OSS는 Netflix에서 MSA를 운영하며 쌓아온 노하우들을 오픈소스로 공개한 것이다
- 그 중 일부를 Spring Cloud와 통합하여 Spring Cloud Netflix 프로젝트로 제공한다
- 보다 쉽게 Spring app과 통합될 수 있는 환경을 제공한다
주요 Spring Cloud Projects
- Spring Cloud Config
- Spring Cloud Netflix Eureka
- Spring Cloud Netflix Hystrix
- Spring Cloud Netflix Zuul
- Spring Cloud Stream
- Spring Cloud Sleuth
Spring Cloud Netflix Eureka
- Service Discovery Pattern을 위한 프로젝트
- Eureka Server와 Eureka Client로 구성됨
- 동작 과정
- 그림에서 각각의 MSA들이 Eureka Client가 된다
- 각각의 서비스들이 인스턴스가 만들어질 때 Eureka Server로 자신들의 등록 정보를 보낸다
- ex) 서비스 이름, IP, 등록 정도 등..
- 한 서비스가 다른 서비스를 호출할 때 서비스의 IP를 정적으로 호출하는 것이 아니라, Eureka Server에 등록된 정보를 조회하여 서비스를 호출하게 된다
Spring Cloud Config
- 설정 외부화를 위한 프로젝트
- 설정 정보를 저장하고, 정보들을 Serving하는 Server로 구축한다
- 각 클라이언트는 설정 정보로부터 설정 정보를 조회한다
- 실제 Spring Servce에서는 Config Server의 정보 외에는 다른 설정이 거의 없는 수준으로 만들어진다
Spring Cloud Netflix Hystrix
- Hystrix 프로젝트는 굉장히 많이 사용되는 프로젝트이다
- 앞의 스프링 프로젝트들은 도입하기에 무거운 부분이 있다
- Hystrix 프로젝트는 기존의 레거시 프로젝트에도 도입해서 사용이 가능하기 때문에 많이 사용된다
- 한 서비스의 장애가 다른 서비스로 전파되지 않도록 사전에 차단하는 것이 Hystrix 프로젝트의 목표이다
- 특정 서비스의 호출이 일정 수준 이상으로 실패할 경우 호출을 차단한다
- MSA 서비스 사이에 Circuit Breaker(회로 차단기)가 들어가 있다
- 한 서비스에서 다른 서비스를 호출하면 Circuit Breaker가 호출을 가로챈다
- Circuit Breaker가 중간에서 호출 정보들을 모두 관리한다
- 어떠한 호출이 특정 임계값 이상으로 문제가 있다고 판단되면 호출이 들어가지 않도록 막아버린다
- 즉, 장애가 전파되지 않도록 사전에 차단하게 된다
Spring Cloud Netflix Zuul
- Zuul은 Microservices 앞 단에 위치하는 API Gateway이다
- Zuul이 클라이언트의 호출을 받아 뒷 단의 Microservices에게 호출을 전달한다
- 모든 Service들이 처리해야 하는 공통 코드(인증, 로그인 등)를 처리한다
Spring Cloud Stream
- MSA에서는 서비스 간의 결합도를 낮출 수 있는 Event driven 아키텍처를 강력히 권장한다
- Stream은 Event driven MSA를 구축하기 위한 프로젝트이다
- 다양한 Message Platform을 동일한 인터페이스로 연동할 수 있도록 추상화한 프로젝트이다
- RabbitMQ, Kafka, AWS Kinesis, GCP PubSub 등을 거의 코드를 변경하지 않고. 즉 핵심 비즈니스 로직을 거의 변경하지 않고 의존성과 설정만의 변경으로 쉽게 연동할 수 있다
- Hexagonal Architecture를 만족하는 프로젝트이다
- 각각의 서비스들이 message platform과 연동하는데 핵심 비즈니스 로직들이 크게 변경되지 않도록 추상화된 레이어를 제공하는 것이 목적이다
Spring Cloud의 한계
- Spring Cloud는 많은 장점이 있다
- 구현하기 어려운 기술들을 쉽게 사용할 수 있게 제공한다
- Spring Project들과 용이하게 통합이 가능하다
- 그러나 Spring Cloud도 한계는 존재한다
- Java로 만들어진 스프링 프로젝트만 주로 사용이 가능하다
- Sidecar 프로젝트를 사용하면 이종 기술로 만들어진 프로젝트도 연계가 가능하다
- 하지만 이 또한 한계가 존재한다
- MSA는 각각의 서비스들이 목적별로 적합한 기술을 도입할 수 있게 하는 Polyglot Architecture를 권장하지만, 이게 어려워진다는 단점이 있다
- 대안으로 Kubernetes, Istio 등의 조합으로 사용이 가능하게 할 수 있다
'MSA' 카테고리의 다른 글
ORM의 개념, JPA와 MyBatis 차이 (0) | 2023.04.02 |
---|---|
[Spring Boot #6] 스프링 부트 내장 웹 서버 톰캣(tomcat) 설정 (0) | 2023.04.02 |
[스프링부트 (2)] SpringMVC(1) Controller 생성하기 (0) | 2023.04.01 |
spring Eureka 구축방법 (0) | 2023.03.30 |
[Spring Cloud] Eureka 개념 및 예제 (0) | 2023.03.30 |
댓글