grpc-简单的客户端服务端通信(1)

来源:互联网 发布:win7管理网络密码 编辑:程序博客网 时间:2024/05/21 09:37

服务端业务逻辑代码

实现自己的业务逻辑类去继承grpc自动生成的类:

public class StudentServiceImpl extends StudentServiceGrpc.StudentServiceImplBase {    @Override    public void getRealNameByUsername(MyRequest request, StreamObserver<MyResponse> responseObserver) {        System.out.println("接受到客户端信息: " + request.getUsername());        responseObserver.onNext(MyResponse.newBuilder().setRealname("张三").build());        responseObserver.onCompleted();    }}

可见返回的是void,所以需要返回的消息内容一定是由responseOberver来实现的。这单是跟thrift不同的地方。
onNext:把结果返回给客户端(考虑到会有stream情况)
onCompleted:告知客户端服务端,服务端已执行完毕

启动服务端

  • 启动服务端
private void start() throws Exception{        this.server = ServerBuilder.forPort(8899).addService(new StudentServiceImpl()).build().start();        System.out.println("server started!");        Runtime.getRuntime().addShutdownHook(new Thread(() -> {            System.out.println("关闭jvm");            GrpcServer.this.stop();        }));        System.out.println("执行到这里");    }
  • 停止服务端
private void stop() {        if (null != this.server) {            this.server.shutdown();        }    }
  • 让服务器等待(否则启动完就会退出)
private void awaitTermination() throws InterruptedException {        if (null != this.server){            this.server.awaitTermination();        }    }
  • 执行
public static void main(String[] args) throws Exception{        GrpcServer server = new GrpcServer();        server.start();        server.awaitTermination();    }

启动客户端

public static void main(String[] args) {        ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 8899).usePlaintext(true).build();        StudentServiceGrpc.StudentServiceBlockingStub blockingStub = StudentServiceGrpc.newBlockingStub(managedChannel);        MyResponse myResponse = blockingStub.getRealNameByUsername(MyRequest.newBuilder().setUsername("张三").build());        System.out.println(myResponse.getRealname());    }

关键点

awaitTermination:等待服务器终止,可以传入时间参数来让服务器到达时间后terminate.
底层实现:

@Override  public void awaitTermination() throws InterruptedException {    synchronized (lock) {      while (!terminated) {        lock.wait();      }    }  }

Runtime:每一个java应用都会有一个单例Runtime对象,应用可以通过此对象获取应用环境的信息
addShutdownHook:回调钩子,虚拟机被关闭之前执行的方法

服务端与客户端建立的是一个tcp连接,是一个长连接,而不会像http一样客户端每次请求都需要建立一个新的连接,但是会通会过心跳检测这个连接是否有效。

参考 https://grpc.io/docs/tutorials/basic/java.html

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四年级孩子数学不好怎么办 孩子学习不开窍怎么办 孩子学习太笨怎么办 老师是个小人怎么办 孩子写字太差怎么办 孩子写字下手重怎么办 孩子一年级数学不好怎么办 孩子数学理解能力差怎么办 智商情商都低怎么办 一年级孩子数学很差怎么办 一年级孩子数学差怎么办 一年级数学学不好怎么办 孩子成绩差该怎么办 小学生数学太差怎么办 小学数学基础差怎么办 孩子一年级学习不好怎么办 快两岁的宝宝老尿裤怎么办 戒母乳宝宝哭闹怎么办 三周岁不肯说话怎么办 两岁宝宝打人怎么办 刚开始跳绳腿疼怎么办 两周岁宝宝拉肚子怎么办 宝宝睡觉认人怎么办 宝宝脸不光滑怎么办 两周岁宝宝打人怎么办 分手后想念前任怎么办 孩子不学习该怎么办 小孩吃了牙膏怎么办 小孩子吃了牙膏怎么办 一岁宝宝龋齿怎么办 宝宝吃牙膏了怎么办 刷牙吞了牙膏怎么办 宝宝刷牙吞牙膏怎么办 宝宝语言发育迟缓怎么办 两岁宝宝叛逆怎么办 宝宝不愿意学说话怎么办 一岁多宝宝嘴臭怎么办 三岁多了不说话怎么办 宝宝说话夹舌头怎么办 两岁不会说话怎么办 三周岁不会说话怎么办