Spring Messaging Azure Event Hubs에 대한 Spring Cloud Azure 지원

이 문서에서는 Spring Cloud Azure 및 Spring Messaging Azure Event Hubs를 사용하는 방법을 설명합니다. Spring Framework는 메시징 시스템과 통합하기 위한 광범위한 지원을 제공합니다.

스프링 메시징 Azure 이벤트 허브

주요 개념

Azure Event Hubs는 모든 원본에서 모든 대상으로 대기 시간이 짧은 초당 수백만 개의 이벤트를 스트리밍할 수 있는 클라우드의 네이티브 데이터 스트리밍 서비스입니다. Azure Event Hubs용 Spring Messaging 프로젝트는 핵심 Spring 개념을 이벤트 허브 기반 메시징 솔루션 개발에 적용합니다. 메시지를 보내기 위한 고수준 추상화로 템플릿을 제공합니다. 또한 @EventHubsListener 애너테이션과 리스너 컨테이너를 사용하는 메시지 기반 POJO(Plain Old Java Object)를 지원합니다. 이러한 라이브러리는 종속성 주입 및 선언적 구성의 사용을 촉진합니다. 이러한 모든 경우에서 Spring AMQP의 Spring Framework 및 RabbitMQ 지원에서 JMS 지원과 유사점을 확인할 수 있습니다.

종속성 설정

<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-cloud-azure-starter</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-messaging-azure-eventhubs</artifactId>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>
</dependency>

구성 / 설정

라이브러리는 EventHubsTemplate 및 @EventHubsListener다음과 같은 구성 옵션을 제공합니다.

재산 유형 설명
spring.cloud.azure.message-converter.isolated-object-mapper 불리언 Event Hubs 메시지 변환기에서 격리된 ObjectMapper 빈을 사용할지 여부입니다. 기본적으로 사용하도록 설정됩니다.
spring.cloud.azure.eventhubs.enabled 불리언 Azure Event Hubs를 사용할 수 있는지 여부입니다.
spring.cloud.azure.eventhubs.connection-string 문자열 Event Hubs 네임스페이스 연결 문자열 값입니다.
spring.cloud.azure.eventhubs.namespace 문자열 FQDN의 접두사인 Event Hubs 네임스페이스 값입니다. FQDN은 NamespaceName.DomainName으로 구성되어야 합니다.
spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name 문자열 스토리지 계정의 이름입니다.
spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key 문자열 스토리지 계정 액세스 키입니다.
spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name 문자열 스토리지 컨테이너 이름입니다.

기본 사용법

사용자 지정 Event Hubs 메시지 변환기

Event Hubs 메시지 변환기를 구성하는 방법에는 두 가지가 있습니다.

  • 기본 Event Hubs 메시지 변환기가 사용자 지정 ObjectMapper 빈 또는 Spring Boot에서 관리하는 ObjectMapper 빈인 ObjectMapper 빈을 사용하도록 다음 속성을 구성하세요.

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Event Hubs 메시지 변환기 빈을 직접 정의합니다.

    @Bean
    AzureMessageConverter<EventData, EventData> eventHubsMessageConverter() {
        JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();
        return new EventHubsMessageConverter(jsonMapper);
    }
    

Azure Event Hubs에 메시지 보내기

다음 단계를 사용하여 메시지를 보냅니다.

  1. 다음 방법 중 하나를 사용하여 자격 증명 구성 옵션을 채웁니다.

    • DefaultAzureCredential자격 증명의 경우 application.yml 파일에서 다음 속성을 구성합니다.

      spring:
        cloud:
          azure:
            eventhubs:
              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}
              processor:
                checkpoint-store:
                  container-name: ${CHECKPOINT-CONTAINER}
                  account-name: ${CHECKPOINT-STORAGE-ACCOUNT}
      
    • 연결 문자열로 자격 증명의 경우 application.yml 파일에서 다음 속성을 구성합니다.

      spring:
        cloud:
          azure:
            eventhubs:
              connection-string: ${AZURE_EVENT_HUBS_CONNECTION_STRING}
              processor:
                checkpoint-store:
                  container-name: ${CHECKPOINT-CONTAINER}
                  account-name: ${CHECKPOINT-STORAGE-ACCOUNT}
                  account-key: ${CHECKPOINT-ACCESS-KEY}
      
    • 자격 증명을 관리 ID로 사용하려면 application.yml 파일에서 다음 속성을 구성합니다.

      spring:
        cloud:
          azure:
            credential:
              managed-identity-enabled: true
              client-id: ${AZURE_CLIENT_ID}
            eventhubs:
              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}
              processor:
                checkpoint-store:
                  container-name: ${CONTAINER_NAME}
                  account-name: ${ACCOUNT_NAME}
      
    • 서비스 주체 자격 증명의 경우 application.yml 파일에서 다음 속성을 구성합니다.

      spring:
        cloud:
          azure:
            credential:
              client-id: ${AZURE_CLIENT_ID}
              client-secret: ${AZURE_CLIENT_SECRET}
            profile:
              tenant-id: <tenant>
            eventhubs:
              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}
              processor:
                checkpoint-store:
                  container-name: ${CONTAINER_NAME}
                  account-name: ${ACCOUNT_NAME}
      

비고

tenant-id, common, organizations또는 테넌트 ID와 같은 consumers사용할 수 있습니다. 이러한 값에 대한 자세한 내용은 잘못된 엔드포인트(개인 및 조직 계정) 섹션의 오류 AADSTS50020 - ID 공급자의 사용자 계정이 테넌트에 존재하지 않습니다를 참조하세요. 단일 테넌트 앱을 다중 테넌트로 변환하는 방법에 대한 정보는 Microsoft Entra ID에서 단일 테넌트 앱을 다중 테넌트로 변환을 참조하세요.

  1. EventHubsTemplate는 자동으로 구성되며, 다음 예제와 같이 사용자 정의 빈에 직접 자동 연결할 수 있습니다.

    @Component
    public class MyBean {
    
        private final EventHubsTemplate eventHubsTemplate;
    
        public MyBean(EventHubsTemplate eventHubsTemplate) {
            this.eventHubsTemplate = eventHubsTemplate;
        }
    
        public void someMethod() {
            this.eventHubsTemplate.sendAsync('EVENT_HUB_NAME', MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    
    }
    

Azure Event Hubs에서 메시지 받기

다음 단계를 사용하여 메시지를 받습니다.

  1. 자격 증명 구성 옵션을 입력합니다.

  2. 다음 예제와 같이 @EnableAzureMessaging 주석을 추가합니다. 이 애너테이션은 @EventHubsListener로 애너테이션된 메서드를 검색하게 하며, 내부적으로 메시지 리스너 컨테이너를 생성합니다.

    @SpringBootApplication
    @EnableAzureMessaging
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    비고

    반복을 피하기 위해 버전 5.21.0부터 Spring Cloud Azure 자동 구성 활성화 어노테이션 @EnableAzureMessaging이 자동으로 활성화됩니다.

  3. Event Hubs 인프라가 있으면 모든 빈에 @EventHubsListener 애너테이션을 지정하여 리스너 엔드포인트를 만들 수 있습니다. 다음 구성 요소는 EVENT_HUB_NAME 이벤트 허브 및 $Default 소비자 그룹에 수신기 엔드포인트를 만듭니다.

    @Component
    public class MyBean {
    
        @EventHubsListener(destination = "EVENT_HUB_NAME", group = "$Default")
        public void processMessage(String content) {
            // ...
        }
    
    }
    

샘플

자세한 내용은 GitHub의 azure-spring-boot-samples 리포지토리를 참조하세요.