Java Grpc实例创建负载均衡详解

2020-03-20 14:01:26王振洲

  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();
  }
}