一、什麼是gRPC
gRPC是一個高性能、開源和通用的遠程過程調用(RPC)框架,由Google開發並已在生產環境中廣泛使用。以下是gRPC的一些主要特點:
1、gRPC是基於HTTP2協議設計的,具有較低的網絡延遲和更高的吞吐量。
public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
String message = "Hello " + request.getName() + "!";
HelloReply reply = HelloReply.newBuilder().setMessage(message).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
上述代碼是一個最基本的gRPC服務的示例。HelloServiceImpl類繼承了autogenerated的grpc定義文件中的HelloServiceImplBase類,實現了sayHello方法,該方法接收HelloRequest類型的request參數和返回HelloReply類型的response。
2、gRPC可支持多種語言,包括Java、C++、Python、Objective-C、PHP等。
3、gRPC提供了多種認證和授權機制,包括SSL/TLS、Token認證等。
4、gRPC可以自動生成數據訪問層和服務端的代碼,避免了手動寫大量的模板代碼。
二、gRPC的優勢
與傳統的RESTful API相比,gRPC的優勢在哪裡?
1、更高效:gRPC使用Protocol Buffers作為默認的數據序列化協議,佔用的網絡帶寬更少,且序列化和反序列化的速度更快。
2、更便捷:gRPC使用標準的Protocol Buffers定義了方法和參數類型,通過自動生成代碼,可以大大減少編寫和維護代碼的工作量。
3、更強大:gRPC支持流式API和客戶端流、服務端流、雙向流式、HTTP/2 協議,並且可以非常容易地切換數據壓縮算法,從而提升網絡性能。
三、使用gRPC構建Java應用程序
以下是一個使用gRPC構建Java應用程序的示例。
1、引入gRPC依賴:
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.30.2</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.30.2</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.30.2</version>
</dependency>
2、定義.proto文件:
syntax = "proto3";
option java_package = "com.example.grpc";
option java_multiple_files = true;
package com.example.grpc;
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
service HelloService {
rpc sayHello (HelloRequest) returns (HelloReply) {}
}
3、使用protobuf插件生成Java代碼:
protoc --java_out=./src/main/java ./src/main/proto/greeting.proto
4、實現gRPC服務:
public class GrpcServer {
private static final Logger LOGGER = LoggerFactory.getLogger(GrpcServer.class);
public static void main(String[] args) throws Exception {
final GrpcServer server = new GrpcServer();
server.start();
server.blockUntilShutdown();
}
private final int port;
private final Server server;
private GrpcServer() throws IOException {
this.port = 50051;
ServerBuilder<?> serverBuilder = ServerBuilder.forPort(port);
server = serverBuilder.addService(new HelloServiceImpl()).build();
}
private void start() throws IOException {
server.start();
LOGGER.info("Server started, listening on {}", port);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.err.println("*** shutting down gRPC server since JVM is shutting down");
GrpcServer.this.stop();
System.err.println("*** server shut down");
}
});
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
}
5、使用gRPC客戶端調用服務:
public class GrpcClient {
private static final Logger LOGGER = LoggerFactory.getLogger(GrpcClient.class);
public static void main(String[] args) throws Exception {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();
HelloServiceGrpc.HelloServiceBlockingStub blockingStub = HelloServiceGrpc.newBlockingStub(channel);
HelloResponse response = blockingStub.sayHello(HelloRequest.newBuilder().setName("World").build());
LOGGER.info(response.getMessage());
channel.shutdown();
}
}
四、總結
gRPC是一個高性能、開源和通用的遠程過程調用(RPC)框架,使用Protocol Buffers作為默認的數據序列化協議,佔用的網絡帶寬更少,且序列化和反序列化的速度更快。與傳統的RESTful API相比,gRPC更高效、更便捷、更強大。使用gRPC構建Java應用程序需要定義.proto文件,使用protobuf插件生成Java代碼,並實現gRPC服務和gRPC客戶端。
原創文章,作者:XTLT,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/143476.html