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

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

服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

概述前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架。下面就简单介绍一下RPC框架技术选型的过程...
  • fgyibupi
  • fgyibupi
  • 2017年01月23日 11:08
  • 23986

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

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

【总结】Netty(RPC高性能之道)原理剖析

1,Netty简述 Netty 是一个基于 JAVA NIO 类库的异步通信框架,用于创建异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性的网络客户端和服务器端RPC高性能分析,请参考文章...
  • zhiguozhu
  • zhiguozhu
  • 2016年01月14日 14:51
  • 12444

grpc java helloworld 简单demo实现

写在前面最近google发布了grpc1.0,之前一直关注过grpc,数据交互使用了protocol buffer,相比之前使用的hession和json序列化方式性能应该提升不少,所有先搞一个grp...
  • whzhaochao
  • whzhaochao
  • 2016年09月03日 10:47
  • 12568

grpc-demo

gRPC  是一个高性能、开源和通用的 gooogle开发RPC 框架,基于 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go....
  • yeyincai
  • yeyincai
  • 2016年03月25日 09:15
  • 5079

服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

概述前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架。下面就简单介绍一下RPC框架技术选型的过程...
  • fgyibupi
  • fgyibupi
  • 2017年01月23日 11:08
  • 23986

GRPC 配置、使用、安装文档 java-windows-eclipse

官方文档:http://www.grpc.io/ 中文版:https://doc.oschina.net/grpc 目录: 一、利用maven compile 来将proto生成java文件 二、利用...
  • y515789
  • y515789
  • 2017年01月12日 15:22
  • 1330

google的RPC框架:grpc 介绍

grpc介绍
  • lwfcgz
  • lwfcgz
  • 2016年05月24日 05:26
  • 5691

Selenium Webdriver学习记录(一):环境搭建(Java+Maven+Eclipse+Selenium3.x)+第一个测试demo+部分问题解决

1.Selenium的学习网站:     官网:http://www.seleniumhq.org/docs/     中文网站:易百教程-->Selenium教程:http://www.yiibai...
  • u010366748
  • u010366748
  • 2017年06月05日 23:43
  • 3534

Selenium Webdriver学习记录(一):环境搭建(Java+Maven+Eclipse+Selenium3.x)+第一个测试demo+部分问题解决

1.Selenium的学习网站:     官网:http://www.seleniumhq.org/docs/     中文网站:易百教程-->Selenium教程:http://www....
  • wqc19920906
  • wqc19920906
  • 2017年12月06日 16:04
  • 129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty学习十:google grpc框架环境搭建以及第一个demo
举报原因:
原因补充:

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