更多内容参考:https://www.grpc.io/docs/guides/
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
gRPC 是什么?
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法 ,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,
gRPC 也是基于以下理念 :
定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口 ,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本 ,并且可以用任何 gRPC 支持的语言(#quickstart)来编写。所以,你可以很容易地用 Java 创建一 个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版 本的接口,使你很容易地将 Google 的功能集成到你的应用里。
使用 protocol buffers
gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也 可以使用其他数据格式如 JSON)。
正如你将在下方例子里所看到的,你用 proto files 创建 gRPC 服务,用 protocol buffers 消息类型来定义方法参数和返回类型。
你可以在 Protocol Buffers 文档 (
https://developers.google.com/protocol-buffers/docs/overview
)找到更多关于 Protocol Buffers 的资料。
Protocol buffers 版本
尽管 protocol buffers 对于开源用户来说已经存在了一段时间,例子内使用的却一种名叫 proto3 的新风格的 protocol buffers,它拥有轻量简化的语法、一些有用的新功能,并且支持更多新语言 。
当前针对 Java 和 C++ 发布了 beta 版本,针对 JavaNano(即 Android Java)发布 alpha 版 本,
在protocol buffers Github 源码库里(https://github.com/google/protobuf/releases)有 Ruby 支持,
在golang/protobuf Github 源码库(https://github.com/golang/protobuf)里还 有针对 Go 语言的生成器, 对更多语言的支持正在开发中。
你可以在 proto3 语言指南 (https://developers.google.com/protocol-buffers/docs/proto3)里找到更多内容,
在与当前 默认版本的发布说明(https://github.com/google/protobuf/releases)比较,看到两者的主要不 同点。更多关于 proto3 的文档很快就会出现。
虽然你可以使用 proto2 (当前默认的 protocol buffers 版本), 我们通常建议你在 gRPC 里使用 proto3,因为这样你可以使用 gRPC 支持全部范 围的的语言,
并且能避免 proto2 客户端与 proto3 服务端交互时出现的兼容性问题,反之亦然。
安装gRPC
Java 例子代码在 GitHub 源码库里。你可以运行如下命令克隆源码到本地:
git clone -b v1.24.0 https://github.com/grpc/grpc-java
切换当前目录到grpc-java/examples
cd grpc-java/examples
Run a gRPC application
From the examples directory:
- Compile the client and server
./gradlew installDist
- Run the server
./build/install/examples/bin/hello-world-server
- In another terminal, run the client
./build/install/examples/bin/hello-world-client
Congratulations! You’ve just run a client-server application with gRPC.
Go获取例子:
go get -u github.com/grpc/grpc-go/examples/helloworld/greeter_client
go get -u github.com/grpc/grpc-go/examples/helloworld/greeter_server
切换当前目录到 examples/helloworld
// Copyright 2015 The gRPC Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; option objc_class_prefix = "HLW"; package helloworld; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
构建gRPC-Java
仅当您要更改gRPC-Java或测试/使用gRPC-Java库的未发行版本(例如主HEAD)时,才需要构建。
构建需要JDK 8,因为我们的测试使用TLS。
grpc-java有一个用于protoc的C ++代码生成插件。由于许多Java开发人员没有安装C编译器,也不需要运行或修改代码生成,因此该构建可以跳过它。要跳过,请创建文件 <project-root>/gradle.properties并添加skipCodegen=true。
然后,要构建,运行:
$ ./gradlew build
要将工件安装到您的Maven本地存储库中以在您自己的项目中使用,请运行:
$ ./gradlew publishToMavenLocal
IntelliJ的注意事项
当您将项目作为Gradle项目导入并将IDE生成/运行操作委托给Gradle时,以IntelliJ进行构建的效果最佳。
您可以在以下位置找到此设置:
-> Build Tools -> Gradle -> Runner
-> Delegate IDE build/run actions to gradle.
如何构建代码生成插件
仅当您要更改代码生成时,才需要此部分。大多数用户只需要skipCodegen=true如上所述使用即可。
建立Protobuf
codegen插件是C ++代码,需要protobuf 3.0.0或更高版本。
对于Linux,Mac和MinGW:
git clone https://github.com/google/protobuf.git cd protobuf git checkout v3.9.0 ./autogen.sh ./configure --disable-shared make make check sudo make install
如果您熟悉C ++编译和自动工具,你可以指定 --prefix为的Protobuf和使用-I中CXXFLAGS,-L在 LDFLAGS引用它。在构建grpc-java时将使用环境变量。
Protobuf /usr/local默认安装到。
对于Visual C ++,请参阅Protobuf自述文件, 以了解如何编译Protobuf。gRPC-java假定为Release版本。
Linux和MinGW
如果/usr/local/lib不在您的库搜索路径中,则可以通过运行以下命令添加它:
sudo sh -c 'echo /usr/local/lib >> /etc/ld.so.conf' sudo ldconfig
苹果电脑
Mac OS X的某些版本(例如10.10)没有/usr/local默认文件头文件和库的搜索路径。它将使代码生成的构建失败。要解决此问题,您将需要设置环境变量:
export CXXFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib"
Visual C ++的注意事项
在Windows和VC ++上构建时,需要为Gradle指定项目属性以找到protobuf:
.\gradlew publishToMavenLocal ^
-PvcProtobufInclude=C:\path\to\protobuf-3.9.0\src ^
-PvcProtobufLibs=C:\path\to\protobuf-3.9.0\vsprojects\Release ^
-PtargetArch=x86_32
由于指定每个构建的那些属性很麻烦,因此您可以<project-root>\gradle.properties使用如下内容创建:
vcProtobufInclude=C:\\path\\to\\protobuf-3.9.0\\src vcProtobufLibs=C:\\path\\to\\protobuf-3.9.0\\vsprojects\\Release targetArch=x86_32
默认情况下,构建脚本将为与系统上安装的Java运行时相同的体系结构构建代码生成。如果您使用的是64位JVM,则会将代码生成为64位编译。由于Protobuf默认情况下仅针对32位构建,因此这targetArch=x86_32是必需的。
Windows上MinGW的注意事项
如果您在Windows上同时安装了MinGW和VC ++,则默认情况下将使用VC ++。要覆盖此默认设置并使用MinGW,请添加-PvcDisable=true 到您的Gradle命令行或添加vcDisable=true到中 <project-root>\gradle.properties。
不支持的操作系统的注意事项
protoc默认情况下,构建脚本从Maven Central 提取预编译的。我们已经protoc为流行的系统构建了二进制文件,但是它们可能不适用于您的系统。如果protoc无法下载或无法运行,则可以通过将以下属性添加到来使用自己构建的版本 <project-root>/gradle.properties:
protoc=/path/to/protoc
生成代码:
或者在build.gradle中配置好插件
group 'com.mikey' version '1.0-SNAPSHOT' //加入grpc插件 apply plugin: 'java' apply plugin: 'com.google.protobuf' //源编译和目标编译 sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { // maven库 def cn = "http://maven.aliyun.com/nexus/content/groups/public/" def abroad = "http://central.maven.org/maven2/" // 先从url中下载jar若没有找到,则在artifactUrls中寻找 maven { url cn artifactUrls abroad } } dependencies { compile group: 'io.netty', name: 'netty-all', version: '4.1.10.Final' //protobuf用到的库 compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.3.1' compile group: 'com.google.protobuf', name: 'protobuf-java-util', version: '3.3.1' //thrift的库 compile group: 'org.apache.thrift', name: 'libthrift', version: '0.12.0' //grpc用到的库 compile 'io.grpc:grpc-netty-shaded:1.20.0' compile 'io.grpc:grpc-protobuf:1.20.0' compile 'io.grpc:grpc-stub:1.20.0' } /** *以下都是grpc所使用到的gradle插件 */ buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8' } } protobuf { //生成的java代码路径 generatedFilesBaseDir = "$projectDir/src" // protoc { artifact = "com.google.protobuf:protoc:3.7.1" } plugins { grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.20.0' } } generateProtoTasks { all()*.plugins { grpc { // 生成的 service 文件路径 setOutputSubDir 'java' } } } }