RPC simple exemplary frame --gRPC
Others
2020-01-11 00:41:01
views: null
RPC simple exemplary frame --gRPC
1 Introduction
- Google gRPC is a RPC framework
- Official Website: GRPC
- The main support: C / C ++, C #, Dart, GO, Java, Objective-C, Python, PHP, Ruby, Node.js
- mainly composed of two parts gRPC
- Remote Procedure Call
- Data serialization / deserialization (Protocol Buffers)
2. Convert * .proto agreement document language source file
- Install Maven plugin (for compiling * .proto file)
<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>
<protocArtifact>com.google.protobuf:protoc:3.10.0:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.25.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- My_protocol.proto written document ( official IDL description )
syntax = "proto3";
// 包名
package com.skey.grpcdemo.grpc;
option java_package = "com.skey.grpcdemo.grpc";
//option java_outer_classname = "PersonProto";
option java_multiple_files = true;
// 定义一个JavaBean
message Person {
int32 id = 1;
string name = 2;
int32 age = 3;
}
// 定义一个请求
message MyRequest {
int32 id = 1;
}
// 定义一个响应
message MyResponse {
int32 statusCode = 1;
Person person = 2;
}
// 编译一个RPC服务
service PersonService {
// 定义一个方法getPeronById,传入MyRequest,返回MyResponse
rpc getPersonById (MyRequest) returns (MyResponse) {
}
// 定义一个方法getPersons,传入MyRequest,返回多个MyResponse(同理,你还可以发送多个Request)
rpc getPersons (MyRequest) returns (stream MyResponse) {
}
}
- * .Proto compiled file into language source file
- Create a folder in the main proto directory into which the file will my_protocol.proto
- Run mvn compile
- maven will automatically find the main / proto / at * .proto file, compiled conversion
- Generating class files stored in the target / classs / lower
- Generated source files stored in the target / generated-sources / lower
3. Use gRPC write server / client
- Introducing Maven dependent (the current version 1.25.0)
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.25.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.25.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.25.0</version>
</dependency>
- Server example
- PersonServiceImpl.java
package com.skey.grpcdemo;
import com.skey.grpcdemo.grpc.MyRequest;
import com.skey.grpcdemo.grpc.MyResponse;
import com.skey.grpcdemo.grpc.Person;
import com.skey.grpcdemo.grpc.PersonServiceGrpc;
import io.grpc.stub.StreamObserver;
public class PersonServiceImpl extends PersonServiceGrpc.PersonServiceImplBase {
@Override
public void getPersonById(MyRequest request, StreamObserver<MyResponse> responseObserver) {
System.out.println("PersonServiceImpl.getPersonById");
MyResponse.Builder builder = MyResponse.newBuilder();
int id = request.getId();
if (id > 105) {
builder.setStatusCode(0);
} else {
Person person = Person.newBuilder()
.setId(id)
.setName("laowang")
.setAge(28)
.build();
builder.setStatusCode(1).setPerson(person);
}
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
}
@Override
public void getPersons(MyRequest request, StreamObserver<MyResponse> responseObserver) {
System.out.println("PersonServiceImpl.getPersons");
for (int i = 0; i < 5; i++) {
Person person = Person.newBuilder()
.setId(i)
.setName("laowang")
.setAge(28)
.build();
MyResponse response = MyResponse.newBuilder()
.setStatusCode(1)
.setPerson(person)
.build();
responseObserver.onNext(response);
}
responseObserver.onCompleted();
}
}
- ServerDemo.java
package com.skey.grpcdemo;
import io.grpc.Server;
import io.grpc.ServerBuilder;
public class ServerDemo {
public static void main(String[] args) {
Server server = ServerBuilder.forPort(10086)
.addService(new PersonServiceImpl())
.build();
try {
server.start();
server.awaitTermination();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Client example
package com.skey.grpcdemo;
import com.skey.grpcdemo.grpc.MyRequest;
import com.skey.grpcdemo.grpc.MyResponse;
import com.skey.grpcdemo.grpc.PersonServiceGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import java.util.Iterator;
public class ClientDemo {
public static void main(String[] args) {
ManagedChannel managedChannel = ManagedChannelBuilder
.forAddress("localhost",10086)
.usePlaintext()
.build();
PersonServiceGrpc.PersonServiceBlockingStub blockingStub = PersonServiceGrpc.newBlockingStub(managedChannel);
for (int i = 100; i < 107; i++) {
MyRequest request = MyRequest.newBuilder()
.setId(i)
.build();
MyResponse response = blockingStub.getPersonById(request);
if (response.getStatusCode() == 1) {
System.out.println(response.getPerson());
} else {
System.out.println("No such person that id = " + i);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("------------------------------------------");
MyRequest request = MyRequest.newBuilder()
.setId(1)
.build();
Iterator<MyResponse> responseIter = blockingStub.getPersons(request);
responseIter.forEachRemaining(System.out::println);
}
}
Published 128 original articles
·
won praise 45
·
Views 150,000 +
Origin blog.csdn.net/alionsss/article/details/103606208