Spring Data CosmosDB мультитенантная конфигурация CosmosDB - PullRequest
0 голосов
/ 28 марта 2020

Я использую CosmosDB в мультитенантном приложении. Создайте отдельную базу данных для каждого арендатора, а коллекции для каждого арендатора находятся в их собственной базе данных.

Учитывая, что мое приложение должно обрабатывать несколько арендаторов, у меня не может быть единой конфигурации для моих репозиториев, которая имеет предопределенные база данных. База данных должна быть динамически настроена в зависимости от контекста запроса (клиент). Как добиться такой настройки с помощью Spring Data CosmosDB?

Вот как настраивается конфигурация репозитория. Как видите, база данных исправлена ​​через свойства приложения. В реальном сценарии у приложения есть запросы от разных арендаторов; поэтому придется использовать разные базы данных

@Configuration
@EnableCosmosRepositories
@Slf4j
public class UserRepositoryConfiguration extends AbstractCosmosConfiguration {

  @Autowired
  private CosmosDBProperties properties;

  private CosmosKeyCredential cosmosKeyCredential;

      @Bean
      @Primary
      public CosmosDBConfig cosmosDbConfig() {
        this.cosmosKeyCredential = new CosmosKeyCredential(properties.getKey());
        CosmosDBConfig cosmosDBConfig = CosmosDBConfig.builder(properties.getUri(), cosmosKeyCredential,
            properties.getDatabase()).build();
        cosmosDBConfig.setPopulateQueryMetrics(properties.isPopulateQueryMetrics());
        cosmosDBConfig.setResponseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation());
        return cosmosDBConfig;
      }

      public void switchToPrimaryKey() {
        this.cosmosKeyCredential.key(properties.getKey());
      }

      public void switchKey(String key) {
        this.cosmosKeyCredential.key(key);
      }

      private static class ResponseDiagnosticsProcessorImplementation implements ResponseDiagnosticsProcessor {

        @Override
        public void processResponseDiagnostics(@Nullable ResponseDiagnostics responseDiagnostics) {
          log.info("Response Diagnostics {}", responseDiagnostics);
        }
      }
    }

1 Ответ

0 голосов
/ 03 апреля 2020

Я помещаю свой код. net здесь для справки, он поможет вам написать ваш весенний код.

Вам необходимо создать одну учетную запись в базе данных и получить ключи (DatabaseEndPoint & DatabaseKey). Затем все, что вы можете создать динамически, например, базу данных, коллекцию и т. Д. c. исходя из вашего арендатора.

In. net, я использую инъекцию зависимостей для внедрения IDocumentClient. ниже моя конфигурация

string databaseEndPoint = ConfigurationManager.AppSettings["DatabaseEndPoint"]; //Get from config file
string databaseKey = ConfigurationManager.AppSettings["DatabaseKey"];//Get from config file
services.AddSingleton<IDocumentClient>(new DocumentClient(new System.Uri(databaseEndPoint), databaseKey,
            new ConnectionPolicy
            {
                ConnectionMode = ConnectionMode.Direct,
                ConnectionProtocol = Protocol.Tcp,
                RequestTimeout = TimeSpan.FromMinutes(5),//Groupasset sync has some timeout issue with large payload
                // Customize retry options for Throttled requests
                RetryOptions = new RetryOptions()
                {
                    MaxRetryAttemptsOnThrottledRequests = 5,
                    MaxRetryWaitTimeInSeconds = 60
                }
            }
        ));

BaseDAO / BaseRepository

public abstract class BaseDao : IBaseDao
{
    protected readonly IDocumentClient client;

    protected BaseDao(IDocumentClient client)
    {
        this.client = client;
    }

    /// <summary>
    /// Create Document in Database
    /// </summary>
    /// <param name="databaseId">database name</param>
    /// <param name="collectionId">collection name</param>
    /// <param name="document">document object</param>
    /// <returns></returns>
    public virtual async Task<string> CreateAsync(string databaseId, string collectionId, JObject document)
    {
        Document response = await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), document);
        return response.Id;
    }
}

Создание класса DAO / Repository и наследование от базового DAO.

В моем В этом сценарии мы создаем базу данных на основе tenant имени, например, Google, Microsoft et c. на основе пользователя (bill@microsoft.com) все запросы выполняются в одной (Microsoft) базе данных.

...