Quarkus

针对使用 Quarkus 并希望利用预配置的 Java 驱动程序实例以及 OGM 集成的 Java 开发人员。请查阅链接的文档以获取更多信息。

我们将涵盖的内容

  • 电影示例应用程序

  • Quarkus Neo4j 驱动程序集成

  • Neo4j OGM 集成

  • 健康检查与指标支持

入门

在接下来的几个部分中,我们将逐步介绍使用 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 application.properties
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 依赖项

Neo4j-OGM Quarkus 依赖
<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 端点使用。

您可以跟随 MovieResourceSearchResourceActorsResourceGraphResource 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 application.properties
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 规范时)依赖项。

MicroMeter (Prometheus) 依赖
<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 扩展 可用,除非有特殊原因,否则我们建议使用它。

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;

资源

Quarkus 文档

Neo4j 集成, 配置属性, 指南

Neo4j-OGM Quarkus 扩展

GitHub

示例

Quarkus 示例, Quarkus 电影示例应用程序