grpc初使用

<?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 }

运行即可

 

posted @ 2024-01-06 21:30  小菜碟子  阅读(16)  评论(0编辑  收藏  举报