blob: 8ce46ed602f85390e42aef3f81833021dd3ce807 [file] [log] [blame] [view]
Kun Zhangd32bb472015-05-06 16:15:53 -07001gRPC-Java - An RPC library and framework
2========================================
3
Eric Gribkoff785ac472018-04-30 10:28:41 -07004gRPC-Java works with JDK 6. gRPC-Java clients are supported on Android API
5levels 14 and up (Ice Cream Sandwich and later). Deploying gRPC servers on an
6Android device is not supported.
Eric Gribkoffb9400842018-01-17 10:18:33 -08007
8TLS usage typically requires using Java 8, or Play Services Dynamic Security
9Provider on Android. Please see the [Security Readme](SECURITY.md).
ejonad4531da2014-12-15 10:24:42 -080010
nmittlerb7a72c12015-09-24 12:03:23 -070011<table>
12 <tr>
13 <td><b>Homepage:</b></td>
Mehrdad Afshari8ce0bc22017-07-10 22:48:17 +000014 <td><a href="https://grpc.io/">grpc.io</a></td>
nmittlerb7a72c12015-09-24 12:03:23 -070015 </tr>
16 <tr>
17 <td><b>Mailing List:</b></td>
18 <td><a href="https://groups.google.com/forum/#!forum/grpc-io">grpc-io@googlegroups.com</a></td>
19 </tr>
20</table>
21
Eric Anderson67ff1702016-12-06 09:27:10 -080022[![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)
nmittlerb7a72c12015-09-24 12:03:23 -070023[![Build Status](https://travis-ci.org/grpc/grpc-java.svg?branch=master)](https://travis-ci.org/grpc/grpc-java)
24[![Coverage Status](https://coveralls.io/repos/grpc/grpc-java/badge.svg?branch=master&service=github)](https://coveralls.io/github/grpc/grpc-java?branch=master)
25
Eric Anderson1eb16d92015-05-26 14:22:32 -070026Download
27--------
28
Eric Andersona62e9762016-06-14 10:58:38 -070029Download [the JARs][]. Or for Maven with non-Android, add to your `pom.xml`:
Eric Anderson1eb16d92015-05-26 14:22:32 -070030```xml
31<dependency>
32 <groupId>io.grpc</groupId>
Eric Andersona62e9762016-06-14 10:58:38 -070033 <artifactId>grpc-netty</artifactId>
Carl Mastrangelo128f54c2018-07-31 12:19:20 -070034 <version>1.14.0</version>
Eric Andersona62e9762016-06-14 10:58:38 -070035</dependency>
36<dependency>
37 <groupId>io.grpc</groupId>
38 <artifactId>grpc-protobuf</artifactId>
Carl Mastrangelo128f54c2018-07-31 12:19:20 -070039 <version>1.14.0</version>
Eric Andersona62e9762016-06-14 10:58:38 -070040</dependency>
41<dependency>
42 <groupId>io.grpc</groupId>
43 <artifactId>grpc-stub</artifactId>
Carl Mastrangelo128f54c2018-07-31 12:19:20 -070044 <version>1.14.0</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070045</dependency>
46```
47
Eric Andersona62e9762016-06-14 10:58:38 -070048Or for Gradle with non-Android, add to your dependencies:
Eric Anderson1eb16d92015-05-26 14:22:32 -070049```gradle
Carl Mastrangelo128f54c2018-07-31 12:19:20 -070050compile 'io.grpc:grpc-netty:1.14.0'
51compile 'io.grpc:grpc-protobuf:1.14.0'
52compile 'io.grpc:grpc-stub:1.14.0'
Eric Anderson1eb16d92015-05-26 14:22:32 -070053```
54
Eric Andersona62e9762016-06-14 10:58:38 -070055For Android client, use `grpc-okhttp` instead of `grpc-netty` and
Eric Andersonaa33c592016-07-29 12:38:03 -070056`grpc-protobuf-lite` or `grpc-protobuf-nano` instead of `grpc-protobuf`:
Xudong Ma996ea2f2015-10-07 11:03:41 -070057```gradle
Carl Mastrangelo128f54c2018-07-31 12:19:20 -070058compile 'io.grpc:grpc-okhttp:1.14.0'
59compile 'io.grpc:grpc-protobuf-lite:1.14.0'
60compile 'io.grpc:grpc-stub:1.14.0'
Xudong Ma996ea2f2015-10-07 11:03:41 -070061```
62
Eric Anderson4e8cf922016-05-12 13:00:47 -070063[the JARs]:
Carl Mastrangelo128f54c2018-07-31 12:19:20 -070064http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22io.grpc%22%20AND%20v%3A%221.14.0%22
Eric Anderson1eb16d92015-05-26 14:22:32 -070065
66Development snapshots are available in [Sonatypes's snapshot
67repository](https://oss.sonatype.org/content/repositories/snapshots/).
68
Eric Anderson52f17052016-01-27 10:33:32 -080069For protobuf-based codegen, you can put your proto files in the `src/main/proto`
70and `src/test/proto` directories along with an appropriate plugin.
71
Eric Anderson1eb16d92015-05-26 14:22:32 -070072For protobuf-based codegen integrated with the Maven build system, you can use
Eric Anderson06697b52016-11-14 21:04:22 -080073[protobuf-maven-plugin][] (Eclipse and NetBeans users should also look at
74`os-maven-plugin`'s
75[IDE documentation](https://github.com/trustin/os-maven-plugin#issues-with-eclipse-m2e-or-other-ides)):
Eric Anderson1eb16d92015-05-26 14:22:32 -070076```xml
77<build>
78 <extensions>
79 <extension>
80 <groupId>kr.motd.maven</groupId>
81 <artifactId>os-maven-plugin</artifactId>
Carl Mastrangelo21750042017-07-18 10:44:37 -070082 <version>1.5.0.Final</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070083 </extension>
84 </extensions>
85 <plugins>
86 <plugin>
Eric Anderson41c3f782016-02-16 15:29:24 -080087 <groupId>org.xolstice.maven.plugins</groupId>
88 <artifactId>protobuf-maven-plugin</artifactId>
Jorg Heymans2094bb42018-04-04 01:51:56 +020089 <version>0.5.1</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070090 <configuration>
Kun Zhang86d64122018-01-05 16:40:20 -080091 <protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070092 <pluginId>grpc-java</pluginId>
Carl Mastrangelo128f54c2018-07-31 12:19:20 -070093 <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.14.0:exe:${os.detected.classifier}</pluginArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070094 </configuration>
95 <executions>
96 <execution>
97 <goals>
98 <goal>compile</goal>
99 <goal>compile-custom</goal>
100 </goals>
101 </execution>
102 </executions>
103 </plugin>
104 </plugins>
105</build>
106```
107
Eric Anderson41c3f782016-02-16 15:29:24 -0800108[protobuf-maven-plugin]: https://www.xolstice.org/protobuf-maven-plugin/
Eric Anderson1eb16d92015-05-26 14:22:32 -0700109
110For protobuf-based codegen integrated with the Gradle build system, you can use
111[protobuf-gradle-plugin][]:
112```gradle
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700113apply plugin: 'java'
Eric Anderson1eb16d92015-05-26 14:22:32 -0700114apply plugin: 'com.google.protobuf'
115
116buildscript {
117 repositories {
118 mavenCentral()
119 }
120 dependencies {
Eric Anderson446f0cb2016-05-07 11:24:15 -0700121 // ASSUMES GRADLE 2.12 OR HIGHER. Use plugin version 0.7.5 with earlier
122 // gradle versions
Eric Anderson71bad372018-01-11 14:27:50 -0800123 classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3'
Eric Anderson1eb16d92015-05-26 14:22:32 -0700124 }
125}
126
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700127protobuf {
128 protoc {
Kun Zhang86d64122018-01-05 16:40:20 -0800129 artifact = "com.google.protobuf:protoc:3.5.1-1"
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700130 }
131 plugins {
132 grpc {
Carl Mastrangelo128f54c2018-07-31 12:19:20 -0700133 artifact = 'io.grpc:protoc-gen-grpc-java:1.14.0'
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700134 }
135 }
136 generateProtoTasks {
137 all()*.plugins {
138 grpc {}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700139 }
140 }
141}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700142```
143
144[protobuf-gradle-plugin]: https://github.com/google/protobuf-gradle-plugin
145
Eric Andersonfb28ad22015-01-29 15:00:58 -0800146How to Build
147------------
148
Eric Anderson1b1c6462015-08-14 08:49:56 -0700149If you are making changes to gRPC-Java, see the [compiling
150instructions](COMPILING.md).
Kun Zhang9805e272015-05-12 17:03:19 -0700151
Eric Andersonfb28ad22015-01-29 15:00:58 -0800152Navigating Around the Source
153----------------------------
154
mekka99907942015-08-07 23:28:06 -0700155Here's a quick readers' guide to the code to help folks get started. At a high
Kun Zhangfc85a402015-08-05 16:48:15 -0700156level there are three distinct layers to the library: __Stub__, __Channel__ &
157__Transport__.
ejonad4531da2014-12-15 10:24:42 -0800158
Eric Andersonfb28ad22015-01-29 15:00:58 -0800159### Stub
ejonad4531da2014-12-15 10:24:42 -0800160
Kun Zhangfc85a402015-08-05 16:48:15 -0700161The Stub layer is what is exposed to most developers and provides type-safe
162bindings to whatever datamodel/IDL/interface you are adapting. gRPC comes with
163a [plugin](https://github.com/google/grpc-java/blob/master/compiler) to the
164protocol-buffers compiler that generates Stub interfaces out of `.proto` files,
165but bindings to other datamodel/IDL should be trivial to add and are welcome.
ejonad4531da2014-12-15 10:24:42 -0800166
167#### Key Interfaces
168
nmittlerf8314582015-01-27 10:25:39 -0800169[Stream Observer](https://github.com/google/grpc-java/blob/master/stub/src/main/java/io/grpc/stub/StreamObserver.java)
ejonad4531da2014-12-15 10:24:42 -0800170
Eric Andersonfb28ad22015-01-29 15:00:58 -0800171### Channel
ejonad4531da2014-12-15 10:24:42 -0800172
Kun Zhangfc85a402015-08-05 16:48:15 -0700173The Channel layer is an abstraction over Transport handling that is suitable for
174interception/decoration and exposes more behavior to the application than the
175Stub layer. It is intended to be easy for application frameworks to use this
176layer to address cross-cutting concerns such as logging, monitoring, auth etc.
177Flow-control is also exposed at this layer to allow more sophisticated
178applications to interact with it directly.
ejonad4531da2014-12-15 10:24:42 -0800179
180#### Common
181
nmittlerf8314582015-01-27 10:25:39 -0800182* [Metadata - headers & trailers](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Metadata.java)
183* [Status - error code namespace & handling](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Status.java)
ejonad4531da2014-12-15 10:24:42 -0800184
185#### Client
nmittlerf8314582015-01-27 10:25:39 -0800186* [Channel - client side binding](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Channel.java)
Kun Zhang2ee4d022015-06-04 16:39:25 -0700187* [Client Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientCall.java)
nmittlerf8314582015-01-27 10:25:39 -0800188* [Client Interceptor](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientInterceptor.java)
ejonad4531da2014-12-15 10:24:42 -0800189
190#### Server
nmittlerf8314582015-01-27 10:25:39 -0800191* [Server call handler - analog to Channel on server](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCallHandler.java)
192* [Server Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCall.java)
ejonad4531da2014-12-15 10:24:42 -0800193
194
Eric Andersonfb28ad22015-01-29 15:00:58 -0800195### Transport
ejonad4531da2014-12-15 10:24:42 -0800196
mekka99907942015-08-07 23:28:06 -0700197The Transport layer does the heavy lifting of putting and taking bytes off the
Kun Zhangfc85a402015-08-05 16:48:15 -0700198wire. The interfaces to it are abstract just enough to allow plugging in of
199different implementations. Transports are modeled as `Stream` factories. The
200variation in interface between a server Stream and a client Stream exists to
201codify their differing semantics for cancellation and error reporting.
202
203Note the transport layer API is considered internal to gRPC and has weaker API
204guarantees than the core API under package `io.grpc`.
205
mekka99907942015-08-07 23:28:06 -0700206gRPC comes with three Transport implementations:
Kun Zhangfc85a402015-08-05 16:48:15 -0700207
2081. The [Netty-based](https://github.com/google/grpc-java/blob/master/netty)
209 transport is the main transport implementation based on
210 [Netty](http://netty.io). It is for both the client and the server.
2112. The [OkHttp-based](https://github.com/google/grpc-java/blob/master/okhttp)
212 transport is a lightweight transport based on
213 [OkHttp](http://square.github.io/okhttp/). It is mainly for use on Android
mekka99907942015-08-07 23:28:06 -0700214 and is for client only.
Kun Zhangfc85a402015-08-05 16:48:15 -07002153. The
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700216 [inProcess](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/inprocess)
Kun Zhangfc85a402015-08-05 16:48:15 -0700217 transport is for when a server is in the same process as the client. It is
218 useful for testing.
ejonad4531da2014-12-15 10:24:42 -0800219
220#### Common
221
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700222* [Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/Stream.java)
223* [Stream Listener](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/StreamListener.java)
ejonad4531da2014-12-15 10:24:42 -0800224
225#### Client
226
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700227* [Client Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ClientStream.java)
228* [Client Stream Listener](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ClientStreamListener.java)
ejonad4531da2014-12-15 10:24:42 -0800229
230#### Server
231
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700232* [Server Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ServerStream.java)
233* [Server Stream Listener](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ServerStreamListener.java)
ejonad4531da2014-12-15 10:24:42 -0800234
235
Kun Zhangd0d2c1e2017-01-18 09:06:45 -0800236Examples
237--------
ejonad4531da2014-12-15 10:24:42 -0800238
Kun Zhangd0d2c1e2017-01-18 09:06:45 -0800239The [examples](https://github.com/grpc/grpc-java/tree/master/examples)
240and the
241[Android example](https://github.com/grpc/grpc-java/tree/master/examples/android) are standalone projects that
242showcase the usage of gRPC.
Shohei Kamimori5af25152018-03-29 07:34:18 +0900243
244Tools
245-----
246
247APIs annotated with `@Internal` are for internal use by the gRPC library and
248should not be used by gRPC users. APIs annotated with `@ExperimentalApi` are
249subject to change in future releases, and library code that other projects
250may depend on should not use these APIs. We recommend using the
251[grpc-java-api-checker](https://github.com/grpc/grpc-java-api-checker)
252(an [Error Prone](https://github.com/google/error-prone) plugin)
253to check for usages of `@ExperimentalApi` and `@Internal` in any library code
254that depends on gRPC. It may also be used to check for `@Internal` usage or
255unintended `@ExperimentalApi` consumption in non-library code.