Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 겨울 부산
- pytest
- JanusWebRTCServer
- table not found
- mp4fpsmod
- VARCHAR (1)
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- taint
- PytestPluginManager
- python
- terminal
- vfr video
- preemption #
- 개성국밥
- Value too long for column
- 달인막창
- 코루틴 빌더
- kotlin
- 깡돼후
- PersistenceContext
- JanusGateway
- tolerated
- 티스토리챌린지
- JanusWebRTC
- Spring Batch
- 자원부족
- JanusWebRTCGateway
- 오블완
- 코루틴 컨텍스트
- k8s #kubernetes #쿠버네티스
Archives
너와 나의 스토리
Dapr란? 마이크로서비스 운영 최적화하기 - 개념, 기능, 사용 방법 본문
반응형
Dapr: 분산 애플리케이션을 위한 강력한 런타임
1. Dapr란 무엇인가?
Dapr(Distributed Application Runtime)은 클라우드 및 온프레미스 환경에서 분산 애플리케이션을 쉽게 개발할 수 있도록 지원하는 오픈소스 런타임입니다. 다양한 프로그래밍 언어와 프레임워크에서 사용할 수 있으며, 애플리케이션이 인프라에 의존하지 않고 상태 관리, 서비스 간 통신, 이벤트 처리 등을 수행할 수 있도록 도와줍니다.
Dapr은 기본적으로 Kubernetes 환경에서 실행되지만, 로컬 개발 환경에서도 쉽게 실행할 수 있도록 설계되었습니다. 이를 통해 컨테이너 기반 애플리케이션뿐만 아니라 기존의 전통적인 애플리케이션에도 적용할 수 있습니다.
주요 기능
- 서비스 간 통신 (Service Invocation): HTTP 및 gRPC를 사용한 마이크로서비스 간 호출을 쉽게 구현할 수 있습니다.
- 상태 관리 (State Management): Redis, PostgreSQL, Cosmos DB 등 다양한 스토리지 백엔드를 지원하는 상태 저장 기능을 제공합니다.
- Pub/Sub 메시징 (Publish & Subscribe): Kafka, RabbitMQ, AWS SNS/SQS 등 다양한 메시지 브로커를 활용한 이벤트 기반 통신을 지원합니다.
- 비밀 관리 (Secrets Management): Azure Key Vault, HashiCorp Vault 등과 통합하여 애플리케이션에서 안전하게 비밀을 관리할 수 있습니다.
- 입출력 바인딩 (Bindings): 클라우드 서비스(S3, Azure Blob Storage 등) 및 외부 API와 쉽게 통합할 수 있습니다.
- 분산 트레이싱 및 모니터링: OpenTelemetry 및 Prometheus와 통합하여 애플리케이션의 상태를 추적하고 모니터링할 수 있습니다.
- 액터 모델 (Actor Model): 액터 기반 애플리케이션을 쉽게 구현할 수 있도록 지원합니다.
2. Dapr을 활용하면 어떤 이점이 있는가?
1) 플랫폼 및 언어 독립적인 개발 가능
- Dapr은 다양한 프로그래밍 언어(Python, Java, Node.js, .NET 등)에서 사용할 수 있으며, 특정 클라우드나 인프라에 종속되지 않습니다.
- 동일한 애플리케이션 코드를 로컬 개발 환경, Kubernetes, VM 환경 등 어디에서든 실행할 수 있습니다.
2) 인프라 종속성을 줄이고 유지보수를 단순화
- 일반적으로 애플리케이션은 Redis, RabbitMQ, PostgreSQL 등 여러 가지 기술 스택을 직접 사용해야 합니다.
- RabbitMQ: 메시지 큐(Message Queue) 시스템으로, 여러 시스템 또는 서비스가 비동기적으로 서로 메시지를 주고받을 수 있도록 돕는 소프트웨어입니다.
- 하지만 Dapr을 사용하면 애플리케이션 코드에서 특정 데이터 저장소나 메시지 브로커에 대한 직접적인 의존성을 없앨 수 있습니다.
- 클라우드 환경이 변경되더라도 Dapr 설정만 수정하면 되므로 유지보수가 훨씬 간편합니다.
- Dapr는 각 애플리케이션 인스턴스 옆에 배치되는 sidecar process로 실행되며, 애플리케이션이 다양한 기능을 필요로 할 때 Dapr 사이트카가 그 기능을 제공합니다.
- kubernetes에서 pod마다 하나의 Dapr 사이드카 컨테이너를 추가하여 배포됩니다.
- Sidecar Pattern 설명은 하단 참조.
- 오른쪽 다이어그램을 보면, 스프링 부트 애플리케이션이 대퍼 API에만 의존합니다.
- 이러면 애플리케이션은 Radis나 RabbitMQ 클라이언트를 포함할 필요가 없으므로 의존성이 줄어들게 됩니다.
- Dapr에서 사용할 메시지 브로커(RabbitMQ, Kafka) 또는 데이터베이스(MySQL, PostgreSQL) 등을 설정 및 변경 가능합니다.
- 변경 시 애플리케이션을 수정할 필요 없이 Dapr 설정만 변경하면 됩니다.
3) 로컬 개발 환경에서 마이크로서비스 개발 가능
- Kubernetes 없이도 로컬에서 Dapr을 실행할 수 있어 개발 및 테스트가 훨씬 쉬워집니다.
- Testcontainers와의 통합을 통해 다양한 환경에서 테스트를 수행할 수 있습니다.
4) 서비스 간 보안 강화
- Dapr은 서비스 간 호출 시 mTLS(mutual TLS) 인증을 기본 지원하며, 보안이 강화된 상태에서 애플리케이션을 운영할 수 있습니다.
3. Dapr 사용 방법
1) Dapr 설치하기
로컬 개발 환경에서 Dapr을 실행하려면 먼저 Dapr CLI를 설치해야 합니다.
# Dapr CLI 설치 (MacOS/Linux)
curl -fsSL https://raw.githubusercontent.com/dapr/cli/master/install/install.sh | /bin/bash
# Windows (PowerShell)
iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex
Dapr을 설치한 후 아래 명령어로 실행할 수 있습니다.
# 로컬에서 Dapr 실행
dapr init
2) Spring Boot에서 Dapr 사용하기
Spring Boot에서 Dapr을 사용하려면, Dapr Java SDK를 추가해야 합니다.
Maven 의존성 추가
<dependency>
<groupId>io.dapr</groupId>
<artifactId>dapr-sdk-springboot</artifactId>
<version>1.9.0</version>
</dependency>
서비스 간 호출 예제 (Service Invocation)
@RestController
@RequestMapping("/orders")
public class OrderController {
@PostMapping("/create")
public ResponseEntity<String> createOrder(@RequestBody Order order) {
return ResponseEntity.ok("Order created: " + order.getId());
}
}
# Dapr을 사용하여 Spring Boot 애플리케이션 실행
dapr run --app-id order-service --app-port 8080 -- java -jar order-service.jar
3) Dapr Pub/Sub 활용하기
아래 코드는 Dapr의 Pub/Sub 메시징을 활용하는 예제입니다.
메시지 발행 (Publish)
@Autowired
private DaprClient daprClient;
public void publishEvent() {
daprClient.publishEvent("pubsub", "orders", new Order(123));
}
메시지 구독 (Subscribe)
@RestController
public class OrderSubscriber {
@Topic(name = "orders", pubsubName = "pubsub")
@PostMapping("/orders")
public void handleOrder(@RequestBody Order order) {
System.out.println("Received order: " + order.getId());
}
}
+추가) Sidecar 패턴
- 마이크로서비스 아키텍처에서 주로 사용되는 디자인 패턴입니다.
- 이름(sidecar: 오토바이 옆 카트)처럼 애플리케이션과 별도로 동작하는컨테이너를 붙여서 보조하는 역할을 하게 만드는 방식입니다.
- 사이드카는 주 애플리케이션과 동일한 인프라에서 실행되지만, 기능적으로는 주 애플리케이션의 일부가 아니라 독립적인 서비스입니다.
- 사이드카는 부모 애플리케이션에 연결되고 애플리케이션에 대한 지원 기능을 제공합니다.
- 사이드카는 기보 애플리케이션과 동일한 리소스에 액세스할 수 있어서, 서비스 간 통신, 로깅, 모니터링, 보안, 트래픽 관리 등의 부가적인 기능을 처리하는 데 유용합니다.
- 사이드카는 일반적으로 특정 기능을 제공하는 독립적인 컴포넌트로 설계되어, 여러 애플리케이션에서 재사용이 가능하고, 주 애플리케이션의 코드 변경 없이 기능을 업데이트하거나 확장할 수 있습니다.
출처 및 참고 자료:
반응형
'개발 > Spring Boot' 카테고리의 다른 글
설정 파일(*.properties, *.yml)에 있는 값들을 자바 클래스로 바인딩해서 사용하기 - @ConfigurationProperties (0) | 2023.07.29 |
---|---|
Spring Boot 버전 업그레이드에 따른 변경 사항 / Spring Cloud, Gradle 등 (0) | 2023.03.29 |
[SpringBoot] JPA Converter 적용 / Converter null 처리 (0) | 2023.03.05 |
Spring Quartz Scheduler H2 table 생성 (에러 해결) (0) | 2022.11.30 |
Field 'XX_id' doesn't have a default value: JoinColumn id 생성 문제 해결 (0) | 2022.07.19 |
Comments