Quarkus
针对使用 Quarkus 并希望利用预配置的 Java 驱动程序实例以及 OGM 集成的 Java 开发人员。请查阅链接的文档以获取更多信息。
-
具备一定的 Quarkus 知识/经验。
-
对于此库,请使用 JDK 17 或更高版本、较新版本的 Maven,以及您喜欢的 IDE。
-
如果您想在本地运行 Neo4j 数据库,还需要安装 Docker。
入门
在接下来的几个部分中,我们将逐步介绍使用 Neo4j 创建 Quarkus 应用程序的所有步骤。
您可以从 GitHub 获取电影示例项目
git clone https://github.com/sdaschner/movies-java-quarkus/
cd movies-java-quarkus/
构建与本地运行
您可以通过 Maven 构建项目
mvn package
此外,您可以执行集成测试,该测试通过 Testcontainers 启动一个本地 Neo4j 实例
mvn test-compile failsafe:integration-test failsafe:verify
您可以通过可执行 JAR 运行 Quarkus 应用程序
java -jar target/quarkus-app/quarkus-run.jar
这将启动您的 Quarkus 应用程序,随后可在 https://:8080/ 访问
现在,您可以尝试一下并探索电影查询示例。
本地运行数据库
默认情况下,该示例运行在 https://demo.neo4jlabs.com:7473 提供的公共数据库上
您还可以通过 Docker 容器在示例项目中运行本地 Neo4j 数据库。为此,请执行 ./run-graph-db.sh 脚本,并更改 src/main/resources/application.properties 下的 Quarkus 应用程序属性。
# run in a separate shell, starts up a Docker container from neo4j:4.4.12
./run-graph-db.sh
quarkus.neo4j.uri=bolt://:7687
quarkus.neo4j.authentication.username=neo4j
quarkus.neo4j.authentication.password=test
Quarkus 开发模式
为了改善开发体验并快速更改代码,您可以使用 Quarkus 的开发模式,该模式与 Neo4j 和 Neo4j OGM 扩展兼容
mvn quarkus:dev
这也会在 8080 端口启动您的应用程序,但保持与源代码的连接并允许快速重新部署。
恭喜!现在您已具备开发带有 Neo4j 的 Quarkus 应用程序所需的一切。
以下内容将解释我们的 Quarkus 应用程序如何访问 Neo4j 数据库,以及如何集成 OGM 映射。
理解示例
我们的 Quarkus 应用程序使用了 Neo4j-OGM Quarkus 扩展,如果您想使用 对象图映射器 (OGM),我们推荐使用它。
pom.xml 中包含了此依赖项,它会传递性地添加 Neo4j Quarkus 扩展和 OGM 依赖项
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-quarkus</artifactId>
<version>1.5.1</version>
</dependency>
包含此项后,您的 Quarkus 应用程序将配置 Neo4j 驱动程序,并将 OGM 映射会话工厂设置为可注入的 Bean。
您可以在以下类中了解 OGM 会话工厂的使用方法
@ApplicationScoped
public class Searches {
@Inject
SessionFactory sessionFactory;
public List<Movie> searchMoviesByTitle(String title) {
Session session = sessionFactory.openSession();
Iterable<Movie> iterable = session.query(Movie.class, "MATCH (movie:Movie) WHERE movie.title CONTAINS $title RETURN movie", Map.of("title", title));
// [...]
}
}
领域实体(如 Movie)被声明为 OGM 节点实体类
@NodeEntity
public class Movie {
@Id
public String title;
public String tagline;
public Integer released;
public int votes;
@Relationship(value = "DIRECTED", direction = INCOMING)
@JsonbTypeSerializer(PersonNamesSerializer.class)
public Set<Person> directors = new HashSet<>();
@Relationship(value = "WROTE", direction = INCOMING)
@JsonbTypeSerializer(PersonNamesSerializer.class)
public Set<Person> writers = new HashSet<>();
@Relationship(value = "PRODUCED", direction = INCOMING)
@JsonbTypeSerializer(PersonNamesSerializer.class)
public Set<Person> producers = new HashSet<>();
@Relationship(value = "REVIEWED", direction = INCOMING)
@JsonbTypeSerializer(ReviewsSerializer.class)
public Set<Review> reviewers = new HashSet<>();
@Relationship(value = "ACTED_IN", direction = INCOMING)
@JsonbTypeSerializer(ActsSerializer.class)
public Set<Act> actors = new HashSet<>();
}
有关更详细的说明,请参阅 对象图映射器文档。@JsonbTypeSerializer 注解控制实体对象如何映射为 JSON,以供 JAX-RS REST 端点使用。
您可以跟随 MovieResource、SearchResource、ActorsResource 和 GraphResource JAX-RS 类中的代码来理解各个用例。
4.0 版本中添加的另一个有用的 OGM 功能是 DTO 类和 Java Record 的映射。这些类型从任意查询结果中映射,相应的类不需要进行注解。有关示例,请参阅 Persons 类以及 session.queryDto() 方法的使用
@ApplicationScoped
public class Persons {
@Inject
SessionFactory sessionFactory;
public List<ActorRecommendation> recommendCoActor(String name) {
Session session = sessionFactory.openSession();
return session.queryDto(" MATCH (actor:Person {name: $name}) [...] " +
" [...] " +
" RETURN cocoActors.name AS actor, count(*) AS strength ORDER BY strength DESC",
Map.of("name", name), ActorRecommendation.class);
}
}
public record ActorRecommendation(String actor, long strength) {
}
Quarkus Neo4j 功能
接下来,我们将查看 Quarkus 和 Neo4j 提供的集成功能。
驱动程序集成
Quarkus Neo4j 集成的目标是提供获取 Neo4j 驱动程序托管实例的支持。您可以通过 Quarkus 配置机制(通常在 application.properties 文件中)提供驱动程序属性来配置您的应用程序。最终,您将获得一个可注入的驱动程序实例,可用于
@Inject
Driver driver;
在业务操作代码库中。
| 您可能已经注意到,我们的电影示例中没有使用这种注入方式,而是注入了 OGM 会话工厂。两者均可工作,具体选择哪种方式取决于您的用例和应用程序设置。 |
除了创建托管驱动程序 Bean 外,集成还为驱动程序以及与您的 Neo4j 实例的连接暴露了健康指标。
在现有的 Quarkus 应用程序中,您需要在项目中添加 quarkus-neo4j 依赖项。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-neo4j</artifactId>
</dependency>
| 如果您正在使用 Neo4j-OGM 扩展,该依赖项将被传递性地包含,无需显式声明。 |
您可以根据需要配置基本连接参数。
quarkus.neo4j.uri = bolt://:7687
quarkus.neo4j.authentication.username = neo4j
quarkus.neo4j.authentication.password = secret
健康检查集成
如果您想使用健康检查,则需要额外的 quarkus-smallrye-health 依赖项。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-health</artifactId>
</dependency>
指标集成
对于指标支持,您需要声明 MicroMeter(Quarkus 推荐)或 SmallRye Metrics(仅在确实需要 MicroProfile 规范时)依赖项。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-micrometer-registry-prometheus</artifactId>
</dependency>
Neo4j 的指标必须在 application.properties 中手动启用。
quarkus.neo4j.pool.metrics-enabled = true
OGM 集成
您的 Quarkus 应用程序可以与 Neo4j OGM 集成,以便为您的领域实体提供声明式对象映射。目前有一个官方的 Quarkus 扩展 可用,除非有特殊原因,否则我们建议使用它。
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-quarkus</artifactId>
<version>1.5.1</version>
</dependency>
<!-- with this, you can remove io.quarkus:quarkus-neo4j from your pom.xml again -->
此依赖项传递性地包含了 Neo4j OGM 和 Quarkus Neo4j 依赖项,因此它是您 pom.xml 中唯一需要的 Neo4j 依赖项。
Neo4j-OGM Quarkus 依赖配置了 OGM 会话工厂,并使其作为 Bean 可注入
@Inject
SessionFactory sessionFactory;