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)序列化协议而设计开发,带来诸如双向流、流...

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

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

grpc java helloworld 简单demo实现

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

初识google多语言通信框架gRPC系列(一)概述

gRPC概述 3/26/2016 9:16:08 AM 目录 一、概述 二、编译gRPC 三、C#中使用gRPC 四、C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF...

google的RPC框架:grpc 介绍

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

gRpc的demo测试过程

这里是一个关于gRpc的demo,和网上的例子一模一样,但是在运行demo时会出现各种各样的问题,导致放弃grpc的学习,本例子就是一步一步的教大家把demo运行通过,这里是用maven和Idea进行...

纯Java的高性能长连接RPC解决方案

纯Java的高性能长连接RPC解决方案   简介:轻量封装Ibatis3          因为本人在国内最大的电子商务公司工作期间,深感一个好的分表分库框架可以大大提高系统的承载能...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

grpc学习笔记--Java版

这几天由于工作的原因,涉及到系统之间的通信,rpc调用方式不失为内部系统之间的一种高效简单的方式,至于rpc是什么,这里不多说,自行Google去。 在比较了Thrift(Apache开源项目)和g...
  • cghver
  • cghver
  • 2016年11月15日 23:57
  • 3648

grpc的java实现,从无到有

1、Eclipse创建Maven项目 新建一个空的maven工程(不选archetype)。 2、修改POM文件 增加grpc的依赖 io.grpc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty学习十:google grpc框架环境搭建以及第一个demo
举报原因:
原因补充:

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