2015-05-07 07:15:53 +08:00
gRPC-Java - An RPC library and framework
========================================
2018-09-05 02:09:09 +08:00
gRPC-Java works with JDK 7. gRPC-Java clients are supported on Android API
2018-05-01 01:28:41 +08:00
levels 14 and up (Ice Cream Sandwich and later). Deploying gRPC servers on an
Android device is not supported.
2018-01-18 02:18:33 +08:00
TLS usage typically requires using Java 8, or Play Services Dynamic Security
Provider on Android. Please see the [Security Readme ](SECURITY.md ).
2014-12-16 02:24:42 +08:00
2015-09-25 03:03:23 +08:00
< table >
< tr >
< td > < b > Homepage:< / b > < / td >
2017-07-11 06:48:17 +08:00
< td > < a href = "https://grpc.io/" > grpc.io< / a > < / td >
2015-09-25 03:03:23 +08:00
< / tr >
< tr >
< td > < b > Mailing List:< / b > < / td >
< td > < a href = "https://groups.google.com/forum/#!forum/grpc-io" > grpc-io@googlegroups.com< / a > < / td >
< / tr >
< / table >
2016-12-07 01:27:10 +08:00
[![Join the chat at https://gitter.im/grpc/grpc ](https://badges.gitter.im/grpc/grpc.svg )](https://gitter.im/grpc/grpc?utm_source=badge& utm_medium=badge& utm_campaign=pr-badge& utm_content=badge)
2015-09-25 03:03:23 +08:00
[![Build Status ](https://travis-ci.org/grpc/grpc-java.svg?branch=master )](https://travis-ci.org/grpc/grpc-java)
[![Coverage Status ](https://coveralls.io/repos/grpc/grpc-java/badge.svg?branch=master&service=github )](https://coveralls.io/github/grpc/grpc-java?branch=master)
2018-08-14 23:02:22 +08:00
Getting Started
---------------
For a guided tour, take a look at the [quick start
guide](https://grpc.io/docs/quickstart/java.html) or the more explanatory [gRPC
basics](https://grpc.io/docs/tutorials/basic/java.html).
2018-12-05 03:09:24 +08:00
The [examples ](https://github.com/grpc/grpc-java/tree/v1.17.0/examples ) and the
[Android example ](https://github.com/grpc/grpc-java/tree/v1.17.0/examples/android )
2018-08-14 23:02:22 +08:00
are standalone projects that showcase the usage of gRPC.
2015-05-27 05:22:32 +08:00
Download
--------
2016-06-15 01:58:38 +08:00
Download [the JARs][]. Or for Maven with non-Android, add to your `pom.xml` :
2015-05-27 05:22:32 +08:00
```xml
< dependency >
< groupId > io.grpc< / groupId >
2018-08-03 07:00:12 +08:00
< artifactId > grpc-netty-shaded< / artifactId >
2018-12-05 03:09:24 +08:00
< version > 1.17.0< / version >
2016-06-15 01:58:38 +08:00
< / dependency >
< dependency >
< groupId > io.grpc< / groupId >
< artifactId > grpc-protobuf< / artifactId >
2018-12-05 03:09:24 +08:00
< version > 1.17.0< / version >
2016-06-15 01:58:38 +08:00
< / dependency >
< dependency >
< groupId > io.grpc< / groupId >
< artifactId > grpc-stub< / artifactId >
2018-12-05 03:09:24 +08:00
< version > 1.17.0< / version >
2015-05-27 05:22:32 +08:00
< / dependency >
```
2016-06-15 01:58:38 +08:00
Or for Gradle with non-Android, add to your dependencies:
2015-05-27 05:22:32 +08:00
```gradle
2018-12-05 03:09:24 +08:00
compile 'io.grpc:grpc-netty-shaded:1.17.0'
compile 'io.grpc:grpc-protobuf:1.17.0'
compile 'io.grpc:grpc-stub:1.17.0'
2015-05-27 05:22:32 +08:00
```
2018-08-03 07:00:12 +08:00
For Android client, use `grpc-okhttp` instead of `grpc-netty-shaded` and
2018-08-14 23:02:22 +08:00
`grpc-protobuf-lite` instead of `grpc-protobuf` :
2015-10-08 02:03:41 +08:00
```gradle
2018-12-05 03:09:24 +08:00
compile 'io.grpc:grpc-okhttp:1.17.0'
compile 'io.grpc:grpc-protobuf-lite:1.17.0'
compile 'io.grpc:grpc-stub:1.17.0'
2015-10-08 02:03:41 +08:00
```
2016-05-13 04:00:47 +08:00
[the JARs]:
2018-12-05 03:09:24 +08:00
https://search.maven.org/search?q=g:io.grpc%20AND%20v:1.17.0
2015-05-27 05:22:32 +08:00
Development snapshots are available in [Sonatypes's snapshot
repository](https://oss.sonatype.org/content/repositories/snapshots/).
2018-08-14 23:02:22 +08:00
Generated Code
--------------
2016-01-28 02:33:32 +08:00
For protobuf-based codegen, you can put your proto files in the `src/main/proto`
and `src/test/proto` directories along with an appropriate plugin.
2015-05-27 05:22:32 +08:00
For protobuf-based codegen integrated with the Maven build system, you can use
2016-11-15 13:04:22 +08:00
[protobuf-maven-plugin][] (Eclipse and NetBeans users should also look at
`os-maven-plugin` 's
[IDE documentation ](https://github.com/trustin/os-maven-plugin#issues-with-eclipse-m2e-or-other-ides )):
2015-05-27 05:22:32 +08:00
```xml
< build >
< extensions >
< extension >
< groupId > kr.motd.maven< / groupId >
< artifactId > os-maven-plugin< / artifactId >
2017-07-19 01:44:37 +08:00
< version > 1.5.0.Final< / version >
2015-05-27 05:22:32 +08:00
< / extension >
< / extensions >
< plugins >
< plugin >
2016-02-17 07:29:24 +08:00
< groupId > org.xolstice.maven.plugins< / groupId >
< artifactId > protobuf-maven-plugin< / artifactId >
2018-04-04 07:51:56 +08:00
< version > 0.5.1< / version >
2015-05-27 05:22:32 +08:00
< configuration >
2018-01-06 08:40:20 +08:00
< protocArtifact > com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}< / protocArtifact >
2015-05-27 05:22:32 +08:00
< pluginId > grpc-java< / pluginId >
2018-12-05 03:09:24 +08:00
< pluginArtifact > io.grpc:protoc-gen-grpc-java:1.17.0:exe:${os.detected.classifier}< / pluginArtifact >
2015-05-27 05:22:32 +08:00
< / configuration >
< executions >
< execution >
< goals >
< goal > compile< / goal >
< goal > compile-custom< / goal >
< / goals >
< / execution >
< / executions >
< / plugin >
< / plugins >
< / build >
```
2016-02-17 07:29:24 +08:00
[protobuf-maven-plugin]: https://www.xolstice.org/protobuf-maven-plugin/
2015-05-27 05:22:32 +08:00
For protobuf-based codegen integrated with the Gradle build system, you can use
[protobuf-gradle-plugin][]:
```gradle
apply plugin: 'com.google.protobuf'
buildscript {
repositories {
mavenCentral()
}
dependencies {
2018-08-04 00:43:32 +08:00
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.5'
2015-05-27 05:22:32 +08:00
}
}
2015-07-23 00:19:52 +08:00
protobuf {
protoc {
2018-01-06 08:40:20 +08:00
artifact = "com.google.protobuf:protoc:3.5.1-1"
2015-07-23 00:19:52 +08:00
}
plugins {
grpc {
2018-12-05 03:09:24 +08:00
artifact = 'io.grpc:protoc-gen-grpc-java:1.17.0'
2015-07-23 00:19:52 +08:00
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
2015-05-27 05:22:32 +08:00
}
}
}
```
[protobuf-gradle-plugin]: https://github.com/google/protobuf-gradle-plugin
2018-08-25 00:34:58 +08:00
The prebuilt protoc-gen-grpc-java binary uses glibc on Linux. If you are
compiling on Alpine Linux, you may want to use the [Alpine grpc-java package][]
which uses musl instead.
[Alpine grpc-java package]: https://pkgs.alpinelinux.org/package/edge/testing/x86_64/grpc-java
2018-08-14 23:02:22 +08:00
API Stability
-------------
APIs annotated with `@Internal` are for internal use by the gRPC library and
should not be used by gRPC users. APIs annotated with `@ExperimentalApi` are
subject to change in future releases, and library code that other projects
may depend on should not use these APIs.
We recommend using the
[grpc-java-api-checker ](https://github.com/grpc/grpc-java-api-checker )
(an [Error Prone ](https://github.com/google/error-prone ) plugin)
to check for usages of `@ExperimentalApi` and `@Internal` in any library code
that depends on gRPC. It may also be used to check for `@Internal` usage or
unintended `@ExperimentalApi` consumption in non-library code.
2015-01-30 07:00:58 +08:00
How to Build
------------
2015-08-14 23:49:56 +08:00
If you are making changes to gRPC-Java, see the [compiling
instructions](COMPILING.md).
2015-05-13 08:03:19 +08:00
2018-08-14 23:02:22 +08:00
High-level Components
---------------------
2015-01-30 07:00:58 +08:00
2018-08-14 23:02:22 +08:00
At a high level there are three distinct layers to the library: *Stub* ,
*Channel*, and *Transport* .
2014-12-16 02:24:42 +08:00
2015-01-30 07:00:58 +08:00
### Stub
2014-12-16 02:24:42 +08:00
2015-08-06 07:48:15 +08:00
The Stub layer is what is exposed to most developers and provides type-safe
bindings to whatever datamodel/IDL/interface you are adapting. gRPC comes with
a [plugin ](https://github.com/google/grpc-java/blob/master/compiler ) to the
protocol-buffers compiler that generates Stub interfaces out of `.proto` files,
2018-08-14 23:02:22 +08:00
but bindings to other datamodel/IDL are easy and encouraged.
2014-12-16 02:24:42 +08:00
2015-01-30 07:00:58 +08:00
### Channel
2014-12-16 02:24:42 +08:00
2015-08-06 07:48:15 +08:00
The Channel layer is an abstraction over Transport handling that is suitable for
interception/decoration and exposes more behavior to the application than the
Stub layer. It is intended to be easy for application frameworks to use this
2018-08-14 23:02:22 +08:00
layer to address cross-cutting concerns such as logging, monitoring, auth, etc.
2014-12-16 02:24:42 +08:00
2015-01-30 07:00:58 +08:00
### Transport
2014-12-16 02:24:42 +08:00
2015-08-08 14:28:06 +08:00
The Transport layer does the heavy lifting of putting and taking bytes off the
2015-08-06 07:48:15 +08:00
wire. The interfaces to it are abstract just enough to allow plugging in of
2018-08-14 23:02:22 +08:00
different implementations. Note the transport layer API is considered internal
to gRPC and has weaker API guarantees than the core API under package `io.grpc` .
2015-08-06 07:48:15 +08:00
2015-08-08 14:28:06 +08:00
gRPC comes with three Transport implementations:
2015-08-06 07:48:15 +08:00
2018-08-14 23:02:22 +08:00
1. The Netty-based transport is the main transport implementation based on
2015-08-06 07:48:15 +08:00
[Netty ](http://netty.io ). It is for both the client and the server.
2018-08-14 23:02:22 +08:00
2. The OkHttp-based transport is a lightweight transport based on
2015-08-06 07:48:15 +08:00
[OkHttp ](http://square.github.io/okhttp/ ). It is mainly for use on Android
2015-08-08 14:28:06 +08:00
and is for client only.
2018-08-14 23:02:22 +08:00
3. The in-process transport is for when a server is in the same process as the
client. It is useful for testing, while also being safe for production use.