抢占先机
VMware 提供培训和认证,以加速您的进步。
了解更多注意:您可以在此处找到此博客的工作代码
令人惊叹(如果实验性)的 Spring gRPC 项目发布了一个新版本:0.4.0 版。 我不会深入探讨所有新功能的细节,但我只想强调我很高兴使用它,并引导您逐步走向 gRPC 的快乐。 无数的小细节都恰到好处,使其成为我使用 gRPC 以来最流畅的体验!
我访问了 Spring Initializr 并选择了 GRPC
、GraalVM
和 Web
。 我喜欢 Maven,但您可以随意选择。 我选择了 Java 23,当然,因为 Java 24 将于 一两周后发布。 我认为这篇博客至少在几周内仍然会很有趣。 具体来说,我使用的是 GraalVM,它是一个 OpenJDK 发行版,支持一些额外的技巧,包括将 JVM 代码编译为特定于操作系统和架构的本机代码。
如果您使用的是 UNIX 兼容的操作系统(Windows 上的 Cygwin 和 Linux 的 Windows 子系统算在内),那么您可以尝试使用 SDKMAN 来安装和管理您的 JDK 版本。 我就是这么做的
sdk install java 23.0.2-graalce
现在,再次记住:这是 Java 23。 Java 24 将于 2025 年 3 月中旬发布! 不要落在后面。 你不想在聚会上被人嘲笑和指指点点,对吧? 升级!
Spring 已经支持我们了! Spring Initializr 抓住了我正在使用 Servlet 引擎的洞察力,添加了 Spring gRPC、Spring Boot 的 Web 支持,以及允许您在 Servlet 容器中托管 gRPC 的桥梁。 (默认情况下,Spring gRPC 通过 Netty 运行 gRPC,没有 HTTP 基础。)哦,而且它选择了 HTTP/2!
Spring Initializr 还非常有用,它配置了必要的插件,以进行代码生成,从而将 gRPC 协议缓冲区定义转换为我们可以实现的 Java 代码。 明白我说的方便是什么意思了吗? 我们甚至还没有开始编写代码,但我们可以!
编写任何 gRPC 服务的首要步骤是使用 Google Protocol Buffers 格式定义 schema。 然后,我们将 schema 转换为 Java 代码,我们可以在自己的服务中实现该代码。 确保您已安装 protoc
编译器。 您也可以安装 grpcurl
,这是一个方便的工具,用于向 gRPC 端点发出请求。
这是我的 schema。 它定义了一个简单的服务来枚举和采用 Dog
。
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.example.demo.grpc.impl";
option java_outer_classname = "AdoptionsProto";
import "google/protobuf/empty.proto";
service Adoptions {
rpc All(google.protobuf.Empty) returns (DogsResponse){}
rpc Adopt(DogAdoptionRequest) returns (google.protobuf.Empty){}
}
message Dog {
int32 id = 1;
string name = 2;
string description = 3;
string owner = 4;
}
message DogAdoptionRequest {
int32 dogId = 1;
string name = 2;
}
message DogsResponse {
repeated Dog dogs = 1;
}
要生成 Java 代码,请运行
./mvnw -DskipTests package
现在一切就绪,您可以实现您的第一个 gRPC 服务了!
package com.example.demo;
import com.example.demo.grpc.impl.AdoptionsGrpc;
import com.example.demo.grpc.impl.Dog;
import com.example.demo.grpc.impl.DogAdoptionRequest;
import com.example.demo.grpc.impl.DogsResponse;
import com.google.protobuf.Empty;
import io.grpc.stub.StreamObserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Service;
import java.util.List;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Service
class AdoptionsGrpcService extends AdoptionsGrpc.AdoptionsImplBase {
@Override
public void all(Empty request, StreamObserver<DogsResponse> responseObserver) {
responseObserver.onNext(DogsResponse.newBuilder()
.addAllDogs(List.of(
Dog.newBuilder().setName("dog1").setDescription("the goodest boy").setOwner("jlong").build(),
Dog.newBuilder().setName("dog2").setDescription("the goodest girl").setOwner("jlong").build()))
.build());
responseObserver.onCompleted();
}
@Override
public void adopt(DogAdoptionRequest request, StreamObserver<Empty> responseObserver) {
System.out.println("Adopting " + request.getName() + " " + request.getDogId());
responseObserver.onNext(Empty.getDefaultInstance());
responseObserver.onCompleted();
}
}
要启用虚拟线程,请将以下内容添加到 src/main/resources/application.properties
spring.threads.virtual.enabled=true
现在,让我们编译一个 GraalVM 本机镜像!
要编译一个在本机操作系统上运行的本机镜像,请运行
./mvnw -DskipTests -Pnative native:compile
要创建 Docker 镜像(需要运行 Docker),请运行
./mvnw -DskipTests -Pnative spring-boot:build-image
现在,让我们测试一下
grpcurl -plaintext localhost:8080 Adoptions.All
如果一切正常,恭喜您构建了您的第一个以 Spring gRPC 为中心的应用程序! 祝您生产之旅愉快! 🚀