当前位置: 首页 > 科技观察

如何使用AuraDB构建Java微服务_0

时间:2023-03-15 09:01:44 科技观察

译者|陈军评论|SunShujuan在这篇文章中,我将构建一个Java微服务,它与Neo4jAuraDB的免费数据库中的图形数据进行连接和交互。该数据是Goodreads数据集的精简版,其中包含各种书籍、作者和评论的信息。虽然Book和Author类别的数据适用于MongoDB等文档数据库,但一旦我们将评论添加到组合中,我们就需要使用AuraDB来反映各种实体之间的关系,并最大限度地减少对目标实体的需求。连接查询。初步知识如果您不熟悉图形数据库,请使用以下资源补充自己:部署选项。我们可以启动一个Docker容器(就像我们之前对MongoDB项目所做的那样),或者利用具有免费层的数据库即服务,例如:AuraDB。在这个例子中,我们将首先创建自己的Neo4j数据库,然后加载数据,然后构建一个与数据库交互的微服务,并为客户端各自的服务提供API。AuraDB通常,您需要几分钟才能完成注册和创建一个免费的Neo4jAuraDB实例,包括:验证您的电子邮件地址,并等待实例启动。您可以在文章《Discover AuraDB Free》中阅读该过程的详细信息以及屏幕截图。图数据加载实例运行后,我们可以加载数据。您可以通过代码库查看各种书籍的启动文件、文件夹readme文件和加载脚本中的说明。其中,readme文件包含各种查询,方便我们验证数据。值得注意的是,虽然具有较大数据集的版本也适用于AuraDB的免费层实例,但为了快速加载,我们现在选择并保留较小的数据集。在应用服务下,我们需要通过构建应用来提取评论数据。在微服务方面,我们将构建一个带有一组REST端点的SpringBoot应用程序,以访问连接到Neo4j数据库的数据。这里,我们可以使用start.spring.i中的SpringInitializr来梳理一下项目的大纲。在表单上,??我们可以将Project、Language和SpringBoot字段保留为默认值。此外,在项目的元数据部分下,我添加了项目的组名。当然,你也可以保留默认值。虽然工件名称不太重要,但我将其命名为neo4j-java-microservice并保留所有其他字段。在Dependencies部分下,我们将需要SpringReactiveWeb、Lombok和SpringDataNeo4j。其中,SpringDataNeo4j是一个用于连接各种数据存储的SpringData项目。它帮助我们映射和访问加载到数据库中的数据。至此,工程模板已经制作完成,我们可以点击下方的Generate按钮下载工程(见下图)。注意:SpringInitializr会通过页面右栏的月亮和太阳图标来切换夜间和白天模式。由于项目下载为ZIP文件,我们可以将其解压缩并在我们喜欢的IDE中打开它。由于pom.xml文件中包含了我们在SpringInitializr上设置的依赖和软件版本,所以我们可以很容易地在src/main/resources文件夹中找到application.properties文件。在这里,我们需要使用URI和数据库凭据来连接到Neo4j实例。毕竟,对于基于云的实例,即使对这些值进行硬编码也可能允许某人意外登录并篡改我们的数据库。因此,我们通常应该避免将数据库的凭据直接嵌入到应用程序中。为此,需要使用SpringCloudConfig等项目在运行时外部化和读取配置值(例如数据库凭据)。在此示例中,我们可以将数据库URI、用户名、密码和数据库名称嵌入到属性文件中。请参考以下代码:#databaseconnectionspring.neo4j.uri=spring.neo4j.authentication.username=spring.neo4j.authentication.password=spring.data.neo4j.database=注意:除非你专门使用命令改变它的默认值,否则这里的数据库默认为neo4j。项目代码让我们浏览各个Java文件,从跨域的类开始:@Data@NodeclassReview{@Id@GeneratedValueprivateLongneoId;@NonNull私有字符串review_id;privateStringbook_id,review_text,date_added,date_updated,started_at,read_at;privateIntegerrating,n_comments,n_votes;}@Data这里是Lombok评论。它不仅可以为整个域的类生成我们需要的getter、setter、equals、hashCode和toString方法,还可以有效减少样板代码量。而@Node是SpringDataNeo4j的一个注解,会把自己标记为一个Neo4j实体类(Neo4j的每个实体都称为一个节点)。在类声明中,我们为类定义了一些属性字段。其中,@Id注解是将字段标记为唯一标识。而@GeneratedValue可以表明该值是由Neo4j内部生成的。对于review_id字段,我们有一个Lombok@NonNull注释指定该字段不能为空。此外,我们需要检索一些其他字段以获取评论文本、日期和评级信息。接下来,我们需要一个存储库接口,在其中定义与数据库中的数据交互的方法。interfaceReviewRepositoryextendsReactiveCrudRepository{FluxfindFirst1000By();}@Query("MATCH(r:Review)-[rel:WRITTEN_FOR]->(b:Book{book_id:$book_id})RETURNr;")FluxfindReviewsByBook(Stringbook_id);}我们希望这个存储库扩展ReactiveCrudRepository以使用各种响应式方法和类型处理数据。接下来,让我们定义一组方法。尽管我们可以使用SpringData的一些默认方法开箱即用地实现它们(请参阅代码示例文档--https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.core-concepts),但是,我们在这里自定义它。毕竟,由于获取所有35,342条评论会使客户端在呈现结果时过载,因此我们没有使用默认的.findAll()方法,而是只获取其中的前1,000条。而且,我们并没有实现findFirst1000By()方法(比如实现它的查询逻辑),而是使用了SpringData的另一个特性:Derived方法,即:使用Spring根据方法名构造(这是称为“派生”)查询。在这种情况下,由于我们的存储库可以使用ReactiveCrudRepository来处理评论,因此findFirst1000将查找前1,000条评论。通常,语法会根据特定标准(例如评级、审阅者和日期)不断查找结果。然而,由于我们只想提取一组随机评论,我们“欺骗”了Spring并通过简单地从方法名称中省略特定条件来获得findFirst1000By结果。我们的下一个方法——findReviewsByBook()更简单。如您所知,为了查找特定书籍的评论,我们需要按book_id进行搜索。在这里,我们使用@Query注解与数据库相关的查询语句,即Neo4j的Cypher。存储库完成后,我们可以编写控制器的类来设置一些REST端点,供其他服务访问数据。@RestController@RequestMapping("/neo")@AllArgsConstructorclassReviewController{privatefinalReviewRepositoryreviewRepo;@GetMappingStringliveCheck(){返回“Neo4jJava微服务已启动”;}@GetMapping("/reviews")FluxgetReviews(){returnreviewRepo.findFirst1000By();}@GetMapping("/reviews/{book_id}")FluxgetBookReviews(@PathVariableStringbook_id){returnreviewRepo.findReviewsByBook(book_id);}}Spring注解——@RestController这个代码块将被指定为一个REST控制器类,@RequestMapping将为该类的所有方法定义一个高级端点。如您所见,在类的声明中,我们注入了ReviewRepository以便我们可以使用编写的方法。接下来,我们为每个方法映射相应的端点。其中,liveCheck()方法使用高级/neo端点返回一个字符串,以确保我们的服务是实时的和可访问的。同时,我们可以通过添加嵌套端点(/reviews)来实现getReviews()方法。此方法使用我们在存储库中编写的findFirst1000By()方法并返回具有零到多个注释结果的反应式Flux<>类型。我们的最终方法嵌套端点/reviews/{book_id}。其中,bookid是一个路径变量,会根据要查找的书目而变化。getBookReviews()方法会将指定书籍的id作为路径变量传入,然后从存储库调用findReviewsByBook()方法,并返回带有评论的Flux<>。让我们测试现在,我们可以测试这个新服务。首先,我需要确保Neo4jAuraDB实例仍在运行。注意:AuraDB的免费套餐通常会在三天后自动暂停。为此,您需要使用实例上的“播放”图标来恢复它。接下来,我们需要通过IDE或命令行启动我们的neo4j-java-microservice应用程序。开始运行后,我们可以使用以下命令来测试应用程序:1.测试应用程序的在线状态:打开浏览器,输入localhost:8080/neo;或在命令行中输入curllocalhost:8080/neo。2.通过搜索reviews测试后台reviewapi:打开浏览器输入localhost:8080/neo/reviews;或在命令行输入curllocalhost:8080/neo/reviews。3.通过查找特定书籍的评论来测试API:打开浏览器并输入localhost:8080/neo/reviews/178186;或在命令行输入curllocalhost:8080/neo/178186。下图显示了该服务的评论api的输出:查找前1000条评论按书目查找评论总结通过以上步骤,我们使用了Neo4jAuraDB的免费层,创建了一个图形数据库实例,并为书籍、作者、并审查相关数据。接下来,我们构建了一个微服务应用程序来连接到云中的数据库并检索相关评论。最后,我们通过启动应用程序并访问每个端点来测试我们所有的代码,以确保可以正常查询数据。同时,我们在此基础上进行了扩展。其中:为了使敏感数据保密并可供多种服务访问,我们使用SpringCloudConfig外部化了数据库凭证。当然,我们也可以将这个服务添加到DockerCompose等编排工具中,实现对多个服务的协同管理。未来,我们还可以通过从数据库中提取更多相关实体来更充分地利用图数据。译者简介JulianChen,社区编辑,拥有十余年IT项目实施经验,善于把控内外部资源和风险,专注传播网络与信息安全方面的知识和经验;通过其他形式分享前沿技术和新知识;经常在线上和线下开展信息安全培训和讲座。原标题:BuildaJavaMicroserviceWithAuraDBFree,作者:JenniferReif