netty学习十:google grpc框架环境搭建以及第一个demo

原创 2017年08月13日 18:44:12

概述


本文将会介绍两部分内容:
1、window 7 上搭建grpc环境;
2、构建关于grpc的java小demo.


下载grpc java依赖包


为了能生成针对java的grpc客户端和服务端代码(官方叫stub),需要下载一些java包和grpc编译器以及一些gradle 插件

java依赖包

compile ‘io.grpc:grpc-netty:1.4.0’
compile ‘io.grpc:grpc-protobuf:1.4.0’
compile ‘io.grpc:grpc-stub:1.4.0’

gradle构建脚本

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.1'
  }
}

protobuf {
  protoc {
    artifact = "com.google.protobuf:protoc:3.2.0"
  }
  plugins {
    grpc {
      artifact = 'io.grpc:protoc-gen-grpc-java:1.4.0'
    }
  }
  generateProtoTasks {
    all()*.plugins {
      grpc {}
    }
  }
}

使用gradle命令

gradle clean build

由于要下载很多依赖包,时间会比较长.

备注

最好使用gradle 3来构建,gradle 2太旧了


编写proto文件


src/main/proto/grpc/firstdemo/Student.proto

syntax = "proto3";
package firstdemo;
option optimize_for=SPEED;
option java_package="firstdemo";
option java_outer_classname="StudentProto";
option java_multiple_files=true;

service StudentService {
    rpc getRealname(RequestInfo) returns (ResponseInfo) {}
}

message RequestInfo {
    string username = 1;
}

message ResponseInfo {
    string realname = 1;
}

注意这里需要使用proto3

syntax = “proto3”;


生成gprc java stub类


先执行

gradle clean build

再执行

gradle generateProto

执行成功后,会生成如下目录

grpc
java

将两个目录下的java文件拷贝到

src/main/proto/grpc/firstdemo/generated

拷贝完后src/main/proto/grpc/firstdemo/generated目录下会有如下文件

RequestInfo.java
ResponseInfo.java
ResponseInfoOrBuilder.java
StudentProto.java
StudentServiceGrpc.java

备注

集成grpc后,不能再使用之前的proto2的protoc编译命令了,这个命令只是会生成用于传递的消息对象,并不会生成客户端好服务端的stub类


编写业务实现类


package grpc.firstdemo.server;

import grpc.firstdemo.generated.RequestInfo;
import grpc.firstdemo.generated.ResponseInfo;
import grpc.firstdemo.generated.StudentServiceGrpc.StudentServiceImplBase;
import io.grpc.stub.StreamObserver;

public class StudentBizService extends StudentServiceImplBase{

    @Override
    public void getRealname(RequestInfo request, StreamObserver<ResponseInfo> responseObserver) {
        System.out.println("接收到客户端的信息:"+request.getUsername());
        ResponseInfo responseInfo = ResponseInfo.newBuilder().setRealname("Sam").build();
        responseObserver.onNext(responseInfo);
        responseObserver.onCompleted();
    }
}

需要继承StudentServiceImplBase类,覆盖getRealname方法.


服务端代码


package grpc.firstdemo.server;

import java.io.IOException;

import io.grpc.Server;
import io.grpc.ServerBuilder;

public class GrpcServer {
   private Server server;

   private void start() throws IOException {
       this.server = ServerBuilder.forPort(8899)
                     .addService(new StudentBizService())
                     .build().start();
       System.out.println("server started");

       Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        @Override
        public void run() {
            GrpcServer.this.stop();
        }
    }));
   }

   private void stop() {
       if (this.server != null) {
           this.server.shutdown();
       }
   }

   private void awaitTermination() throws InterruptedException {
       if (this.server != null) {
           this.server.awaitTermination();
       }
   }

   public static void main(String[] args) throws IOException, InterruptedException {
    GrpcServer grpcServer = new GrpcServer();
    grpcServer.start();
    //让grpc server启动后,处于等待状态,监听客户端请求
    grpcServer.awaitTermination();
}
}

客户端代码


package grpc.firstdemo.client;

import grpc.firstdemo.generated.RequestInfo;
import grpc.firstdemo.generated.ResponseInfo;
import grpc.firstdemo.generated.StudentServiceGrpc;
import grpc.firstdemo.generated.StudentServiceGrpc.StudentServiceBlockingStub;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

public class GrpcClient {

    public static void main(String[] args) {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8899)
                             .usePlaintext(true)
                             .build();

        StudentServiceBlockingStub blockStub = StudentServiceGrpc.newBlockingStub(channel);
        ResponseInfo responseInfo = blockStub.getRealname(RequestInfo.newBuilder().setUsername("sam").build());
        System.out.println(responseInfo.getRealname());
    }
}

运行代码


分别运行GrpcServer类和GrpcClient类的main方法,启动服务端和客户端,正常情况下会打印如下日志:

接收到客户端的信息:sam


csdn code 路径


这个项目的源代码放置在csdn code上,欢迎访问。
netty_study

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

基于HTTP/2和protobuf的RPC框架GRPC

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准、ProtoBuf(Protocol Buffers)序列化协议而设计开发,带来诸如双向流、流...

Oracle的悲观锁和乐观锁

为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Java NIO框架Netty教程(三) – Object对象传递

说了这么多废话,才提到对象的传输,不知道您是不是已经不耐烦了。一个系统内部的消息传递,没有对象传递是不太现实的。下面就来说说,怎么传递对象。 如果,您看过前面的介绍,如果您善于专注本质,勤于思考。您应...

Netty实现原理浅析

Netty是JBoss出品的高效的Java NIO开发框架,关于其使用,可参考我的另一篇文章 netty使用初步。本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研...

通过Guice 进行依赖项注入

构造器注入 public class FrogMan{ @Inject public FrogMan(Vehicle vehicle) { this.vehicle = vehicle; ...

Java NIO框架Netty教程(四) – ServerBootStrap启动流程源码分析

花了几天时间,仔细梳理了一下Netty的源码,总结了一下ServerBootStrap的启动和任务处理流程,基本涵盖了Netty的关键架构。   OneCoder总结了一张流程图:    ...

DataGrid使用心得(附大量代码)

1. 为 DataGrid 控件设计样式        在之后添加如下代码                 &...

Java NIO框架Netty教程(一) – Hello Netty

先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是...

3个netty5的例子,简单介绍netty的用法

3个netty5的例子,简单介绍netty的用法
  • tjbsl
  • tjbsl
  • 2016-04-01 18:49
  • 11988
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)