领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多这篇博客的灵感来自于我和 Couchbase 的开发者布道师 Laurent Doguin 去年在 Couchbase Connect 上做的演讲。感谢 Laurent!
这是一个 Spring Data Couchbase 集成的演示。从 项目页面 可以看出,Spring Data Couchbase 是
Spring Data Couchbase 项目提供了与 Couchbase Server 数据库的集成。Spring Data Couchbase 的关键功能领域包括用于与 Couchbase Bucket 交互的面向 POJO 的模型,以及轻松编写 Repository 风格的数据访问层。
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 服务代理,然后允许您的 Cloud Foundry 安装与 Cumulogic 平台通信,该平台本身可以管理 Couchbase 实例。服务代理是集成代码的一部分,它可以教 Cloud Foundry 如何配置、销毁和通常与托管服务(在这种情况下为 Couchbase)交互。
让我们来看一个简单的示例,该示例读取数据(在本例中,使用 Spring Social Facebook 的 FacebookTemplate
API 从 Facebook 位置 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 提供了仓储的概念——处理典型数据访问逻辑并提供基于约定的查询的对象。它们可用于将 POJO 映射到后端数据存储中的数据。
我们的示例只是存储它从 Facebook 的 Places API 读取的关于企业的的信息。为此,我们创建了一个简单的 Place
实体,Spring Data Couchbase 仓储将知道如何持久化它。
@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,仓储查找方法映射到 Couchbase 服务器中的 *视图*(用 JavaScript 编写的查询)。您需要在 Couchbase 服务器上设置视图。转到任何 Couchbase 服务器的管理控制台并访问 *视图* 屏幕,然后单击 *创建开发视图* 并将其命名为 place
,因为我们的实体将是 demo.Place
(开发视图名称默认情况下是从实体的类名中获取的)。
我们将创建两个视图,通用的 all
(任何 Spring Data Couchbase POJO 都需要),以及 byName
视图(将用于驱动仓储的 findByName
查找方法)。这种映射是基于约定的,尽管您可以使用查找方法声明上的 @View
注解来覆盖使用哪个视图。
首先,all
现在,byName
完成后,请务必*发布*每个视图!
现在您可以按预期使用 Spring Data 仓储。这些仓储唯一有点不同的是,我们为 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 验证 API,并且可以配置为遵守其实体上的验证约束。如果您需要,Spring Data Couchbase 还提供对 CouchbaseClient
API 的更低级别访问。Spring Data Couchbase 还实现了 Spring 的 CacheManager
抽象——您可以将 @Cacheable
和相关注解用于服务方法上的数据,它将被透明地持久化到 Couchbase。
与我的朋友 Laurent Doguin (@ldoguin)(Couchbase 的员工)一起开发的 此示例的代码在我的 Github 存储库中。