2015-05-07 07:15:53 +08:00
gRPC-Java - An RPC library and framework
========================================
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)
2021-02-27 05:16:38 +08:00
[![Line Coverage Status ](https://coveralls.io/repos/grpc/grpc-java/badge.svg?branch=master&service=github )](https://coveralls.io/github/grpc/grpc-java?branch=master)
[![Branch-adjusted Line Coverage Status ](https://codecov.io/gh/grpc/grpc-java/branch/master/graph/badge.svg )](https://codecov.io/gh/grpc/grpc-java)
2015-09-25 03:03:23 +08:00
2022-11-29 02:00:33 +08:00
Supported Platforms
-------------------
gRPC-Java supports Java 8 and later. Android minSdkVersion 19 (KitKat) and
later are supported with [Java 8 language desugaring][android-java-8].
TLS usage on Android typically requires Play Services Dynamic Security Provider.
Please see the [Security Readme ](SECURITY.md ).
Older Java versions are not directly supported, but a branch remains available
for fixes and releases. See [gRFC P5 JDK Version Support
Policy][P5-jdk-version-support].
Java version | gRPC Branch
------------ | -----------
7 | 1.41.x
[android-java-8]: https://developer.android.com/studio/write/java8-support#supported_features
[P5-jdk-version-support]: https://github.com/grpc/proposal/blob/master/P5-jdk-version-support.md#proposal
2018-08-14 23:02:22 +08:00
Getting Started
---------------
For a guided tour, take a look at the [quick start
2020-06-02 01:25:29 +08:00
guide](https://grpc.io/docs/languages/java/quickstart) or the more explanatory [gRPC
basics](https://grpc.io/docs/languages/java/basics).
2018-08-14 23:02:22 +08:00
2023-08-17 04:39:38 +08:00
The [examples ](https://github.com/grpc/grpc-java/tree/v1.57.2/examples ) and the
[Android example ](https://github.com/grpc/grpc-java/tree/v1.57.2/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 >
2023-08-17 04:39:38 +08:00
< version > 1.57.2< / version >
2022-01-05 07:39:19 +08:00
< scope > runtime< / scope >
2016-06-15 01:58:38 +08:00
< / dependency >
< dependency >
< groupId > io.grpc< / groupId >
< artifactId > grpc-protobuf< / artifactId >
2023-08-17 04:39:38 +08:00
< version > 1.57.2< / version >
2016-06-15 01:58:38 +08:00
< / dependency >
< dependency >
< groupId > io.grpc< / groupId >
< artifactId > grpc-stub< / artifactId >
2023-08-17 04:39:38 +08:00
< version > 1.57.2< / version >
2015-05-27 05:22:32 +08:00
< / dependency >
2020-05-08 05:33:28 +08:00
< dependency > <!-- necessary for Java 9+ -->
< groupId > org.apache.tomcat< / groupId >
< artifactId > annotations-api< / artifactId >
< version > 6.0.53< / version >
< scope > provided< / scope >
< / dependency >
2015-05-27 05:22:32 +08:00
```
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
2023-08-17 04:39:38 +08:00
runtimeOnly 'io.grpc:grpc-netty-shaded:1.57.2'
implementation 'io.grpc:grpc-protobuf:1.57.2'
implementation 'io.grpc:grpc-stub:1.57.2'
2020-05-08 05:33:28 +08:00
compileOnly 'org.apache.tomcat:annotations-api:6.0.53' // necessary for Java 9+
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
2023-08-17 04:39:38 +08:00
implementation 'io.grpc:grpc-okhttp:1.57.2'
implementation 'io.grpc:grpc-protobuf-lite:1.57.2'
implementation 'io.grpc:grpc-stub:1.57.2'
2020-05-08 05:33:28 +08:00
compileOnly 'org.apache.tomcat:annotations-api:6.0.53' // necessary for Java 9+
2015-10-08 02:03:41 +08:00
```
2023-05-27 03:42:50 +08:00
For [Bazel ](https://bazel.build ), you can either
[use Maven ](https://github.com/bazelbuild/rules_jvm_external )
(with the GAVs from above), or use `@io_grpc_grpc_java//api` et al (see below).
2016-05-13 04:00:47 +08:00
[the JARs]:
2023-08-17 04:39:38 +08:00
https://search.maven.org/search?q=g:io.grpc%20AND%20v:1.57.2
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 >
2023-02-03 06:35:54 +08:00
< version > 1.7.1< / 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 >
2019-08-21 05:35:03 +08:00
< version > 0.6.1< / version >
2015-05-27 05:22:32 +08:00
< configuration >
2023-08-04 01:53:38 +08:00
< protocArtifact > com.google.protobuf:protoc:3.22.3:exe:${os.detected.classifier}< / protocArtifact >
2015-05-27 05:22:32 +08:00
< pluginId > grpc-java< / pluginId >
2023-08-17 04:39:38 +08:00
< pluginArtifact > io.grpc:protoc-gen-grpc-java:1.57.2: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
2021-02-04 02:25:53 +08:00
For non-Android protobuf-based codegen integrated with the Gradle build system,
you can use [protobuf-gradle-plugin][]:
2015-05-27 05:22:32 +08:00
```gradle
2019-08-30 23:13:18 +08:00
plugins {
2023-07-21 00:48:39 +08:00
id 'com.google.protobuf' version '0.9.4'
2015-05-27 05:22:32 +08:00
}
2015-07-23 00:19:52 +08:00
protobuf {
protoc {
2023-08-04 01:53:38 +08:00
artifact = "com.google.protobuf:protoc:3.22.3"
2015-07-23 00:19:52 +08:00
}
plugins {
grpc {
2023-08-17 04:39:38 +08:00
artifact = 'io.grpc:protoc-gen-grpc-java:1.57.2'
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.
2022-07-05 12:13:01 +08:00
[Alpine grpc-java package]: https://pkgs.alpinelinux.org/package/edge/community/x86_64/grpc-java
2018-08-25 00:34:58 +08:00
2021-02-04 02:25:53 +08:00
For Android protobuf-based codegen integrated with the Gradle build system, also
use protobuf-gradle-plugin but specify the 'lite' options:
```gradle
plugins {
2023-07-21 00:48:39 +08:00
id 'com.google.protobuf' version '0.9.4'
2021-02-04 02:25:53 +08:00
}
protobuf {
protoc {
2023-08-04 01:53:38 +08:00
artifact = "com.google.protobuf:protoc:3.22.3"
2021-02-04 02:25:53 +08:00
}
plugins {
grpc {
2023-08-17 04:39:38 +08:00
artifact = 'io.grpc:protoc-gen-grpc-java:1.57.2'
2021-02-04 02:25:53 +08:00
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
java { option 'lite' }
}
task.plugins {
grpc { option 'lite' }
}
}
}
}
```
2023-05-27 03:42:50 +08:00
For [Bazel ](https://bazel.build ), use the [`proto_library` ](https://github.com/bazelbuild/rules_proto )
and the [`java_proto_library` ](https://bazel.build/reference/be/java#java_proto_library ) (no `load()` required)
and `load("@io_grpc_grpc_java//:java_grpc_library.bzl", "java_grpc_library")` (from this project), as in
[this example `BUILD.bazel` ](https://github.com/grpc/grpc-java/blob/master/examples/BUILD.bazel ).
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
2019-10-09 22:47:34 +08:00
that depends on gRPC. It may also be used to check for `@Internal` usage or
2018-08-14 23:02:22 +08:00
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
2022-11-29 02:00:33 +08:00
gRPC comes with multiple Transport implementations:
2015-08-06 07:48:15 +08:00
2022-11-29 02:00:33 +08:00
1. The Netty-based HTTP/2 transport is the main transport implementation based
on [Netty ](https://netty.io ). It is not officially supported on Android.
2. The OkHttp-based HTTP/2 transport is a lightweight transport based on
[Okio ](https://square.github.io/okio/ ) and forked low-level parts of
[OkHttp ](https://square.github.io/okhttp/ ). It is mainly for use on Android.
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
2022-11-29 02:00:33 +08:00
client. It is used frequently for testing, while also being safe for
production use.
4. The Binder transport is for Android cross-process communication on a single
device.