领先一步
VMware 提供培训和认证,助您加速进步。
了解更多这篇博客的灵感来自于去年我和 Couchbase 的开发者推广大使 Laurent Doguin 在 Couchbase Connect 上的一次演讲。谢谢 Laurent!
这是 Spring Data Couchbase 集成的演示。来自 项目页面,Spring Data Couchbase 是
Spring Data Couchbase 项目提供了与 Couchbase Server 数据库的集成。Spring Data Couchbase 的主要功能领域包括一个以 POJO 为中心的模型,用于与 Couchbase Buckets 交互,以及轻松编写存储库样式的数据访问层。
Couchbase 是一个具有真正水平扩展能力的分布式数据存储。我喜欢将其视为 Redis 和 MongoDB 的混合体:您通过键来访问文档。它为所有语言提供了大量的客户端 API。如果您正在使用 Couchbase 作为后端并使用 JVM,那么您会非常喜欢 Spring Data Couchbase。项目主页上的项目符号列表最能列出其众多功能。
@Configuration 类或 Couchbase 驱动程序的 XML 命名空间进行 Spring 配置。CouchbaseTemplate 辅助类,可提高执行常见 Couchbase 操作的生产力。包括文档和 POJO 之间的集成对象映射。@Cacheable 支持,可缓存您所需的所有对象,以实现高性能访问。如果您还没有安装 Couchbase(这很自然),那么您将需要它。Michael Nitschinger(@daschl,Spring Data Couchbase 项目的负责人)写了一篇关于如何轻松设置并运行一个 4 节点 Vagrant 集群的博客。我在 vagrant 目录中重现了他的示例。要使用它,您需要安装Virtual Box 和Vagrant,当然,然后在 vagrant 目录中运行 vagrant up。为了获得此配置脚本的最新版本,我查看了 Michael 的GitHub vagrants 项目,发现除了这个示例之外,还有大量其他 Vagrant 脚本可用。我在该代码的项目目录中有一个指向该仓库的子模块,但请务必参考该仓库以获取最新信息。为了在我的机器上运行所有内容,我选择了Couchbase 3.0.2 的 Ubuntu 12 安装版本。您可以通过在启动前配置 VAGRANT_NODES 环境变量来更改启动节点的数量。
VAGRANT_NODES=2 vagrant up
在初始设置时,您需要管理和配置 Couchbase。将浏览器指向每个节点的正确 IP。确定该 IP 的规则在 README 中得到了很好的描述。在我的例子中,管理界面可以通过 192.168.105.101:8091 和 192.168.105.102:8091 访问。有关此过程的更多信息,我建议您遵循此处的指南以获取详细信息。
这是我的操作方法。我在第一个节点上访问了管理界面并创建了一个新集群。我使用了 admin 作为用户名,password 作为密码。在所有后续的管理页面上,我只需将节点指向 192.168.105.101 并使用上述 admin 凭据来加入现有集群。加入所有节点后,在服务器节点面板中找到重新平衡按钮并触发集群重新平衡。
如果您完成了 Vagrant 集群的使用,可以使用 vagrant halt 命令将其干净地关闭。vagrant suspend 也非常方便,它会保存节点的状态而不是完全关闭它们。
如果您想从命令行管理 Couchbase 集群,有一个方便的couchbase-cli。您只需使用 vagrant ssh 命令(按节点名称:node1、node2 等)进入每个节点。进入后,您可以运行集群配置命令。例如,server-list 命令将列出集群节点。
/opt/couchbase/bin/couchbase-cli server-list -c 192.168.56.101 -u admin -p password
使用以下命令可以轻松触发重新平衡:
/opt/couchbase/bin/couchbase-cli rebalance -c 192.168.56.101 -u admin -p password
Couchbase 非常适合在云中使用。它具有水平扩展能力(与 Gemfire 或 Cassandra 类似),因此没有单点故障。它不采用主-从或活动/被动系统。有几种方法可以将其设置并运行在应用程序所在的云环境中。如果您正在运行 Cloud Foundry 安装,那么您可以安装Cumulogic Service Broker,然后您的 Cloud Foundry 安装就可以与 Cumulogic 平台通信,而 Cumulogic 平台本身可以管理 Couchbase 实例。服务代理是集成代码的一部分,它教会 Cloud Foundry 如何在新时段配置、销毁和一般地与托管服务(在本例中为 Couchbase)进行交互。
让我们来看一个简单的示例,该示例读取数据(在本例中通过 Spring Social Facebook 的 FacebookTemplate API 从 Facebook Places API 读取)然后将其加载到 Couchbase 服务器。
您还需要一个 Facebook 访问令牌。最简单的方法是访问Facebook 开发者门户,创建一个新应用程序,然后获取应用程序 ID 和应用程序密钥。将这两个值与管道字符 (|) 连接起来。因此,您将获得类似以下的格式:appID|appSecret。示例应用程序使用 Spring 的 Environment 机制来解析 facebook.accessToken 键。您可以在 src/main/resources/application.properties 文件中提供该值,或者使用任何其他支持的 Spring Boot 属性解析机制。您甚至可以将该值作为 -D 参数提供:-Dfacebook.accessToken=...|...
Couchbase 中的数据存储在存储桶(buckets)中。在逻辑上,它相当于 SQL RDBMS 中的数据库。它通常会在节点之间复制,并有自己的配置。我们将使用默认存储桶,但创建更多存储桶非常容易。
让我们看看使用 Spring Data Couchbase 所需的基本配置(在本例中,指 Spring Boot 应用程序)
@SpringBootApplication
@EnableScheduling
@EnableCaching
public class Application {
@EnableCouchbaseRepositories
@Configuration
static class CouchbaseConfiguration extends AbstractCouchbaseConfiguration {
@Value("${couchbase.cluster.bucket}")
private String bucketName;
@Value("${couchbase.cluster.password}")
private String password;
@Value("${couchbase.cluster.ip}")
private String ip;
@Override
protected List<String> bootstrapHosts() {
return Arrays.asList(this.ip);
}
@Override
protected String getBucketName() {
return this.bucketName;
}
@Override
protected String getBucketPassword() {
return this.password;
}
}
// more beans
}
Spring Data 提供了 Repository 的概念——这些对象处理典型的数据访问逻辑并提供基于约定的查询。它们可用于将 POJO 映射到后端数据存储中的数据。
我们的示例仅存储从 Facebook Places API 读取的有关企业的信息。为了实现这一点,我们创建了一个简单的 Place 实体,Spring Data Couchbase Repository 将知道如何持久化它。
@Document(expiry = 0)
class Place {
@Id
private String id;
@Field
private Location location;
@Field
@NotNull
private String name;
@Field
private String affilitation, category, description, about;
@Field
private Date insertionDate;
// .. getters, constructors, toString, etc
}
Place 实体引用另一个实体 Location,该实体基本上是相同的。
对于 Spring Data Couchbase,Repository 的查找方法映射到 Couchbase 服务器中的视图——用 JavaScript 编写的查询。您需要在 Couchbase 服务器上设置视图。转到任何 Couchbase 服务器的管理控制台,访问视图屏幕,然后单击创建开发视图并将其命名为 place,因为我们的实体将是 demo.Place(开发视图名称默认从实体的类名改编)。
我们将创建两个视图:通用 all(这是任何 Spring Data Couchbase POJO 所必需的)和 byName 视图,它将用于驱动 Repository 的 findByName 查找方法。此映射是基于约定的,但您可以使用查找方法声明上的 @View 注解来覆盖使用哪个视图。
首先,all
然后,byName
完成后,请务必发布每个视图!
现在您可以按预期使用 Spring Data Repository。这些 Repository 有点不同之处在于,我们为 findByName 查找方法传递的参数声明的是 Spring Data Couchbase Query 类型,而不是 String。使用 @Query 非常简单。
Query query = new Query();
query.setKey("Philz Coffee");
Collection<Place> places = placeRepository.findByName(query);
places.forEach(System.out::println);
我们只涵盖了其中一些基础知识。Spring Data Couchbase 支持Java Bean Validation API,并且可以配置为遵守其实体上的验证约束。如果您需要,Spring Data Couchbase 还提供对 CouchbaseClient API 的较低级别访问。Spring Data Couchbase还实现了Spring CacheManager 抽象——您可以与服务方法中的数据一起使用 @Cacheable 及相关功能,它将透明地为您持久化到 Couchbase。
此示例的代码在我的 Github 存储库中,与我在 Couchbase 的朋友 Laurent Doguin(@ldoguin)共同开发。