20191127 Spring Boot官方文档学习(4.11)
4.11。使用NoSQL技术
Spring Data提供了其他项目来帮助您访问各种NoSQL
技术,包括:
- Redis
- MongoDB
- Neo4J
- Solr
- Elasticsearch
- Cassandra
- Couchbase
- LDAP
- InfluxDB
Spring Boot为Redis
,MongoDB
,Neo4j
,Elasticsearch
,Solr
, Cassandra
,Couchbase
和LDAP
提供自动配置。您可以使用其他项目,但必须自己进行配置。请参阅相应的参考文档。
4.11.1。Redis
Redis是一个缓存,消息代理和功能丰富的键值存储。Spring Boot为Lettuce
和Jedis
客户端库以及Spring Data Redis为Lettuce和Jedis提供的最基本的抽象,提供了基本的自动配置。
spring-boot-starter-data-redis
启动器可以方便地收集依赖关系。默认情况下,它使用 Lettuce
。该启动程序可以处理传统应用程序和响应式应用程序。
我们还提供了一个spring-boot-starter-data-redis-reactive
启动器,可与其他存储保持一致,并提供响应性支持。
连接到Redis
您可以像注入其他任何Spring Bean一样注入自动配置的RedisConnectionFactory
,StringRedisTemplate
或Vanilla RedisTemplate
实例。默认情况下,实例尝试连接到Redis服务器localhost:6379
。下面的清单显示了这种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.11.2。MongoDB
MongoDB是一个开源NoSQL文档数据库,它使用类似JSON的架构而不是传统的基于表的关系数据。Spring Boot为MongoDB的使用提供了许多便利,包括spring-boot-starter-data-mongodb
和spring-boot-starter-data-mongodb-reactive
启动器。
连接到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并配置其他设置,例如replica set
,如以下示例所示:
spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test
另外,只要您使用Mongo 2.x,就可以指定 host/port
。例如,您可以在application.properties中声明以下设置:
spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017
如果定义了自己的MongoClient
,它将用于自动配置合适的MongoDbFactory
。支持com.mongodb.MongoClient
和com.mongodb.client.MongoClient
。
如果使用Mongo3.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并且尚未自定义要使用的工厂,则自动配置会自动配置该工厂。
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;
}
// ...
}
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
注解来自定义文档扫描位置。
嵌入式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实例的配置和日志记录路由。可以通过声明DownloadConfigBuilderCustomizer
bean 来定制下载配置。
4.11.3。Neo4j
Neo4j是一个开源NoSQL图形数据库,它使用通过一级关系连接的节点的丰富数据模型,与传统的RDBMS方法相比,它更适合于连接大数据。Spring Boot为Neo4j的使用提供了许多便利,包括spring-boot-starter-data-neo4j
启动器。
连接到Neo4j数据库
要访问Neo4j服务器,您可以注入自动配置的org.neo4j.ogm.session.Session
。默认情况下,实例尝试localhost:7687
使用Bolt
协议连接到Neo4j
服务器。以下示例显示如何注入Neo4j Session:
@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或org.neo4j.ogm.session.SessionFactory
bean 来完全控制会话的创建。
使用嵌入式模式
如果添加org.neo4j:neo4j-ogm-embedded-driver
到应用程序的依赖项,Spring Boot会自动配置Neo4j的进程内嵌入式实例,该实例在应用程序关闭时不会保留任何数据。
由于嵌入式Neo4j OGM驱动程序本身不提供Neo4j内核,因此您必须自己声明org.neo4j:neo4j
为依赖项。有关兼容版本的列表,请参阅Neo4j OGM文档。
当类路径上有多个驱动程序时,嵌入式驱动程序优先于其他驱动程序。您可以通过设置spring.data.neo4j.embedded.enabled=false
显式禁用嵌入式模式。
如果嵌入式驱动程序和Neo4j内核位于上述类路径上,则Data Neo4j Tests会自动使用嵌入式Neo4j实例。
您可以通过在配置中提供数据库文件的路径来启用嵌入式模式的持久性,例如,spring.data.neo4j.uri=file://var/tmp/graph.db
。
使用原生类型
Neo4j-OGM可以将某些类型(例如java.time.*
中的类型)映射到基于String属性或Neo4j提供的原生类型之一。出于向后兼容的原因,Neo4j-OGM的默认设置是使用基于String的表示形式。要使用原生类型,请添加依赖项org.neo4j:neo4j-ogm-bolt-native-types
或org.neo4j:neo4j-ogm-embedded-native-types
,并配置spring.data.neo4j.use-native-types
属性,如以下示例所示:
spring.data.neo4j.use-native-types=true
Neo4jSession
默认情况下,如果您正在运行Web应用程序,则会话将绑定到线程以进行请求的整个处理(即,它使用“在视图中打开会话”模式)。如果您不希望出现这种情况,请将以下行添加到您的application.properties文件中:
spring.data.neo4j.open-in-view=false
Spring Data Neo4j存储库
Spring Data包括对Neo4j的存储库支持。
Spring Data Neo4j与许多其他Spring Data模块一样,与Spring Data JPA共享公共基础结构。您可以使用以前的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
启动器启用对存储库的支持以及事务管理。您可以通过在@Configuration
bean 上分别使用@EnableNeo4jRepositories
和@EntityScan
来定制查找存储库和实体的位置。
有关Spring Data Neo4j的完整详细信息,包括其对象映射技术,请参阅参考文档。
4.11.4。Solr
Apache Solr是一个搜索引擎。Spring Boot为Solr 5客户端库提供了基本的自动配置,并由Spring Data Solr在其之上提供了抽象。spring-boot-starter-data-solr
“启动器”可以方便地收集依赖关系。
连接到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,它将替换默认值。
Spring Data Solr存储库
Spring Data包括对Apache Solr的存储库支持。与前面讨论的JPA存储库一样,基本原理是根据方法名称自动为您构建查询。
实际上,Spring Data JPA和Spring Data Solr共享相同的通用基础结构。您可以从以前的JPA示例开始,假设现在City是一个@SolrDocument
类,而不是JPA @Entity,它的工作方式相同。
4.11.5。Elasticsearch
Elasticsearch
是一个开源,分布式,RESTful搜索和分析引擎。Spring Boot为Elasticsearch提供了基本的自动配置。
Spring Boot支持多个客户端:
- 官方Java“低级”和“高级” REST客户端
- Spring Data Elasticsearch提供的
ReactiveElasticsearchClient
传输客户端仍然可用,但是Spring Data Elasticsearch和Elasticsearch本身已弃用了它的支持。它将在将来的版本中删除。Spring Boot提供了专用的 spring-boot-starter-data-elasticsearch
启动器。
由于Elasticsearch和Spring Data Elasticsearch为REST客户端提供了官方支持,因此Jest客户端也已被弃用。
使用REST客户端连接到Elasticsearch
Elasticsearch附带了两个可用于查询集群的REST客户端:“低级”客户端和“高级”客户端。
如果类路径上有org.elasticsearch.client:elasticsearch-rest-client
依赖,Spring Boot将自动配置并注册一个RestClient
bean 默认为localhost:9200
的target。您可以进一步调整RestClient
配置方式,如以下示例所示:
spring.elasticsearch.rest.uris=https://search.example.com:9200
spring.elasticsearch.rest.read-timeout=10s
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配置。
使用反应式REST客户端连接到Elasticsearch
Spring Data Elasticsearch附带的ReactiveElasticsearchClient
实例以响应方式查询Elasticsearch实例。它建立在WebFlux的WebClient
基础上,因此spring-boot-starter-elasticsearch
和spring-boot-starter-webflux
依赖项对于启用此支持都是有用的。
默认情况下,Spring Boot将自动配置并注册一个ReactiveElasticsearchClient
bean 作为localhost:9200
的target 。您可以进一步调整其配置,如以下示例所示:
spring.data.elasticsearch.client.reactive.endpoints=search.example.com:9200
spring.data.elasticsearch.client.reactive.use-ssl=true
spring.data.elasticsearch.client.reactive.socket-timeout=10s
spring.data.elasticsearch.client.reactive.username=user
spring.data.elasticsearch.client.reactive.password=secret
如果配置属性不够,并且您想完全控制客户端配置,则可以注册一个自定义ClientConfiguration
bean。
使用Jest连接到Elasticsearch
现在,Spring Boot支持官方的RestHighLevelClient
,已废弃Jest支持。
如果Jest在类路径上,则可以注入默认情况下目标为localhost:9200
的自动配置的JestClient
。您可以进一步调整客户端的配置方式,如以下示例所示:
spring.elasticsearch.jest.uris=https://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。
使用Spring Data连接到Elasticsearch
要连接到Elasticsearch,必须定义一个RestHighLevelClient
bean,它由Spring Boot自动配置或由应用程序手动提供(请参阅前面的部分)。有了此配置后,ElasticsearchRestTemplate
可以像其他任何Spring bean一样被注入 ,如以下示例所示:
@Component
public class MyBean {
private final ElasticsearchRestTemplate template;
public MyBean(ElasticsearchRestTemplate template) {
this.template = template;
}
// ...
}
在存在spring-data-elasticsearch
和使用WebClient
(通常为spring-boot-starter-webflux
)所需的依赖项的情况下,Spring Boot还可以自动配置ReactiveElasticsearchClient
和ReactiveElasticsearchTemplateas
Bean。它们与其他REST客户端是等效的。
Spring Data Elasticsearch存储库
Spring Data包括对Elasticsearch的存储库支持。与前面讨论的JPA存储库一样,基本原理是根据方法名称自动为您构造查询。
实际上,Spring Data JPA和Spring Data Elasticsearch共享相同的通用基础架构。您可以从以前的JPA示例开始,假设现在City是Elasticsearch @Document类而不是JPA @Entity,它的工作方式相同。
Spring Boot使用ElasticsearchRestTemplate
或ReactiveElasticsearchTemplate
bean 支持经典和反应式Elasticsearch存储库。给定所需的依赖项,最有可能由Spring Boot自动配置这些bean。
如果您希望使用自己的模板来支持Elasticsearch存储库,则可以添加自己的ElasticsearchRestTemplate
或ElasticsearchOperations
@Bean(只要命名为elasticsearchTemplate
)。同样适用于ReactiveElasticsearchTemplate
和ReactiveElasticsearchOperations
,Bean名称为reactiveElasticsearchTemplate
。
您可以选择使用以下属性禁用存储库支持:
spring.data.elasticsearch.repositories.enabled=false
4.11.6。Cassandra
Cassandra是一个开源的分布式数据库管理系统,旨在处理许多商用服务器上的大量数据。Spring Boot为Cassandra提供自动配置,并由Spring Data Cassandra在其之上提供抽象。spring-boot-starter-data-cassandra
“启动器”可以方便地收集依赖关系。
连接到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,它将替换默认值。
Spring Data Cassandra存储库
Spring Data包括对Cassandra的基本存储库支持。当前,此功能比前面讨论的JPA存储库更受限制,需要使用@Query
来注解finder方法。
4.11.7。Couchbase
Couchbase是一个开源,分布式,多模型的NoSQL面向文档的数据库,已针对交互式应用程序进行了优化。Spring Boot为Couchbase提供自动配置,并由Spring Data Couchbase在其之上提供抽象。spring-boot-starter-data-couchbase
和spring-boot-starter-data-couchbase-reactive
“启动器”方便的收集依赖关系。
连接到Couchbase
您可以通过添加Couchbase SDK和一些配置来获得Bucket和Cluster。spring.couchbase.*
属性可用于自定义连接。通常,您提供bootstrap主机,bucket名称和密码,如以下示例所示:
spring.couchbase.bootstrap-hosts=my-host-1,192.168.1.123
spring.couchbase.bucket.name=my-bucket
spring.couchbase.bucket.password=secret
您至少需要提供bootstrap主机,在这种情况下,bucket名称为default,密码为空字符串。另外,您可以定义自己的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.*
属性以获取更多详细信息。
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,以覆盖自动配置提供的那些:
- 名称为
couchbaseTemplate
的CouchbaseTemplate
@Bean - 名称为
couchbaseIndexManager
的IndexManager
@Bean - 名称为
couchbaseCustomConversions
的CustomConversions
@Bean
为了避免在您自己的配置中对这些名称进行硬编码,您可以重复使用Spring Data Couchbase提供的BeanNames
。例如,您可以自定义要使用的转换器,如下所示:
@Configuration(proxyBeanMethods = false)
public class SomeConfiguration {
@Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
public CustomConversions myCustomConversions() {
return new CustomConversions(...);
}
// ...
}
如果您想完全绕过Spring Data Couchbase的自动配置,请提供您自己的org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration
实现。
4.11.8。LDAP
LDAP(轻量级目录访问协议)是一种开放的,与供应商无关的行业标准应用协议,用于通过IP网络访问和维护分布式目录信息服务。Spring Boot为任何兼容的LDAP服务器提供自动配置,并使用UnboundID
支持嵌入式内存LDAP服务器。
LDAP抽象由Spring Data LDAP提供。spring-boot-starter-data-ldap
“启动器”可以方便地收集依赖关系。
连接到LDAP服务器
要连接到LDAP服务器,请确保声明spring-boot-starter-data-ldap
“启动器” 或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
使用它。
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;
}
// ...
}
嵌入式内存LDAP服务器
出于测试目的,Spring Boot支持使用UnboundID自动配置内存中的LDAP服务器。要配置服务器,请添加依赖项com.unboundid:unboundid-ldapsdk
并声明spring.ldap.embedded.base-dn
属性,如下所示:
spring.ldap.embedded.base-dn=dc=spring,dc=io
可以定义多个base-dn
值,但是,由于可分辨的名称通常包含逗号,因此必须使用正确的符号来定义它们。
在yaml文件中,您可以使用:
spring.ldap.embedded.base-dn:
- dc=spring,dc=io
- dc=pivotal,dc=io
在properties文件中,必须将索引包括在属性名称中:
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.11.9。InfluxDB
InfluxDB是一个开源的时间序列数据库,已优化用于在操作监视,应用程序度量,物联网传感器数据和实时分析等领域中快速,高可用性地存储和检索时间序列数据。
连接到InfluxDB
如果influxdb-java
客户端位于类路径上并且设置了数据库的URL,Spring Boot会自动配置一个InfluxDB实例,如以下示例所示:
spring.influx.url=https://172.0.0.1:8086
如果与InfluxDB的连接需要用户和密码,则可以相应地设置spring.influx.user
和spring.influx.password
属性。
InfluxDB依赖OkHttp
。如果需要在后台调整http客户端InfluxDB的使用,则可以注册一个InfluxDbOkHttpClientBuilderProvider
bean。