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>
选择 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-file
和 key-store-password
来配置密钥库文件及其密码。 对于 PEM,请使用 certificate
和 key
属性
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 客户端的 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