Couchbase 和 Spring Data Couchbase 入门

工程 | Josh Long | 2015年3月16日 | ...

这篇博客的灵感来自于我和 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?

Couchbase 是一个分布式数据存储,具有真正的水平扩展能力。我认为它结合了 Redis 和 MongoDB 的优点:您可以使用键访问文档。所有语言都有许多客户端 API。如果您使用 Couchbase 作为后端并使用 JVM,那么您会 喜欢 Spring Data Couchbase。项目主页上的要点最好地列出了它的许多特性

  • 使用基于 Java 的@Configuration类或 Couchbase 驱动程序的 XML 命名空间的 Spring 配置支持。
  • CouchbaseTemplate辅助类,提高了执行常见 Couchbase 操作的效率。包括文档和 POJO 之间的集成对象映射。
  • 将异常转换为 Spring 的可移植数据访问异常层次结构。
  • 与 Spring 的转换服务集成的功能丰富的对象映射。
  • 基于注解的映射元数据,但可扩展以支持其他元数据格式。
  • 自动实现 Repository 接口,包括对自定义查找方法的支持(由 Couchbase 视图支持)。
  • JMX 管理和监控
  • 透明的@Cacheable支持,可以缓存任何您需要的高性能访问对象。

运行 Couchbase

使用 Vagrant 在本地运行 Couchbase

如果您还没有安装 Couchbase,则需要安装(当然)。Michael Nitschinger(@daschl,也是 Spring Data Couchbase 项目的负责人)在博客中介绍了如何快速搭建一个简单的 4 节点 Vagrant 集群。我已经在 vagrant 目录中复制了他的示例。要使用它,您需要安装 Virtual BoxVagrant,当然,然后只需在 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:8091192.168.105.102:8091 访问。有关此过程的更多信息,我建议您遵循 此处的指南 以了解详细信息。

以下是我操作步骤。我访问了 第一个节点上的管理界面 并创建了一个新的集群。我使用 admin 作为用户名,password 作为密码。在所有后续的管理页面上,我只是通过将节点指向 192.168.105.101 并使用上述 admin 凭据来加入现有集群。加入所有节点后,在“服务器节点”面板中查找“重新平衡”按钮并触发集群重新平衡。

如果您完成了 Vagrant 集群的使用,可以使用 vagrant halt 命令干净地关闭它。同样非常方便的是 vagrant suspend,它将保存节点的状态,而不是完全关闭它们。

如果您想从命令行管理 Couchbase 集群,可以使用方便的 couchbase-cli。您可以简单地使用 vagrant ssh 命令进入每个节点(按其节点名称:node1node2 等)。在那里,您可以运行集群配置命令。例如,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

云端和 Cloud Foundry 上的 Couchbase

Couchbase 非常适合在云中使用。它具有水平可扩展性(如 Gemfire 或 Cassandra),因为它没有单点故障。它不采用主从或活动/被动系统。有几种方法可以在您的应用程序运行的位置启动并运行它。如果您正在运行 Cloud Foundry 安装,则可以安装 Cumulogic 服务代理,然后允许您的 Cloud Foundry 安装与 Cumulogic 平台通信,该平台本身可以管理 Couchbase 实例。服务代理是集成代码的一部分,它可以教 Cloud Foundry 如何配置、销毁和通常与托管服务(在这种情况下为 Couchbase)交互。

使用 Spring Data Couchbase 存储 Facebook 位置

让我们来看一个简单的示例,该示例读取数据(在本例中,使用 Spring Social Facebook 的 FacebookTemplate API 从 Facebook 位置 API 读取数据),然后将其加载到 Couchbase 服务器中。

获取 Facebook 访问令牌

您还需要一个 Facebook 访问令牌。最简单的方法是访问 Facebook 开发者门户 并创建一个新应用程序,然后获取应用程序 ID 和应用程序密钥。将这两个值与管道字符 (|) 连接起来。因此,您将得到类似以下形式的内容:appID|appSecret。示例应用程序使用 Spring 的 Environment 机制来解析 facebook.accessToken 键。您可以在 src/main/resources/application.properties 文件中提供其值,或者使用任何其他受支持的 Spring Boot 属性解析机制。您甚至可以将值作为 -D 参数提供:-Dfacebook.accessToken=...|...

告知 Spring Data Couchbase 我们的集群

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 Couchbase 仓储

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 存储库中

获取 Spring 新闻

通过 Spring 新闻保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部