3、在项目下的路径src/main下面创建proto文件夹,并在里面创建一个hello.proto文件。具体如下截图。

4、在hello.proto文件上输入,相应的配置信息,用来映射生成java代码。里面的内容就是生成一个MyRPC的服务提供一个sayHi的接口,接口需要传递一个request类的实例,该request实例只有一个name的字段。然后进行相应的业务代码处理之后,返回一个response类的实例,也是只有一个name的字段。
如果进行到这边,看到第2步添加依赖上面的<execution>标签可能报错,先暂时不要管他。直接进行第5步。
syntax = "proto3";
option java_package = "com.qidai.proto";
option java_outer_classname = "MyThing";
message Request {
string name = 1;
}
message Response {
string name = 2;
}
service MyRPC {
rpc sayHi(Request) returns(Response);
}
5、运行项目,右击项目Run as -->maven build....->protobuf:compile以及protobuf:compile-custom,这样就编译生成了相应的代码了。不过存放的路径不对,需要自己拷贝到相应的项目目录下。

6、grpc的客户端和服务端代码需要自己编写。不过这一块的demo已经很全了。c+v然后改成自己的自己需要的就行了。
服务端demo:
package server;
import com.qidai.proto.MyRPCGrpc;
import com.qidai.proto.MyThing;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import service.RequestImpl;
import java.io.IOException;
public class Server {
private static final int PORT = 2222;
private final io.grpc.Server server;
public Server() throws IOException {
//这个部分启动server
this.server = ServerBuilder.forPort(PORT)
.addService(new RequestImpl())
.build()
.start();
System.out.println("Server1 Started ...");
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
Server server = new Server();
//block Server防止关闭
server.blockUntilShutdown();
}
}
客户端demo
package client;
import com.qidai.proto.MyRPCGrpc;
import com.qidai.proto.MyRPCGrpc.MyRPCBlockingStub;
import com.qidai.proto.MyThing;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import java.util.concurrent.TimeUnit;
public class Client {
private final ManagedChannelBuilder<?> managedChannelBuilder;
private final MyRPCBlockingStub blockingStub;
private final ManagedChannel channel;
public Client(String name, int port) {
managedChannelBuilder = ManagedChannelBuilder.forAddress(name, port);
channel = managedChannelBuilder.usePlaintext().build();
blockingStub = MyRPCGrpc.newBlockingStub(channel);
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public void sayHi(String name){
MyThing.Request request = MyThing.Request.newBuilder().setName(name).build();
MyThing.Response response = blockingStub.sayHi(request);
System.out.println(response.getName());
}
public static void main(String[] args) throws Exception{
Client client = new Client("localhost", 5005);
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
//进行rpc调用的真正逻辑
client.sayHi("Hello Server1111 ->5005 " + i);
}
client.shutdown();
Client client2 = new Client("localhost", 5005);
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
//进行rpc调用的真正逻辑
client2.sayHi("Hello Server2222 ->5005 " + i);
}
client2.shutdown();
}
}










