4.10 使用NoSQL技术

优质
小牛编辑
138浏览
2023-12-01

Spring Data提供了其他项目,可帮助您访问各种NoSQL技术,包括:MongoDB,Neo4J,Elasticsearch,Solr,Redis,Gemfire,Cassandra,Couchbase和LDAP。 Spring Boot为Redis,MongoDB,Neo4j,Elasticsearch,Solr Cassandra,Couchbase和LDAP提供自动配置。 您可以使用其他项目,但必须自己配置它们。 请参阅projects.spring.io/spring-data上的相应参考文档。

4.10.1 Redis

Redis是一个缓存,消息代理和功能丰富的键值存储。 Spring Boot为Lettuce和Jedis客户端库提供了基本的自动配置,并为Spring Data Redis提供了它们之外的抽象。

有一个spring-boot-starter-data-redis的“Starter”用于以方便的方式收集依赖项。 默认情况下,它使用Lettuce。 该启动器处理传统和反应应用程序。

我们还提供了一个spring-boot-starter-data-redis-reactive的“Starter”,以便与其他具有反应支持的存储保持一致。

4.10.1.1 连接到Redis

您可以像注入任何其他Spring Bean一样注入自动配置的RedisConnectionFactory,StringRedisTemplate或vanilla RedisTemplate实例。 默认情况下,实例尝试连接到localhost:6379上的Redis服务器。 以下清单显示了这样一个bean的示例:

@Component
public class MyBean {

	private StringRedisTemplate template;

	@Autowired
	public MyBean(StringRedisTemplate template) {
		this.template = template;
	}

	// ...

}

您还可以注册实现LettuceClientConfigurationBuilderCustomizer的任意数量的bean,以进行更高级的自定义。 如果使用Jedis,JedisClientConfigurationBuilderCustomizer也可用。

如果添加任何自动配置类型的@Bean,它将替换默认值(RedisTemplate除外,当排除基于bean名称时,redisTemplate,而不是其类型)。 默认情况下,如果commons-pool2在类路径上,则会获得池化连接工厂。

4.10.2 MongoDB

MongoDB是一个开源的NoSQL文档数据库,它使用类似JSON的模式而不是传统的基于表的关系数据。 Spring Boot提供了几种使用MongoDB的便利,包括spring-boot-starter-data-mongodb和spring-boot-starter-data-mongodb-reactive“Starters”。

4.10.2.1 连接到MongoDB数据库

要访问Mongo数据库,您可以注入自动配置的org.springframework.data.mongodb.MongoDbFactory。 默认情况下,实例尝试通过mongodb:localhost/test连接到MongoDB服务器以下示例显示如何连接到MongoDB数据库:

import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;

@Component
public class MyBean {

	private final MongoDbFactory mongo;

	@Autowired
	public MyBean(MongoDbFactory mongo) {
		this.mongo = mongo;
	}

	// ...

	public void example() {
		DB db = mongo.getDb();
		// ...
	}

}

您可以设置spring.data.mongodb.uri属性以更改URL并配置其他设置,例如副本集合,如以下示例所示:

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test

或者,只要您使用Mongo 2.x,就可以指定主机/端口。 例如,您可以在application.properties中声明以下设置:

spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017

如果您已经定义了自己的MongoClient,它将用于自动配置合适的MongoDbFactory。 com.mongodb.MongoClient和com.mongodb.client.MongoClient都受支持。

如果使用Mongo 3.0 Java驱动程序,则不支持spring.data.mongodb.host和spring.data.mongodb.port。 在这种情况下,应使用spring.data.mongodb.uri来提供所有配置。

如果未指定spring.data.mongodb.port,则使用默认值27017。 您可以从前面显示的示例中删除此行。

如果你不使用Spring Data Mongo,你可以注入com.mongodb.MongoClient bean而不是使用MongoDbFactory。 如果要完全控制建立MongoDB连接,还可以声明自己的MongoDbFactory或MongoClient bean。

如果您使用的是反应式驱动程序,则SSL需要Netty。 如果Netty可用并且尚未自定义要使用的工厂,则自动配置会自动配置此工厂。

4.10.2.2 MongoTemplate

Spring Data MongoDB提供了一个MongoTemplate类,它的设计与Spring的JdbcTemplate非常相似。 与JdbcTemplate一样,Spring Boot会自动为您配置一个bean来注入模板,如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final MongoTemplate mongoTemplate;

	@Autowired
	public MyBean(MongoTemplate mongoTemplate) {
		this.mongoTemplate = mongoTemplate;
	}

	// ...

}

有关完整的详细信息,请参阅MongoOperations Javadoc。

4.10.2.3 Spring Data MongoDB Repositories

Spring Data包括MongoDB的存储库支持。 与前面讨论的JPA存储库一样,基本原则是基于方法名称自动构造查询。

事实上,Spring Data JPA和Spring Data MongoDB共享相同的通用基础架构。 您可以从之前的JPA示例中获取,假设City现在是Mongo数据类而不是JPA @Entity,它的工作方式相同,如下例所示:

package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*;

public interface CityRepository extends Repository<City, Long> {

	Page<City> findAll(Pageable pageable);

	City findByNameAndStateAllIgnoringCase(String name, String state);

}

您可以使用@EntityScan批注自定义文档扫描位置。

有关Spring Data MongoDB的完整详细信息,包括其丰富的对象映射技术,请参阅其参考文档。

4.10.2.4 嵌入式Mongo

Spring Boot为Embedded Mongo提供自动配置。 要在Spring Boot应用程序中使用它,请添加依赖项 de.flapdoodle.embed:de.flapdoodle.embed.mongo。

可以通过设置spring.data.mongodb.port属性来配置Mongo侦听的端口。 要使用随机分配的空闲端口,请使用值0。MongoAutoConfiguration创建的MongoClient会自动配置为使用随机分配的端口。

如果未配置自定义端口,则默认情况下,嵌入式支持使用随机端口(而不是27017)。

如果类路径上有SLF4J,则Mongo生成的输出将自动路由到名为org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo的记录器。

您可以声明自己的IMongodConfig和IRuntimeConfig bean来控制Mongo实例的配置和日志路由。

4.10.3 Neo4j

Neo4j是一个开源的NoSQL图形数据库,它使用由一级关系连接的节点的丰富数据模型,与传统的RDBMS方法相比,它更适合于连接大数据。 Spring Boot为使用Neo4j提供了一些便利,包括spring-boot-starter-data-neo4j“的Starter”。

4.10.3.1 连接到Neo4j数据库

要访问Neo4j服务器,您可以注入自动配置的org.neo4j.ogm.session.Session。 默认情况下,实例尝试使用Bolt协议连接到localhost:7687上的Neo4j服务器。 以下示例显示了如何注入Neo4j会话:

@Component
public class MyBean {

	private final Session session;

	@Autowired
	public MyBean(Session session) {
		this.session = session;
	}

	// ...

}

您可以通过设置spring.data.neo4j.*属性来配置要使用的URI和凭据,如以下示例所示:

spring.data.neo4j.uri=bolt://my-server:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=secret

您可以通过添加org.neo4j.ogm.config.Configuration @Bean来完全控制会话创建。 此外,添加类型为SessionFactory的@Bean会禁用自动配置并为您提供完全控制。

4.10.3.2 使用嵌入模式

如果将org.neo4j:neo4j-ogm-embedded-driver添加到应用程序的依赖项中,Spring Boot会自动配置Neo4j的进程内嵌入式实例,该应用程序在应用程序关闭时不会保留任何数据。

由于嵌入式Neo4j OGM驱动程序本身不提供Neo4j内核,因此您必须自己声明org.neo4j:neo4j作为依赖项。 有关兼容版本的列表,请参阅Neo4j OGM文档。

当类路径上有多个驱动程序时,嵌入式驱动程序优先于其他驱动程序。 您可以通过设置spring.data.neo4j.embedded.enabled = false来显式禁用嵌入模式。

如果嵌入式驱动程序和Neo4j内核如上所述位于类路径上,则数据Neo4j测试会自动使用嵌入式Neo4j实例。

您可以通过在配置中提供数据库文件的路径来为嵌入模式启用持久性,例如: spring.data.neo4j.uri=file://var/tmp/graph.db。

4.10.3.3 Neo4jSession

默认情况下,如果您正在运行Web应用程序,则会话将绑定到线程以进行整个请求处理(即,它使用“在视图中打开会话”模式)。 如果您不想要此行为,请将以下行添加到application.properties文件中:

spring.data.neo4j.open-in-view=false

4.10.3.4 Spring Data Neo4j Repositories

Spring Data包含对Neo4j的存储库支持。

Spring Data Neo4j与Spring Data JPA共享通用基础架构,就像许多其他Spring Data模块一样。 您可以从之前的JPA示例中将City定义为Neo4j OGM @NodeEntity而不是JPA @Entity,并且存储库抽象以相同的方式工作,如以下示例所示:

package com.example.myapp.domain;

import java.util.Optional;

import org.springframework.data.neo4j.repository.*;

public interface CityRepository extends Neo4jRepository<City, Long> {

	Optional<City> findOneByNameAndState(String name, String state);

}

spring-boot-starter-data-neo4j的“Starter”支持存储库支持和事务管理。 您可以在@Configuration-bean上分别使用@EnableNeo4jRepositories和@EntityScan来自定义位置以查找存储库和实体。

有关Spring Data Neo4j的完整详细信息,包括其对象映射技术,请参阅参考文档。

4.10.4 Gemfire

Spring Data Gemfire为访问Pivotal Gemfire数据管理平台提供了方便的Spring友好工具。 有一个spring-boot-starter-data-gemfire的“Starter”用于以方便的方式收集依赖项。 目前没有对Gemfire的自动配置支持,但您可以使用单个注释启用Spring Data Repositories:@EnableGemfireRepositories。

4.10.5 Solr

Apache Solr是一个搜索引擎。 Spring Boot为Solr 5客户端库提供了基本的自动配置,并为Spring Data Solr提供了它的抽象。 有一个spring-boot-starter-data-solr的“Starter”用于以方便的方式收集依赖项。

4.10.5.1 连接到Solr

您可以像任何其他Spring bean一样注入自动配置的SolrClient实例。 默认情况下,实例尝试连接到localhost:8983/solr上的服务器。 以下示例显示如何注入Solr bean:

@Component
public class MyBean {

	private SolrClient solr;

	@Autowired
	public MyBean(SolrClient solr) {
		this.solr = solr;
	}

	// ...

}

如果添加自己的SolrClient类型的@Bean,它将替换默认值。

4.10.5.2 Spring Data Solr Repositories

Spring Data包括Apache Solr的存储库支持。 与前面讨论的JPA存储库一样,基本原则是根据方法名称自动构造查询。

事实上,Spring Data JPA和Spring Data Solr共享相同的通用基础架构。 您可以从之前获取JPA示例,假设City现在是@SolrDocument类而不是JPA @Entity,它的工作方式相同。

有关Spring Data Solr的完整详细信息,请参阅参考文档。

4.10.6 Elasticsearch

Elasticsearch是一个开源,分布式,RESTful搜索和分析引擎。 Spring Boot为Elasticsearch提供基本的自动配置。

Spring Boot支持多个HTTP客户端:

  • 官方Java“低级”和“高级”REST客户端
  • Jest

Spring Data Elasticsearch仍在使用传输客户端,您可以使用spring-boot-starter-data-elasticsearch的“Starter”开始使用它。

4.10.6.1 使用REST客户端连接到Elasticsearch

Elasticsearch提供了两个可用于查询集群的REST客户端:“低级”客户端和“高级”客户端。

如果您对类路径具有org.elasticsearch.client:elasticsearch-rest-client依赖关系,则Spring Boot将自动配置并注册默认情况下为localhost:9200的RestClient bean。 您可以进一步调整RestClient的配置方式,如以下示例所示:

spring.elasticsearch.rest.uris=http://search.example.com:9200
spring.elasticsearch.rest.username=user
spring.elasticsearch.rest.password=secret

您还可以注册实现RestClientBuilderCustomizer的任意数量的bean,以进行更高级的自定义。 要完全控制注册,请定义RestClient bean。

如果你对类路径有org.elasticsearch.client:elasticsearch-rest-high-level-client依赖关系,Spring Boot将自动配置一个RestHighLevelClient,它包装任何现有的RestClient bean,重用其HTTP配置。

4.10.6.2 使用Jest连接到Elasticsearch

如果你在类路径上有Jest,你可以注入一个自动配置的JestClient,默认情况下是localhost:9200。 您可以进一步调整客户端的配置方式,如以下示例所示:

spring.elasticsearch.jest.uris=http://search.example.com:9200
spring.elasticsearch.jest.read-timeout=10000
spring.elasticsearch.jest.username=user
spring.elasticsearch.jest.password=secret

您还可以注册实现HttpClientConfigBuilderCustomizer的任意数量的bean,以进行更高级的自定义。 以下示例调整其他HTTP设置:

static class HttpSettingsCustomizer implements HttpClientConfigBuilderCustomizer {

	@Override
	public void customize(HttpClientConfig.Builder builder) {
		builder.maxTotalConnection(100).defaultMaxTotalConnectionPerRoute(5);
	}

}

要完全控制注册,请定义JestClient bean。

4.10.6.3 使用Spring Data连接到Elasticsearch

要连接到Elasticsearch,您必须提供一个或多个群集节点的地址。 可以通过将spring.data.elasticsearch.cluster-nodes属性设置为以逗号分隔的host:port列表来指定地址。 使用此配置,可以像任何其他Spring bean一样注入ElasticsearchTemplate或TransportClient,如以下示例所示:

spring.data.elasticsearch.cluster-nodes=localhost:9300
@Component
public class MyBean {

	private final ElasticsearchTemplate template;

	public MyBean(ElasticsearchTemplate template) {
		this.template = template;
	}

	// ...

}

如果添加自己的ElasticsearchTemplate或TransportClient @Bean,它将替换默认值。

4.10.6.4 Spring Data Elasticsearch Repositories

Spring Data包括对Elasticsearch的存储库支持。 与前面讨论的JPA存储库一样,基本原则是根据方法名称自动为您构建查询。

事实上,Spring Data JPA和Spring Data Elasticsearch共享相同的通用基础架构。 您可以从之前的JPA示例中获取,假设City现在是Elasticsearch @Document类而不是JPA @Entity,它的工作方式相同。

有关Spring Data Elasticsearch的完整详细信息,请参阅参考文档。

4.10.7 Cassandra

Cassandra是一个开源的分布式数据库管理系统,旨在处理许多商用服务器上的大量数据。 Spring Boot提供了Cassandra的自动配置以及Spring Data Cassandra提供的抽象。 有一个spring-boot-starter-data-cassandra的“Starter”用于以方便的方式收集依赖项。

4.10.7.1 连接到Cassandra

您可以像使用任何其他Spring Bean一样注入自动配置的CassandraTemplate或Cassandra Session实例。 spring.data.cassandra.*属性可用于自定义连接。 通常,您提供keyspace-name和contact-points属性,如以下示例所示:

spring.data.cassandra.keyspace-name=mykeyspace
spring.data.cassandra.contact-points=cassandrahost1,cassandrahost2

您还可以注册实现ClusterBuilderCustomizer的任意数量的bean,以进行更高级的自定义。

以下代码清单显示了如何注入Cassandra bean:

@Component
public class MyBean {

	private CassandraTemplate template;

	@Autowired
	public MyBean(CassandraTemplate template) {
		this.template = template;
	}

	// ...

}

如果添加自己的CassandraTemplate类型的@Bean,它将替换默认值。

4.10.7.2 Spring Data Cassandra Repositories

Spring Data包含对Cassandra的基本存储库支持。 目前,这比前面讨论的JPA存储库更有限,需要使用@Query注释finder方法。

有关Spring Data Cassandra的完整详细信息,请参阅参考文档.

4.10.8 Couchbase

Couchbase是一个开源的,分布式的,多模型的NoSQL面向文档的数据库,针对交互式应用程序进行了优化。 Spring Boot提供了Couchbase的自动配置以及Spring Data Couchbase提供的抽象。 有spring-boot-starter-data-couchbase和spring-boot-starter-data-couchbase-reactive的“Starters”,用于以方便的方式收集依赖项。

4.10.8.1 连接到Couchbase

您可以通过添加Couchbase SDK和一些配置来获取Bucket和Cluster。 spring.couchbase.*属性可用于自定义连接。 通常,您提供引导主机,存储桶名称和密码,如以下示例所示:

spring.couchbase.bootstrap-hosts=my-host-1,192.168.1.123
spring.couchbase.bucket.name=my-bucket
spring.couchbase.bucket.password=secret

您至少需要提供引导主机,在这种情况下,bucket名是默认的,密码是空字符串。或者,您可以定义自己的org.springframework.data.couchbase.config.CouchbaseConfigurer@Bean来控制整个配置。

也可以自定义一些CouchbaseEnvironment设置。 例如,以下配置更改用于打开新Bucket的超时并启用SSL支持:

spring.couchbase.env.timeouts.connect=3000
spring.couchbase.env.ssl.key-store=/location/of/keystore.jks
spring.couchbase.env.ssl.key-store-password=secret

有关更多详细信息,请查看spring.couchbase.env.*属性。

4.10.8.2 Spring Data Couchbase Repositories

Spring Data包括对Couchbase的存储库支持。 有关Spring Data Couchbase的完整详细信息,请参阅参考文档。

您可以像使用任何其他Spring Bean一样注入自动配置的CouchbaseTemplate实例,前提是可以使用默认的CouchbaseConfigurer(当您启用Couchbase支持时会发生这种情况,如前所述)。

以下示例显示了如何注入Couchbase bean:

@Component
public class MyBean {

	private final CouchbaseTemplate template;

	@Autowired
	public MyBean(CouchbaseTemplate template) {
		this.template = template;
	}

	// ...

}

您可以在自己的配置中定义一些bean来覆盖自动配置提供的bean:

  • CouchbaseTemplate @Bean,名称为couchbaseTemplate。
  • 一个名为couchbaseIndexManager的IndexManager @Bean。
  • CustomConversions @Bean,名称为couchbaseCustomConversions。

为避免在您自己的配置中对这些名称进行硬编码,您可以重用Spring Data Couchbase提供的BeanNames。 例如,您可以自定义要使用的转换器,如下所示:

@Configuration
public class SomeConfiguration {

	@Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
	public CustomConversions myCustomConversions() {
		return new CustomConversions(...);
	}

	// ...

}

如果要完全绕过Spring Data Couchbase的自动配置,请提供您自己的实现.org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration.

4.10.9 LDAP

LDAP(轻量级目录访问协议)是一种开放的,与供应商无关的行业标准应用程序协议,用于通过IP网络访问和维护分布式目录信息服务。 Spring Boot为任何兼容的LDAP服务器提供自动配置,并为UnboundID支持嵌入式内存中LDAP服务器。

LDAP抽象由Spring Data LDAP提供。 有一个spring-boot-starter-data-ldap的“Starter”用于以方便的方式收集依赖项。

4.10.9.1 连接到LDAP服务器

要连接到LDAP服务器,请确保声明对spring-boot-starter-data-ldap的“Starter”或spring-ldap-core的依赖关系,然后在application.properties中声明服务器的URL,如下所示:

spring.ldap.urls=ldap://myserver:1235
spring.ldap.username=admin
spring.ldap.password=secret

如果需要自定义连接设置,可以使用spring.ldap.base和spring.ldap.base-environment属性。

根据这些设置自动配置LdapContextSource。 如果您需要自定义它,例如使用PooledContextSource,您仍然可以注入自动配置的LdapContextSource。 确保将自定义的ContextSource标记为@Primary,以便自动配置的LdapTemplate使用它。

4.10.9.2 Spring Data LDAP Repositories

Spring Data包括对LDAP的存储库支持。 有关Spring Data LDAP的完整详细信息,请参阅参考文档。

您也可以像使用任何其他Spring Bean一样注入自动配置的LdapTemplate实例,如以下示例所示:

@Component
public class MyBean {

	private final LdapTemplate template;

	@Autowired
	public MyBean(LdapTemplate template) {
		this.template = template;
	}

	// ...

}

4.10.9.3 嵌入式内存LDAP服务器

出于测试目的,Spring Boot支持从UnboundID自动配置内存中的LDAP服务器。 要配置服务器,请向com.unboundid:unboundid-ldapsdk添加依赖项并声明base-dn属性,如下所示:

spring.ldap.embedded.base-dn=dc=spring,dc=io

可以定义多个base-dn值,但是,由于可分辨名称通常包含逗号,因此必须使用正确的表示法定义它们。 在yaml文件中,您可以使用yaml列表表示法:

spring.ldap.embedded.base-dn:

  • dc=spring,dc=io
  • dc=pivotal,dc=io

在属性文件中,必须包含索引作为属性名称的一部分:

spring.ldap.embedded.base-dn[0]=dc=spring,dc=io spring.ldap.embedded.base-dn[1]=dc=pivotal,dc=io

默认情况下,服务器在随机端口上启动并触发常规LDAP支持。 无需指定spring.ldap.urls属性。

如果类路径上有schema.ldif文件,则它用于初始化服务器。 如果要从其他资源加载初始化脚本,还可以使用spring.ldap.embedded.ldif属性。

默认情况下,标准模式用于验证LDIF文件。 您可以通过设置spring.ldap.embedded.validation.enabled属性来完全关闭验证。 如果您有自定义属性,则可以使用spring.ldap.embedded.validation.schema来定义自定义属性类型或对象类。

4.10.10 InfluxDB

InfluxDB是一个开源时间序列数据库,针对运营监控,应用程序指标,物联网传感器数据和实时分析等领域中的时间序列数据的快速,高可用性存储和检索进行了优化。

4.10.10.1 连接到InfluxDB

Spring Boot自动配置InfluxDB实例,前提是Influxdb-java客户端在类路径上并且设置了数据库的URL,如以下示例所示:

spring.influx.url=http://172.0.0.1:8086

如果与InfluxDB的连接需要用户和密码,则可以相应地设置spring.influx.user和spring.influx.password属性。

InfluxDB依赖于OkHttp。 如果你需要调整InfluxDB在幕后使用的http客户端,你可以注册一个InfluxDbOkHttpClientBuilderProvider bean。