<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <repositories> <repository> <id>central</id> <url>https://repo.maven.apache.org/maven2</url> </repository> </repositories> <groupId>org.example</groupId> <artifactId>grpc</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.42.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.42.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.42.0</version> </dependency> <dependency> <!-- necessary for Java 9+ --> <groupId>org.apache.tomcat</groupId> <artifactId>annotations-api</artifactId> <version>6.0.53</version> <scope>provided</scope> </dependency> <!-- Protocol Buffers --> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.19.6</version> <!-- 使用最新的版本 --> </dependency> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.2</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <!--protoc命令--> <protocArtifact>com.google.protobuf:protoc:3.17.3:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.42.0:exe:${os.detected.classifier}</pluginArtifact> <!--生成服务接口service--> <outputDirectory>${basedir}/src/main/java</outputDirectory> <clearOutputDirectory>false</clearOutputDirectory> </configuration> <executions> <execution> <goals> <goal>compile</goal><!--protoc--> <goal>compile-custom</goal><!--service--> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
完整的pom.xml文档格式,然后在在maven-protobuf中先运行compile再运行compile-custom就可以生成在指定目录(每次自己要清空一下)
syntax = "proto3";
option java_multiple_files= false;
option java_package = "org.example.grpc";
option java_outer_classname = "PingPongProto";
package org.example.grpc;
message Ping {
string message = 1;
}
message Pong {
string message = 1;
}
service PingPongService {
rpc SendPing (Ping) returns (Pong);
}
这是我的proto文件
文件布局
目前还在理解grpc使用的语法规则
分布式键值对存储
1 syntax = "proto3"; 2 3 package org.keyvalue; 4 5 service KeyValueService { 6 rpc Get (GetRequest) returns (GetResponse); 7 rpc Put (PutRequest) returns (PutResponse); 8 } 9 10 message GetRequest { 11 string key = 1; 12 } 13 14 message GetResponse { 15 string value = 1; 16 } 17 18 message PutRequest { 19 string key = 1; 20 string value = 2; 21 } 22 23 message PutResponse { 24 bool success = 1; 25 }
proto文件
然后重写get和put方法
1 package org.example; 2 3 import io.grpc.stub.StreamObserver; 4 import org.keyvalue.KeyValueServiceOuterClass.*; 5 import org.keyvalue.KeyValueServiceGrpc; 6 7 import java.util.HashMap; 8 import java.util.Map; 9 10 public class KeyValueServiceImpl extends KeyValueServiceGrpc.KeyValueServiceImplBase { 11 private Map<String, String> keyValueStore = new HashMap<>(); 12 13 @Override 14 public void get(GetRequest request, StreamObserver<GetResponse> responseObserver) { 15 String key = request.getKey(); 16 String value = keyValueStore.get(key); 17 GetResponse response = GetResponse.newBuilder().setValue(value).build(); 18 responseObserver.onNext(response); 19 responseObserver.onCompleted(); 20 } 21 22 @Override 23 public void put(PutRequest request, StreamObserver<PutResponse> responseObserver) { 24 String key = request.getKey(); 25 String value = request.getValue(); 26 keyValueStore.put(key, value); 27 PutResponse response = PutResponse.newBuilder().setSuccess(true).build(); 28 responseObserver.onNext(response); 29 responseObserver.onCompleted(); 30 } 31 }
建立服务器类
1 package org.example; 2 3 import io.grpc.Server; 4 import io.grpc.ServerBuilder; 5 6 import java.io.IOException; 7 8 public class KeyValueServer { 9 public static void main(String[] args) throws IOException, InterruptedException { 10 Server server = ServerBuilder.forPort(50051) 11 .addService(new KeyValueServiceImpl()) 12 .build(); 13 14 server.start(); 15 System.out.println("KeyValueServer started"); 16 server.awaitTermination(); 17 } 18 }
建立客户端类
1 package org.example; 2 3 import io.grpc.ManagedChannel; 4 import io.grpc.ManagedChannelBuilder; 5 import org.keyvalue.KeyValueServiceOuterClass.*; 6 import org.keyvalue.KeyValueServiceGrpc; 7 8 public class KeyValueClient { 9 public static void main(String[] args) { 10 ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051) 11 .usePlaintext() 12 .build(); 13 14 KeyValueServiceGrpc.KeyValueServiceBlockingStub stub = KeyValueServiceGrpc.newBlockingStub(channel); 15 16 // 使用 stub 调用 gRPC 服务的方法 17 PutRequest putRequest = PutRequest.newBuilder().setKey("myKey").setValue("myValue").build(); 18 PutResponse putResponse = stub.put(putRequest); 19 System.out.println("Put Response: " + putResponse.getSuccess()); 20 21 GetRequest getRequest = GetRequest.newBuilder().setKey("myKey").build(); 22 GetResponse getResponse = stub.get(getRequest); 23 System.out.println("Get Response: " + getResponse.getValue()); 24 25 channel.shutdown(); 26 } 27 }
运行即可
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容