Java Spring Data CosmosDB多租户CosmosDB配置
我正在多租户应用程序中使用CosmosDB。每个租户都有一个单独的数据库,每个租户的集合都在他们自己的数据库中 考虑到我的应用程序必须处理多个租户,我不能为我的存储库配置一个预定义的数据库。必须根据请求上下文(租户)动态配置数据库。如何使用Spring Data CosmosDB实现这样的设置 下面是如何设置存储库配置的。如您所见,这通过应用程序属性修复了数据库。在真实场景中,应用程序具有来自不同租户的请求;因此必须使用不同的数据库Java Spring Data CosmosDB多租户CosmosDB配置,java,azure,spring-data-jpa,azure-cosmosdb,azure-cosmosdb-sqlapi,Java,Azure,Spring Data Jpa,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我正在多租户应用程序中使用CosmosDB。每个租户都有一个单独的数据库,每个租户的集合都在他们自己的数据库中 考虑到我的应用程序必须处理多个租户,我不能为我的存储库配置一个预定义的数据库。必须根据请求上下文(租户)动态配置数据库。如何使用Spring Data CosmosDB实现这样的设置 下面是如何设置存储库配置的。如您所见,这通过应用程序属性修复了数据库。在真实场景中,应用程序具有来自不同租户的请求;因此必须使用不同的数据库 @Configuration @EnableCosmosRep
@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);
}
}
}
我把我的.net代码放在这里作为参考,它将帮助您编写spring代码 您必须创建一个数据库帐户并需要密钥(
DatabaseEndPoint
&DatabaseKey
)。然后,您可以根据租户动态创建所有内容,即数据库、集合等
在.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
}
}
));
string databaseEndPoint=ConfigurationManager.AppSettings[“databaseEndPoint”]//从配置文件获取
字符串databaseKey=ConfigurationManager.AppSettings[“databaseKey”]//从配置文件获取
AddSingleton(新的DocumentClient(新的System.Uri(databaseEndPoint)),databaseKey,
新连接策略
{
ConnectionMode=ConnectionMode.Direct,
ConnectionProtocol=Protocol.Tcp,
RequestTimeout=TimeSpan.FromMinutes(5),//Groupasset sync在负载较大时存在超时问题
//自定义受限制请求的重试选项
RetryOptions=新的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;
}
}
公共抽象类BaseDao:ibaseado
{
受保护的只读IDocumentClient客户端;
受保护的BaseDao(IDocumentClient客户端)
{
this.client=client;
}
///
///在数据库中创建文档
///
///数据库名称
///集合名称
///文档对象
///
公共虚拟异步任务CreateAsync(字符串数据库ID、字符串集合ID、JObject文档)
{
Document response=wait client.createdocumentsync(UriFactory.CreateDocumentCollectionUri(databaseId,collectionId),Document);
返回response.Id;
}
}
创建DAO/存储库类并从基本DAO继承
在我的场景中,我们基于
租户
名称创建数据库,即基于用户的google、microsoft等(bill@microsoft.com)所有查询都在一个(microsoft)数据库下执行。我将.net代码放在这里作为参考,它将帮助您编写spring代码
您必须创建一个数据库帐户并需要密钥(DatabaseEndPoint
&DatabaseKey
)。然后,您可以根据租户动态创建所有内容,即数据库、集合等
在.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
}
}
));
string databaseEndPoint=ConfigurationManager.AppSettings[“databaseEndPoint”]//从配置文件获取
字符串databaseKey=ConfigurationManager.AppSettings[“databaseKey”]//从配置文件获取
AddSingleton(新的DocumentClient(新的System.Uri(databaseEndPoint)),databaseKey,
新连接策略
{
ConnectionMode=ConnectionMode.Direct,
ConnectionProtocol=Protocol.Tcp,
RequestTimeout=TimeSpan.FromMinutes(5),//Groupasset sync在负载较大时存在超时问题
//自定义受限制请求的重试选项
RetryOptions=新的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;
}
}
公共抽象类BaseDao:ibaseado
{
受保护的只读IDocumentClient客户端;
受保护的BaseDao(IDocumentClient客户端)
{
this.client=client;
}
///
///在数据库中创建文档
///
///数据库名称
///集合名称
///文档对象
///
公共虚拟异步任务CreateAsync(字符串数据库ID、字符串集合ID、JObject文档)
{
Document response=wait client.createdocumentsync(UriFactory.CreateDocumentCollectionUri(databaseId,collectionId),Document);
返回response.Id;
}
}
创建DAO/存储库类并从基本DAO继承
在我的场景中,我们基于
租户
名称创建数据库,即基于用户的google、microsoft等(bill@microsoft.com)所有查询都在一个(microsoft)数据库下执行。Hi Pankaj。我实际上使用的是spring数据cosmosdb库。如果我直接使用DocumentClient,就有可能实现某种形式的多租户;嗨,潘卡吉。我实际上使用的是spring数据cosmosdb库。如果我直接使用DocumentClient,就有可能实现某种形式的多租户;