如何使用Java可观察性进行有效编码

news2025/1/13 2:54:43

无论您是经验丰富的开发人员、还是数据库管理员、亦或NoSQL数据库的爱好者,可能已经注意到,在如今快速发展的企业架构格局中,MongoDB和Couchbase已成为NoSQL数据库的两大典型竞品。

本文将通过展示在真实企业架构中使用MongoDB和Couchbase的Java示例,和您一起探索两者之间的关键差异,各自独有的优势和不足,以及如何在它们之间快速切换,以确保无缝地适应项目的动态需求。

NoSQL文档数据库

让我们首先对NoSQL文档数据库,以及基本的存储和检索原理有所理解。NoSQL数据库采用灵活的模式和JSON/BSON文档格式,以适应不断变化数据的需求。NoSQL数据库,也被称为“Not Only SQL”,旨在解决传统关系数据库的局限性。与具有固定模式的结构化表的关系数据库不同,NoSQL数据库提供了一个灵活的无模式(schema-less)数据模型。在NoSQL类别中,文档数据库直接在文档中存储和检索数据。如下图所示,它们通常表现为类似JSON的对象或BSON(Binary JSON)文档。通过嵌套结构,这些文档能够高度适应不断变化的数据需求。

Couchbase

作为领先的NoSQL文档数据库,Couchbase在性能、可扩展性和可用性方面非常出色。它结合了分布式键值存储和面向文档的数据库功能,能够在多个节点和数据中心之间提供无缝的水平扩展。凭借其强大的一致性模型,Couchbase可以处理具有低延迟和高吞吐量需求的大规模应用。同时,它也能够提供强大的移动和边缘计算支持,并已成为了需要横跨不同设备进行数据同步的应用项目的理想选择。

Couchbase的优势

  • 高性能:Couchbase的分布式架构和内存优先的存储引擎,可以提供卓越的性能。即使在重负载下,它也能确保低延迟的数据访问。其高效的缓存机制优化了读写操作,可以为高吞吐量应用实现无缝的扩展。
  • 可扩展性:Couchbase的自动分片和多维扩展功能,可以轻松地实现水平扩展。它能够在多个节点和集群之间快速扩展,并在不影响性能的情况下,满足不断增长的数据和用户需求。
  • 强大的一致性:带有多维扩展(Multi-Dimensional Scaling,MDS)的Couchbase带有强大的一致性,提供了关键应用所需的ACID属性,并确保了适用于关键任务用例的数据完整性和可靠性。
  • 内置的全文搜索:Couchbase集成了强大的全文搜索引擎,使得开发人员能够快速地对非结构化数据执行复杂的搜索与查询。该内置功能不但简化了开发,而且增强了应用的搜索能力。
  • 移动和边缘计算支持:由Couchbase提供的Couchbase Lite,是一个专为移动和边缘计算设计的嵌入式NoSQL数据库。它通过横跨设备的无缝数据同步,实现了离线访问和实时更新,并已成为了移动应用和物联网用例的理想选择。

MongoDB

作为另一款著名的NoSQL文档数据库,MongoDB以其易用性、灵活性和强大的查询功能而广受欢迎。它能够将数据存储到类似JSON的BSON文档中,并提供动态的进化模式。MongoDB的设计非常适合敏捷开发。开发人员能够通过快速迭代,来适应不断变化的应用需求。凭借着水平扩展功能,以及丰富的工具和库生态系统,MongoDB已成为了从Web应用到大数据实时分析等用例的热门选择。

MongoDB的优势

  • 灵活的模式:MongoDB的无模式设计,允许开发人员实时地调整数据结构,促进敏捷开发,以适应不断变化的应用需求,且无需迁移数据库模式。
  • 水平可扩展性:MongoDB对于水平扩展和自动分片的原生支持,使得应用能够毫不费力地处理大量数据、以及并发的用户请求。随着用户群的扩大,它能够确保应用的无缝增长。
  • 丰富的查询语言:MongoDB查询语言(MQL)提供了一种灵活且富有表现力的方式,来检索和操作数据。凭借针对复杂查询和强聚合管道的支持,开发人员可以根据自己的需求去定制响应。
  • 复制和高可用性:MongoDB的副本集架构确保了横跨多个节点的自动数据复制,并保证了数据的冗余和高可用性。在主节点出现故障时,辅助节点可以迅速接管,并最大限度地减少宕机时间。
  • 敏捷开发:MongoDB的易用性、直观的API、以及简单的设置,都促进了快速原型和开发周期。开发人员可以快速地通过迭代和测试,来缩短新功能和应用的面市时间。

Couchbase和MongoDB之间的共同点

总的说来,Couchbase和MongoDB都有着如下核心功能和属性:

  • 文档存储:两种数据库都能够将数据存储在灵活、无模式的文档中,并支持直接的数据表示和操作。
  • 水平可扩展性:它们都允许应用在多个节点上分发数据,并确保高可用性和容错性。
  • 分布式架构:两种数据库都可以在分布式环境中运行,并提供跨集群的无缝数据复制和分发。
  • JSON/BSON支持:两者都使用类似JSON的BSON文档,作为其主要的数据格式,以确保与现代应用架构的兼容性。
  • 丰富的查询功能:它们提供了强大的查询语言,实现了高效的检索和数据操作。

下面,让我们来探讨一下每个数据库的不足:

Couchbase的不足

  • 复杂性:设置和配置Couchbase集群可能会比MongoDB更加复杂,特别是在大规模部署过程中。
  • 学习曲线:由于附带有各种高级功能和概念,因此Couchbase的新手开发人员可能会面临更加陡峭的学习曲线。
  • 社区和生态系统:虽然Couchbase有一个不断增长的社区和生态系统,但是它目前尚不及MongoDB那么广泛,因此导致了资源和社区驱动型解决方案会少一些。

MongoDB的不足

  • 数据一致性:MongoDB的默认一致性模型,可能不适合那些需要强一致性的应用,因此需要事先仔细设计和考虑。
  • 联合操作:MongoDB缺乏对于传统SQL的支持,这会导致规范化复杂数据和应用端处理的增加。
  • 内存使用率:MongoDB的内存使用率相对比较高,特别是在处理大量索引或数据集时,这可能会影响到整体性能。

如何在Couchbase和MongoDB之间进行选择,主要取决于具体的项目要求、现有的技术堆栈,以及对于一致性、可扩展性和易用性的需求。下面的表格对比了两种数据库的特点,可方便架构师和开发人员根据其应用的独特需求、以及性能目标,做出明智的决策。

特点

COUCHBASE

MONGODB

查询语言

N1QL(类似SQL)

MongoDB查询语言(MQL)

一致性模型

强一致性

最终一致性(可配置)

分片机制

自动和手动分片

自动分片

聚合框架

提供(使用N1QL)

提供

联合

支持(使用N1QL)

不支持(需要去规范化)

真实应用场景比较

下面,我将通过在真实的Java企业应用场景中,使用Couchbase、MongoDB、以及Jakarta NoSQL规范,来讨论两种数据库如何通过其独特的功能,来执行查询,管理一致性,以及处理聚合。我们将创建一个啤酒工厂应用,来高效地管理啤酒送货地址和用户信息。该应用将在Open Liberty服务器上运行,并能够与Jakarta EE 10或Eclipse MicroProfile 6相兼容。

首先,我们将使用Jakarta EE Starter或Eclipse MicroProfile Starter来创建项目,然后添加所需的依赖项。有了Jakarta NoSQL的广泛数据库支持,我们可以通过下列代码段,将Couchbase和MongoDB添加到Maven依赖列表中。

XML
<dependency>

 <groupId>org.eclipse.jnosql.databases</groupId>

 <artifactId>jnosql-couchbase</artifactId>

 <version>${jnosql.version}</version>

</dependency>

<dependency>

 <groupId>org.eclipse.jnosql.databases</groupId>

 <artifactId>jnosql-mongodb</artifactId>

 <version>${jnosql.version}</version>

</dependency>

设置好依赖项后,我们将在microprofile-config.properties文件中配置凭据。此外,我们将使用系统环境配置,去覆盖Eclipse MicroProfile的配置。当类路径(classpath)中存在多个选项时,jnosql.document.provider键将确保我们选择合适的文档提供程序。请参见如下代码段:

Properties files
jnosql.couchbase.host=couchbase://localhost
jnosql.couchbase.user=root
jnosql.couchbase.password=123456
jnosql.document.database=factory
jnosql.mongodb.host=localhost:27017
#for use couchbase uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration

该应用的核心在于实体创建,我们在其中定义了Beer实体,以及嵌套式Address的子文档结构。

Java
@Entity("beer")
public class Beer {

 @Id
 private String id;

 @Column
 private String name;

 @Column
 private String style;

 @Column
 private String hop;

 @Column
 private String yeast;

 @Column
 private String malt;

 @Column
 private Address address;

 @Column
 private String user;
}

@Entity
public class Address {

 @Column
 private String city;

 @Column
 private String country;

}

在实体准备就绪后,我们将使用Template和DocumentTemplate在Java应用和数据库之间建立通信。利用Jakarta Data的存储库界面上,我们将实现有效的数据库交互,并在Beer实体上执行CRUD操作。

Java
@ApplicationScoped
@Path("beers2")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class BeerTemplateResource {

 private final DocumentTemplate template;

 @Inject
 public BeerTemplateResource(DocumentTemplate template) {
 this.template = template;
 }

 @Deprecated
 BeerTemplateResource() {
 this(null);
 }


 @GET
 public List<Beer> findByAll(@BeanParam BeerParam param){

 if(param.isMaltAndHopQuery()){
 return this.template.select(Beer.class).where("malt")
 .eq(param.malt())
 .and("hop")
 .eq(param.hop())
 .result();
 }
 else if(param.isHopQuery()) {
 return this.template.select(Beer.class).where("hop")
 .eq(param.hop())
 .result();
 }
 else if(param.isMaltQuery()) {
 return this.template.select(Beer.class).where("malt")
 .eq(param.malt())
 .result();
 }
 return this.template.select(Beer.class).result();
 }

 @POST
 public void create(Beer beer){
 this.template.insert(beer);
 }

 @DELETE
 @Path("{id}")
 public void deleteById(@PathParam("id") String id){
 this.template.delete(Beer.class).where("id").eq(id).execute();
 }

 @Path("random")
 @POST
 public void random() {
 var faker = new Faker();
 for (int index = 0; index < 1_000; index++) {
 var beer = Beer.of(faker);
 this.template.insert(beer);
 }
 }

}

MongoDB的配置和运行

配置完这两种数据库后,我们将为该项目设置MongoDB和Couchbase。对于MongoDB而言,为了简单起见,我们可以使用如下命令来调用单个Docker容器:

Shell
docker run -d --name mongodb-instance -p 27017:27017 mongo

接着,我们通过注释Couchbase行和取消注释MongoDB行,来修改属性文件,以将MongoDB设置为provider:

Properties files
#for use couchbase uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration

设置好MongoDB后,我们后续便可以按需使用它了。

Couchbase的配置和运行

我们遵循类似的方法,转移到Couchbase上,并使用如下命令创建单个Docker容器,以进行测试:

Shell
docker run -d --name db -p 8091-8097:8091-8097 -p 9123:9123 -p 11207:11207 -p 11210:11210 -p 11280:11280 -p 18091-18097:18091-18097 couchbase

鉴于Couchbase需要更多的配置,您可以通过浏览器访问其用户界面(UI),以轻松地定义各种所需的参数:

  1. 访问http://localhost:8091/ui/index.html。
  2. 选择Setup New Cluster。
  3. 将root定义为管理员用户名。
  4. 将123456定义为密码。
  5. 将localhost设置为集群名称。
  6. 接受条款和条件。
  7. 导航到Buckets会话。
  8. 使用“Add Bucket(添加桶)”选项创建一个名为beers的桶。
  9. 点击beers,将Hero和Villain添加为collections(收藏)。
  10. 转到Query(查询)会话并执行:CREATE PRIMARY INDEX `#primary` ON `factory`.`_default`.`beer`。

在具体配置中,我们需要利用如下代码执行与前面相反的操作:

Properties files
#for use couchbase uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration

一旦MongoDB和Couchbase准备就绪,我们便可以利用Jakarta NoSQL的功能,以及Java与这两种NoSQL数据库的无缝交互,来开发啤酒工厂应用了。

使用API

我们基于上述数据库的相关定义和设置,使用如下Maven命令来构建项目:

Shell
mvn clean package

并使用如下Maven命令来运行应用:

Shell
java -jar target/eclipse-store.jar

我们可以使用任何HTTP客户端(在此,我们将使用curl),来测试应用运行情况。

1.我们使用如下命令,来生成啤酒的随机数据:

Shell
curl --location --request POST 'http://localhost:9080/beers/random'

2.使用如下命令获取所有的啤酒信息:

Shell
curl --location 'http://localhost:9080/beers/'

3.通过如下命令,我们根据特定请求(例如,啤酒“Magnum”或麦芽“Vienna”)来过滤啤酒:

Properties files
curl --location 'http://localhost:9080/beers/?page=1&hop=Magnum'
curl --location 'http://localhost:9080/beers/?page=1&hop=Magnum&malt=Vienna'

通过执行上述命令,我们可以测试在企业应用开发中,不同NoSQL数据库的能力与效率。

小结

综上所述,我们体验了在Jakarta EE生态系统中,使用NoSQL数据库轻松实现标准化注释、API和Jakarta 数据存储库的简单开发过程。可以说,Jakarta NoSQL促进了MongoDB和Couchbase之间的无缝切换能力,使得我们能够根据项目的实际要求,在两种数据库之间轻松地转换,并通过一些简单的配置更改,以获取两种数据库各自的最佳性能和可扩展性,进而实现了与应用的流畅交互。

开发界的强者

JNPF,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

低代码是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。

官网:http://www.jnpfsoft.com/?csdn ,如果你有闲暇时间,可以做个知识拓展。

它是一款基于Java Boot/.Net Core构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3。

为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud教程 | 第四篇:断路器(Hystrix)

在微服务架构中&#xff0c;根据业务来拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff08;RPC&#xff09;&#xff0c;在Spring Cloud可以用RestTemplateRibbon和Feign来调用。为了保证其高可用&#xff0c;单个服务通常会集群部署。由于网络原因或者自身…

07-Vue基础之综合案例——小黑记事本

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

高斯分布(正态分布)详解

高斯分布 一、概念二、详解和例子说明三、判断数据是否服从高斯分布四、高斯分布实际应用 一、概念 定义&#xff1a;随机变量X服从一个数学期望 μ \mu μ、方差为 σ \sigma σ的高斯分布&#xff0c;又名正态分布。当μ 0,σ 1时的正态分布是标准正态分布。 高斯分布概率…

使用Matlab coder 生成函数‘referencePathFrenet’ 对应C/C++代码含有超大数组

嵌入式需要使用C/C集成&#xff0c;开发使用Matlab&#xff0c;然后使用 coder 生成函数‘referencePathFrenet’ 生成了对应的C/C代码&#xff0c;然而C代码含有大量超大数组导致嵌入式无法集成&#xff1a; 分析Matlab 源代码发现是dclothoid.m 里面路径插值的时候默认使用了…

制作一个专属于安防监控业的小程序商城

随着科技的发展和人们生活水平的提高&#xff0c;安防监控设备在我们的日常生活中起到了越来越重要的作用。因此&#xff0c;建立一个安防监控设备商城小程序就变得尤为重要。下面将介绍如何建立这样一个小程序。 第一步&#xff0c;登录乔拓云平台后台&#xff0c;进入商城管理…

奇怪的没有文件或目录(Deepin+富瀚微)

最近在Linux下进行一些开发&#xff0c;遇到了问题。从UOS折腾到Deepin&#xff0c;最终在参考如下链接完成&#xff0c;非常感谢&#xff0c;记录下来&#xff0c;希望对后面的学习者有帮助。作者使用的可能是ubuntu&#xff0c;我使用的是deepin。我安装的是富瀚微的工具链。…

【Linux】【驱动】第一个相对完整的驱动编写

【Linux】【驱动】第一个相对完整的驱动编写 续1.驱动部分的代码2 app 代码3 操作相关的代码 续 这个章节会讲述去直接控制一个GPIO&#xff0c;高低电平。 因为linux不允许直接去操作寄存器&#xff0c;所以在操作寄存器的时候就需要使用到函数&#xff1a;ioremap 和iounma…

RedisTemplate和StringRedisTemplate的区别、对比

学习 Jedis、RedisTemplate、StringRedisTemplate之间的比较 博客中提到&#xff1a;一. Jedis是Redis官方推荐的面向Java的操作Redis的客户端。 二. RedisTemplate,StringRedisTemplate是SpringDataRedis中对JedisApi的高度封装。SpringDataRedis相对于Jedis来说可以方便地更…

Qt+C++动力监控动画仿真SCADA上位机

程序示例精选 QtC动力监控动画仿真SCADA上位机 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC动力监控动画仿真SCADA上位机>>编写代码&#xff0c;代码整洁&#xff0c;规则…

心理与神经生物工程交叉学科国际论坛—暨第17届复合医学工程国际会议(CME2023)

心理与神经生物工程交叉学科国际论坛—暨第17届复合医学工程国际会议&#xff08;CME2023&#xff09; International Forum on the Intersection of Psychology and Neuromedical Engineering -17th International Conference on Complex Medical Engineering (CME2023) 心…

字节跳动 从需求到上线全流程 软件工程流程 需求评估 MVP

走进后端开发流程 整个课程会带大家先从理论出发&#xff0c;思考为什么有流程 大家以后工作的团队可能不一样&#xff0c;那么不同的团队也会有不同的流程&#xff0c;这背后的逻辑是什么 然后会带大家按照走一遍从需求到上线的全流程&#xff0c;告诉大家在流程的每个阶段&am…

功率放大器在电子实验中的作用是什么

功率放大器在电子实验中扮演着重要的角色&#xff0c;它具有多种作用和应用。在本文中&#xff0c;我们将详细介绍功率放大器在电子实验中的作用。 信号放大&#xff1a;功率放大器能够将输入信号的功率放大到更高的水平。在电子实验中&#xff0c;信号放大是非常常见的需求。通…

冒险岛 vcruntime140.dll 丢失问题的多种方法,几种解决方法都有效

当您尝试启动冒险岛游戏时&#xff0c;可能会遇到一个名为“vcruntime140.dll 丢失”的错误提示。vcruntime140.dll 是冒险岛游戏所需的一个重要系统文件&#xff0c;如果系统无法找到或加载该文件&#xff0c;您将无法正常启动游戏。在本文中&#xff0c;我们将详细介绍解决冒…

用友T3T6登录报错检测公共组件softcop.dll时未能通过,公共组件可能被破坏。

导致原因&#xff0c;windows 10操作系统&#xff0c;预制验证证书更新故障。 操作系统原因导致的。大量客户报错。 临时解决方法&#xff1a;把电脑系统日期改为 2023-08-01日以前。 根治解决方法&#xff0c;重置windows 预制证书&#xff0c;刷新签名证书。

【C++/C 实现球球大作战】

目录 1.引言2.游戏设计&#xff1a;概述游戏的玩法和操作方式。3.游戏实现&#xff08;1&#xff09;函数 GameInit() 初始化游戏的函数。&#xff08;2&#xff09;函数 GameDraw() 用于绘制游戏场景的函数。&#xff08;3&#xff09;函数 keyControl(int speed) 负责处理键盘…

新能源汽车技术的最新进展和未来趋势

文章目录 电池技术的进步智能驾驶与自动驾驶技术充电基础设施建设新能源汽车共享和智能交通未来趋势展望结论 &#x1f389;欢迎来到AIGC人工智能专栏~探索新能源汽车技术的最新进展和未来趋势 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客…

请注意:名字里千万不要有凶数

人与人之间相处&#xff0c;最重要的就是信任二字。 而被人相信和被人欣赏一样&#xff0c;都是值得我们喜乐和感动的事情。 曾经&#xff0c;峰民在常德工作室接待一位预约福主&#xff0c; 这位福主一见面就给了峰民一个感恩红包&#xff0c;峰民非常感动。 这位福主是非常的…

RISC-V公测平台发布 · 在SG2042上配置Jupiter+Octave科学计算环境

简介 JupyterHub是一个开源的共享计算平台&#xff0c;它为每个用户管理一个单独的 Jupyter 环境&#xff0c; 可以用于学生班级、企业数据科学小组或科学研究小组。它是一个多用户中心&#xff0c;可以生成、管理和代理多个单用户Jupyter笔记本服务器的实例。 GNU Octave是一…

分布式下的session共享问题

首页我们确定在分布式的情况下session是不能共享的。 1.不同的服务&#xff0c;session不能共享&#xff0c;也就是微服务的情况下 2.同一服务在分布式情况&#xff0c;session同样不能共享&#xff0c;也会是分布式情况 分布式下session共享问题解决方案(域名相同) 1.session复…

基于 Android 剧院购票APP的开发与设计

摘要&#xff1a;近年来&#xff0c;随着社会的发展和科技方面的创新&#xff0c;越来越多的人选择使用手机应用程序来购买剧场票。本文将探讨基于 Android 平台的剧院购票应用程序的开发和设计。该应用程序将为用户提供浏览剧场列表、查看剧场详情、选择座位并购买剧场票的功能…