编辑此页面

gRPC 参考指南

在 Quarkus 中使用 gRPC

如果您需要实现 gRPC 服务或使用它,您需要 quarkus-grpc 扩展。它同时处理服务端和客户端。

使用 Maven

要启用 gRPC,请将以下依赖项添加到您的项目中

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-grpc</artifactId>
</dependency>

接下来,确保在 Quarkus Maven 插件中启用了 generate-code 阶段

<plugin>
    <groupId>${quarkus.platform.group-id}</groupId>
    <artifactId>quarkus-maven-plugin</artifactId>
    <version>${quarkus.platform.version}</version>
    <extensions>true</extensions>
    <executions>
        <execution>
            <goals>
                <goal>build</goal>
                <goal>generate-code</goal>
                <goal>generate-code-tests</goal>
            </goals>
        </execution>
    </executions>
</plugin>

使用 Gradle

对于 Gradle,请将以下依赖项添加到您的项目中

implementation 'io.quarkus:quarkus-grpc'

选择 gRPC 服务器

Quarkus 提供了两种 gRPC 服务器的实现:gRPC Java(基于 Netty)和 Vert.x。它们都支持 TLS。

基于 Vert.x 的服务器的一个优点是能够使用单个服务器来处理 HTTP 请求和 gRPC 请求。 如果您想在同一端口上公开 REST 和 gRPC 端点,这将非常有用。 gRPC Java 服务器无法做到这一点(使用单独的服务器)。

要选择 gRPC 服务器实现,请在 application.properties 文件中设置 quarkus.grpc.server.use-separate-server 属性

quarkus.grpc.server.use-separate-server=false # Use the Vert.x based server

我们建议使用基于 Vert.x 的 gRPC 服务器,因为它更灵活且更好地集成到 Quarkus 生态系统中。

您不能同时使用两个服务器。

选择 gRPC 客户端

与服务器一样,Quarkus 为 gRPC 客户端提出了两种选择:gRPC Java 和 Vert.x。 与服务器不同,您可以为每个客户端选择传输方式

quarkus.grpc.clients.hello.use-quarkus-grpc-client=true # Use client using the Vert.x based transport

虽然它不是默认设置,但我们建议使用基于 Vert.x 的客户端,因为它更灵活且更好地集成到 Quarkus 生态系统中。 它不会更改您可以使用的存根,因为它们是由 gRPC 框架生成的。 但是,它会改变客户端与服务器通信的方式。

配置 gRPC 服务的 TLS

使用基于 Vert.x 的服务器

如果您使用基于 Vert.x 的服务器,您可以通过在 application.properties 文件中设置以下属性来配置 TLS

quarkus.grpc.server.use-separate-server=false
quarkus.grpc.server.plain-text=false

quarkus.tls.key-store.p12.path=grpc-tls-keystore.p12
quarkus.tls.key-store.p12.password=*****

quarkus.http.insecure-requests=disabled

之前的配置使用了集中式 TLS 配置。 这是推荐的方法。

您还可以使用以下属性直接配置服务器

quarkus.grpc.server.use-separate-server=false

quarkus.grpc.server.plain-text=false
quarkus.http.ssl.certificate.key-store-file=target/certs/grpc-tls-keystore.p12
quarkus.http.ssl.certificate.key-store-password=*****
quarkus.http.insecure-requests=disabled

使用 JKS 或 P12 时,您可以使用 key-store-filekey-store-password 来配置密钥库文件及其密码。 对于 PEM,请使用 certificatekey 属性

quarkus.grpc.server.use-separate-server=false

quarkus.grpc.server.plain-text=false
quarkus.http.ssl.certificate.files=target/certs/grpc-tls.crt
quarkus.http.ssl.certificate.key-files=target/certs/grpc-tls.key
quarkus.http.insecure-requests=disabled
quarkus.http.insecure-requests 属性用于禁用不安全的请求。
启用 TLS 后,它将涵盖 HTTP 和 gRPC 流量。

使用 gRPC Java 服务器

如果您使用 gRPC Java 服务器,您可以通过在 application.properties 文件中设置以下属性来配置 TLS

quarkus.grpc.server.ssl.certificate=tls/server.pem
quarkus.grpc.server.ssl.key=tls/server.key

quarkus.grpc.server.plain-text=false

此服务器仅支持证书和密钥的 PEM 格式。

配置 gRPC 客户端的 TLS

对于服务器,您可以使用集中式 TLS 配置或直接配置客户端。

使用集中式 TLS 配置

使用 Quarkus(基于 Vert.x)客户端时,您可以通过在 application.properties 文件中设置以下属性来配置 TLS

quarkus.tls.trust-store.p12.path=grpc-client-truststore.p12
quarkus.tls.trust-store.p12.password=password

quarkus.grpc.clients.hello.plain-text=false
quarkus.grpc.clients.hello.use-quarkus-grpc-client=true

直接配置

使用 Quarkus(基于 Vert.x)客户端时,您可以通过在 application.properties 文件中设置以下属性来配置 TLS

quarkus.grpc.clients.hello.plain-text=false # Use TLS
quarkus.grpc.clients.hello.use-quarkus-grpc-client=true # Use client using the Vert.x based transport
quarkus.grpc.clients.hello.tls.enabled=true
quarkus.grpc.clients.hello.tls.trust-certificate-p12.path=target/certs/grpc-tls-truststore.jks
quarkus.grpc.clients.hello.tls.trust-certificate-p12.password=****

如果您使用 JKS 信任存储,请使用以下配置

quarkus.grpc.clients.hello.plain-text=false # Use TLS
quarkus.grpc.clients.hello.use-quarkus-grpc-client=true # Use client using the Vert.x based transport
quarkus.grpc.clients.hello.tls.enabled=true
quarkus.grpc.clients.hello.tls.trust-certificate-jks.path=target/certs/grpc-tls-truststore.jks
quarkus.grpc.clients.hello.tls.trust-certificate-jks.password=****

如果您使用 PEM 证书作为信任存储,请使用以下配置

quarkus.grpc.clients.hello.plain-text=false # Use TLS
quarkus.grpc.clients.hello.use-quarkus-grpc-client=true # Use client using the Vert.x based transport
quarkus.grpc.clients.hello.tls.enabled=true
quarkus.grpc.clients.hello.tls.trust-certificate-pem.certs=target/certs/grpc-client-ca.crt

使用 gRPC Java 客户端时,您可以通过在 application.properties 文件中设置以下属性来配置 TLS

quarkus.grpc.clients.hello.ssl.trust-store=target/certs/grpc-client-tls-ca.crt

gRPC Java 客户端仅支持信任存储的 PEM 格式。

配置 mTLS

您可以为 gRPC 服务和客户端配置相互 TLS (mTLS)。

使用集中式 TLS 配置

当使用 Quarkus HTTP 服务器 (quarkus.grpc.server.use-separate-server=false) 和 Quarkus gRPC 客户端 (quarkus.grpc.clients.hello.use-quarkus-grpc-client=true) 时,您可以通过在 application.properties 文件中设置以下属性来配置 mTLS

quarkus.tls.my-server.key-store.p12.path=target/certs/grpc-keystore.p12
quarkus.tls.my-server.key-store.p12.password=password
quarkus.tls.my-server.trust-store.p12.path=target/certs/grpc-server-truststore.p12
quarkus.tls.my-server.trust-store.p12.password=password

quarkus.tls.my-client.trust-store.p12.path=target/certs/grpc-client-truststore.p12
quarkus.tls.my-client.trust-store.p12.password=password
quarkus.tls.my-client.key-store.p12.path=target/certs/grpc-client-keystore.p12
quarkus.tls.my-client.key-store.p12.password=password

quarkus.grpc.clients.hello.plain-text=false
quarkus.grpc.clients.hello.tls-configuration-name=my-client
quarkus.grpc.clients.hello.use-quarkus-grpc-client=true

quarkus.http.ssl.client-auth=REQUIRED # Enable mTLS
quarkus.http.insecure-requests=disabled
quarkus.http.tls-configuration-name=my-server
quarkus.grpc.server.use-separate-server=false
quarkus.grpc.server.plain-text=false

直接配置

当使用 gRPC Java 服务器时,您可以通过在 application.properties 文件中设置以下属性来配置 mTLS:当使用基于 Vert.x 的服务器和基于 Vert.x 的客户端时,您可以通过在 application.properties 文件中设置以下属性来配置 mTLS

# Server side:
quarkus.grpc.server.use-separate-server=false
quarkus.grpc.server.plain-text=false # Force the client to use TLS for the tests
quarkus.http.ssl.certificate.key-store-file=target/certs/grpc-keystore.jks
quarkus.http.ssl.certificate.key-store-password=****
quarkus.http.ssl.certificate.trust-store-file=target/certs/grpc-server-truststore.jks
quarkus.http.ssl.certificate.trust-store-password=****
quarkus.http.ssl.client-auth=REQUIRED # Force the client to authenticate, aka mTLS
quarkus.http.insecure-requests=disabled

# Client side:
quarkus.grpc.clients.hello.plain-text=false
quarkus.grpc.clients.hello.tls.trust-certificate-jks.path=target/certs/grpc-client-truststore.jks
quarkus.grpc.clients.hello.tls.trust-certificate-jks.password=****
quarkus.grpc.clients.hello.tls.key-certificate-jks.path=target/certs/grpc-client-keystore.jks
quarkus.grpc.clients.hello.tls.key-certificate-jks.password=****
quarkus.grpc.clients.hello.tls.enabled=true
quarkus.grpc.clients.hello.use-quarkus-grpc-client=true

如果您使用 P12 格式作为信任存储和密钥证书,请使用以下配置

# Server side
quarkus.grpc.server.use-separate-server=false
quarkus.grpc.server.plain-text=false # Force the client to use TLS for the tests
quarkus.http.ssl.certificate.key-store-file=target/certs/grpc-keystore.p12
quarkus.http.ssl.certificate.key-store-password=****
quarkus.http.ssl.certificate.trust-store-file=target/certs/grpc-server-truststore.p12
quarkus.http.ssl.certificate.trust-store-password=****
quarkus.http.ssl.client-auth=REQUIRED # Force the client to authenticate, aka mTLS
quarkus.http.insecure-requests=disabled

# Client side
quarkus.grpc.clients.hello.plain-text=false
quarkus.grpc.clients.hello.tls.trust-certificate-p12.path=target/certs/grpc-client-truststore.p12
quarkus.grpc.clients.hello.tls.trust-certificate-p12.password=****
quarkus.grpc.clients.hello.tls.key-certificate-p12.path=target/certs/grpc-client-keystore.p12
quarkus.grpc.clients.hello.tls.key-certificate-p12.password=****
quarkus.grpc.clients.hello.tls.enabled=true
quarkus.grpc.clients.hello.use-quarkus-grpc-client=true

相关内容