Używanie Azure Service Bus z usługą JMS

W tym artykule opisano sposób używania Azure Service Bus z interfejsem API JMS zintegrowanym z platformą Spring JMS.

Podstawowe funkcje

Połączenie bez hasła

Połączenie bez hasła wykorzystuje uwierzytelnianie Microsoft Entra do łączenia się z usługami Azure bez przechowywania żadnych poświadczeń w aplikacji, jej plikach konfiguracyjnych ani w zmiennych środowiskowych. Uwierzytelnianie Microsoft Entra to mechanizm nawiązywania połączenia z Azure Service Bus przy użyciu tożsamości zdefiniowanych w usłudze Microsoft Entra ID. Dzięki uwierzytelnianiu Microsoft Entra możesz zarządzać usługą Service Bus i innymi usługami Microsoft z jednego centralnego miejsca, co upraszcza zarządzanie uprawnieniami.

Jak to działa

Spring Cloud Azure najpierw tworzy jeden z następujących typów poświadczeń w zależności od konfiguracji uwierzytelniania aplikacji:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

Jeśli żaden z tych typów poświadczeń nie zostanie znaleziony, łańcuch poświadczeń za pośrednictwem DefaultTokenCredential jest używany do uzyskiwania poświadczeń z właściwości aplikacji, zmiennych środowiskowych, tożsamości zarządzanej lub środowisk IDE. Aby uzyskać więcej informacji, zobacz Spring Cloud Azure authentication.

Konfiguracja zależności

Dodaj następujące zależności, jeśli chcesz zmigrować aplikację Spring JMS do użycia Azure Service Bus.

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>
</dependency>

Konfiguracja

W poniższej tabeli opisano konfigurowalne właściwości w przypadku korzystania z obsługi programu Spring JMS:

Własność Opis
spring.jms.servicebus.connection-string Parametry połączenia usługi Azure Service Bus, jeśli chcesz podać je bezpośrednio.
spring.jms.servicebus.topic-client-id Identyfikator klienta JMS. Działa tylko dla fasoli topicJmsListenerContainerFactory.
spring.jms.servicebus.enabled Wartość wskazująca, czy włączyć automatyczną konfigurację Service Bus JMS. Wartość domyślna to true.
spring.jms.servicebus.idle-timeout Limit czasu bezczynności dla połączenia, który wskazuje, jak długo klient oczekuje, że usługa Service Bus utrzyma połączenie aktywne, gdy nie są dostarczane żadne komunikaty. Wartość domyślna to 2m.
spring.jms.servicebus.passwordless-enabled Czy włączyć uwierzytelnianie bez użycia hasła dla Azure Service Bus JMS. Wartość domyślna to false.
spring.jms.servicebus.pricing-tier Warstwa cenowa Azure Service Bus. Obsługiwane wartości to premium i standard. Warstwa Premium korzysta z usługi Java Message Service (JMS) 2.0, podczas gdy warstwa Standardowa używa programu JMS 1.1 do interakcji z Azure Service Bus.
spring.jms.servicebus.listener.reply-pub-sub-domain Wartość wskazująca, czy typ miejsca docelowego odpowiedzi jest tematem. Działa tylko dla fasoli topicJmsListenerContainerFactory.
spring.jms.servicebus.listener.phase Faza, w której należy uruchomić i zatrzymać ten kontener.
spring.jms.servicebus.listener.reply-qos-settings Konfiguruje QosSettings, który ma być używany podczas wysyłania odpowiedzi.
spring.jms.servicebus.listener.subscription-durable Wartość wskazująca, czy subskrypcja ma być trwała. Działa tylko dla fasoli topicJmsListenerContainerFactory. Wartość domyślna to true.
spring.jms.servicebus.listener.subscription-shared Wartość wskazująca, czy subskrypcja ma być udostępniona. Działa tylko dla fasoli topicJmsListenerContainerFactory.
spring.jms.servicebus.pool.block-if-full Wartość wskazująca, czy blokować przy żądaniu połączenia, gdy pula jest pełna. Ustaw wartość false, aby zamiast tego zgłosić JMSException.
spring.jms.servicebus.pool.block-if-full-timeout Okres blokowania przed zgłoszeniem wyjątku, jeśli pula jest nadal pełna.
spring.jms.servicebus.pool.enabled Wartość wskazująca, czy należy utworzyć JmsPoolConnectionFactory zamiast zwykłego ConnectionFactory.
spring.jms.servicebus.pool.idle-timeout Limit czasu bezczynności puli połączeń.
spring.jms.servicebus.pool.max-connections Maksymalna liczba połączeń w puli.
spring.jms.servicebus.pool.max-sessions-per-connection Maksymalna liczba sesji puli przypadających na każde połączenie w puli.
spring.jms.servicebus.pool.time-between-expiration-check Czas oczekiwania między kolejnymi uruchomieniami wątku usuwania bezczynnych połączeń. Jeśli wartość jest ujemna, wątek usuwania bezczynnych połączeń nie jest uruchamiany.
spring.jms.servicebus.pool.use-anonymous-producers Wartość wskazująca, czy używać tylko jednego wystąpienia anonimowego MessageProducer. Ustaw ją na false, aby utworzyć jedną MessageProducer za każdym razem, gdy jest to wymagane.
spring.jms.servicebus.prefetch-policy.all Wartość domyślna opcji pobierania wstępnego w tej przestrzeni nazw usługi Service Bus. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch Liczba operacji pobierania wstępnego dla trwałego tematu. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch Liczba elementów pobieranych z wyprzedzeniem dla przeglądarki kolejki. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.queue-prefetch Liczba pobierania wstępnego dla kolejki. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.topic-prefetch Liczba operacji wstępnego pobierania dla tematu. Wartość domyślna to 0.

Uwaga

Ogólna konfiguracja platformy Spring JMS została pominięta na krótko.

Aby uzyskać więcej informacji, zobacz Spring JMS Document.

Podstawowe użycie

Nawiązywanie połączenia z usługą Azure Service Bus JMS bez użycia hasła

Skonfiguruj następujące właściwości w pliku application.yml:

spring:
  jms:
    servicebus:
      namespace: ${AZURE_SERVICEBUS_NAMESPACE}
      pricing-tier: ${PRICING_TIER}
      passwordless-enabled: true

Ważny

Usługa Azure Service Bus JMS obsługuje użycie identyfikatora Microsoft Entra ID do autoryzowania żądań dotyczących zasobów usługi Service Bus. W przypadku Microsoft Entra ID upewnij się, że masz przypisaną rolę właściciela danych Azure Service Bus do aktualnie używanego konta Microsoft Entra. Aby uzyskać więcej informacji, zobacz Przypisania ról Azure przy użyciu portalu Azure.

Łączenie z usługą Azure Service Bus za pomocą JMS przy użyciu tożsamości zarządzanej

  1. Aby użyć tożsamości zarządzanej, włącz tożsamość zarządzaną usługi i przypisz rolę Azure Service Bus Data Owner. Aby uzyskać więcej informacji, zobacz Jak uwierzytelnić tożsamość zarządzaną za pomocą usługi Microsoft Entra ID w celu uzyskania dostępu do zasobów usługi Azure Service Bus.

  2. Skonfiguruj następujące właściwości w pliku application.yml:

    spring:
      cloud:
        azure:
          credential:
            managed-identity-enabled: true
      jms:
        servicebus:
          namespace: ${AZURE_SERVICEBUS_NAMESPACE}
          pricing-tier: ${PRICING_TIER}
          passwordless-enabled: true
    

    Ważny

    Jeśli używasz tożsamości zarządzanej przypisanej przez użytkownika, musisz również dodać właściwość spring.cloud.azure.credential.client-id z identyfikatorem klienta tożsamości zarządzanej przypisanej przez użytkownika.

Nawiązywanie połączenia z usługą Azure Service Bus JMS przy użyciu parametry połączenia

Dodaj następujące właściwości i wszystko gotowe.

spring:
  jms:
    servicebus:
      connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING}
      pricing-tier: ${PRICING_TIER}

Uwaga

Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze, taki jak bazy danych, pamięci podręczne, komunikaty lub usługi sztucznej inteligencji, wymaga bardzo wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bardziej bezpieczne opcje, takie jak tożsamości zarządzane dla połączeń bez hasła lub bez kluczy, nie są opłacalne. W przypadku operacji maszyny lokalnej preferuj tożsamości użytkowników dla połączeń bez hasła lub bez klucza.

Połączenia

Spring Cloud Azure udostępnia następujące trzy opcje Connection Factory do łączenia z usługą Azure Service Bus JMS:

  • JmsPoolConnectionFactory: Ta fabryka obsługuje pulę połączeń z opcjami dostosowywalnymi, takimi jak spring.jms.servicebus.pool.max-connections. Więcej ustawień konfiguracji puli — poprzedzonych prefiksem spring.jms.servicebus.pool. — opisano w sekcji Konfiguracja . Ta konfiguracja zwiększa wydajność przy użyciu funkcji równoważenia obciążenia Azure Service Bus, dystrybuując ruch między wiele punktów końcowych.

  • CachingConnectionFactory: Ta fabryka wykorzystuje jedno połączenie dla wszystkich wywołań do JmsTemplate, zmniejszając narzut związany z ustanawianiem połączenia, co sprawdza się idealnie w scenariuszach o niewielkim natężeniu ruchu. Jednak ten tryb nie korzysta z możliwości równoważenia obciążenia Azure Service Bus.

  • ServiceBusJmsConnectionFactory: W tym trybie każde wywołanie JmsTemplate tworzy nowe połączenie, co może wymagać dużych zasobów i być mniej efektywne.

Kiedy wszystkie trzy klasy znajdują się w classpathie, która z nich zostanie użyta? Poniższa tabela opisuje, co jest używane w zależności od właściwości konfiguracji (od wersji Spring Cloud Azure 7.1.0 i 6.2.0):

spring.jms.servicebus.pool.enabled spring.jms.cache.enabled Nadawcy ConnectionFactory Kontener nasłuchujący ConnectionFactory
nie ustawiono nie ustawiono CachingConnectionFactory ServiceBusJmsConnectionFactory
nie ustawiono true CachingConnectionFactory CachingConnectionFactory
nie ustawiono false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
true nie ustawiono JmsPoolConnectionFactory JmsPoolConnectionFactory
true true CachingConnectionFactory CachingConnectionFactory
true false JmsPoolConnectionFactory JmsPoolConnectionFactory
false nie ustawiono CachingConnectionFactory ServiceBusJmsConnectionFactory
false true CachingConnectionFactory CachingConnectionFactory
false false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory

Uwaga

Poniższa tabela przedstawia domyślną ConnectionFactory, gdy zarówno spring.jms.servicebus.pool.enabled, jak i spring.jms.cache.enabled nie są ustawione, dla różnych wersji Spring Cloud Azure:

Wersja usługi Spring Cloud Azure Nadawcy ConnectionFactory Kontener nasłuchiwacza ConnectionFactory
>= 6.2.0 lub >= 7.1.0 CachingConnectionFactory ServiceBusJmsConnectionFactory
6.1.0 i 7.0.0 ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
<= 6.1.0 JmsPoolConnectionFactory JmsPoolConnectionFactory

Próbki

Aby uzyskać więcej informacji, zobacz repozytorium azure-spring-boot-samples w witrynie GitHub.