blob: c5a6b547cbf7f0d5a74778bff992cb1de3826625 [file] [log] [blame] [view]
Kun Zhangd32bb472015-05-06 16:15:53 -07001gRPC-Java - An RPC library and framework
2========================================
3
Eric Anderson65291322015-05-15 11:57:05 -07004gRPC-Java works with JDK 6. TLS usage typically requires using Java 8, or Play
nmittler24830092015-05-28 13:12:56 -07005Services Dynamic Security Provider on Android. Please see the [Security
6Readme](SECURITY.md).
ejonad4531da2014-12-15 10:24:42 -08007
nmittlerb7a72c12015-09-24 12:03:23 -07008<table>
9 <tr>
10 <td><b>Homepage:</b></td>
11 <td><a href="http://www.grpc.io/">www.grpc.io</a></td>
12 </tr>
13 <tr>
14 <td><b>Mailing List:</b></td>
15 <td><a href="https://groups.google.com/forum/#!forum/grpc-io">grpc-io@googlegroups.com</a></td>
16 </tr>
17</table>
18
19[![Build Status](https://travis-ci.org/grpc/grpc-java.svg?branch=master)](https://travis-ci.org/grpc/grpc-java)
20[![Coverage Status](https://coveralls.io/repos/grpc/grpc-java/badge.svg?branch=master&service=github)](https://coveralls.io/github/grpc/grpc-java?branch=master)
21
Eric Anderson1eb16d92015-05-26 14:22:32 -070022Download
23--------
24
25Download [the JAR][]. Or for Maven, add to your `pom.xml`:
26```xml
27<dependency>
28 <groupId>io.grpc</groupId>
29 <artifactId>grpc-all</artifactId>
Carl Mastrangelob4fc9292016-05-02 15:07:45 -070030 <version>0.14.0</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070031</dependency>
32```
33
34Or for Gradle, add to your dependencies:
35```gradle
Carl Mastrangelob4fc9292016-05-02 15:07:45 -070036compile 'io.grpc:grpc-all:0.14.0'
Eric Anderson1eb16d92015-05-26 14:22:32 -070037```
38
Xudong Ma996ea2f2015-10-07 11:03:41 -070039For Android client, you only need to depend on the needed sub-projects, such as:
40```gradle
Carl Mastrangelob4fc9292016-05-02 15:07:45 -070041compile 'io.grpc:grpc-okhttp:0.14.0'
42compile 'io.grpc:grpc-protobuf-nano:0.14.0'
43compile 'io.grpc:grpc-stub:0.14.0'
Xudong Ma996ea2f2015-10-07 11:03:41 -070044```
45
Carl Mastrangelob4fc9292016-05-02 15:07:45 -070046[the JAR]: https://search.maven.org/remote_content?g=io.grpc&a=grpc-all&v=0.14.0
Eric Anderson1eb16d92015-05-26 14:22:32 -070047
48Development snapshots are available in [Sonatypes's snapshot
49repository](https://oss.sonatype.org/content/repositories/snapshots/).
50
Eric Anderson52f17052016-01-27 10:33:32 -080051For protobuf-based codegen, you can put your proto files in the `src/main/proto`
52and `src/test/proto` directories along with an appropriate plugin.
53
Eric Anderson1eb16d92015-05-26 14:22:32 -070054For protobuf-based codegen integrated with the Maven build system, you can use
Eric Anderson41c3f782016-02-16 15:29:24 -080055[protobuf-maven-plugin][]:
Eric Anderson1eb16d92015-05-26 14:22:32 -070056```xml
57<build>
58 <extensions>
59 <extension>
60 <groupId>kr.motd.maven</groupId>
61 <artifactId>os-maven-plugin</artifactId>
Eric Anderson41c3f782016-02-16 15:29:24 -080062 <version>1.4.1.Final</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070063 </extension>
64 </extensions>
65 <plugins>
66 <plugin>
Eric Anderson41c3f782016-02-16 15:29:24 -080067 <groupId>org.xolstice.maven.plugins</groupId>
68 <artifactId>protobuf-maven-plugin</artifactId>
69 <version>0.5.0</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070070 <configuration>
Kun Zhang8bd8ed82015-07-22 09:19:52 -070071 <!--
72 The version of protoc must match protobuf-java. If you don't depend on
73 protobuf-java directly, you will be transitively depending on the
74 protobuf-java version that grpc depends on.
75 -->
Eric Anderson85e68db2016-02-18 12:54:10 -080076 <protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}</protocArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070077 <pluginId>grpc-java</pluginId>
Carl Mastrangelob4fc9292016-05-02 15:07:45 -070078 <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.14.0:exe:${os.detected.classifier}</pluginArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070079 </configuration>
80 <executions>
81 <execution>
82 <goals>
83 <goal>compile</goal>
84 <goal>compile-custom</goal>
85 </goals>
86 </execution>
87 </executions>
88 </plugin>
89 </plugins>
90</build>
91```
92
Eric Anderson41c3f782016-02-16 15:29:24 -080093[protobuf-maven-plugin]: https://www.xolstice.org/protobuf-maven-plugin/
Eric Anderson1eb16d92015-05-26 14:22:32 -070094
95For protobuf-based codegen integrated with the Gradle build system, you can use
96[protobuf-gradle-plugin][]:
97```gradle
Kun Zhang8bd8ed82015-07-22 09:19:52 -070098apply plugin: 'java'
Eric Anderson1eb16d92015-05-26 14:22:32 -070099apply plugin: 'com.google.protobuf'
100
101buildscript {
102 repositories {
103 mavenCentral()
104 }
105 dependencies {
Eric Andersone61e6c22016-02-04 09:31:14 -0800106 classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.4'
Eric Anderson1eb16d92015-05-26 14:22:32 -0700107 }
108}
109
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700110protobuf {
111 protoc {
112 // The version of protoc must match protobuf-java. If you don't depend on
113 // protobuf-java directly, you will be transitively depending on the
114 // protobuf-java version that grpc depends on.
Eric Anderson85e68db2016-02-18 12:54:10 -0800115 artifact = "com.google.protobuf:protoc:3.0.0-beta-2"
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700116 }
117 plugins {
118 grpc {
Carl Mastrangelob4fc9292016-05-02 15:07:45 -0700119 artifact = 'io.grpc:protoc-gen-grpc-java:0.14.0'
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700120 }
121 }
122 generateProtoTasks {
123 all()*.plugins {
124 grpc {}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700125 }
126 }
127}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700128```
129
130[protobuf-gradle-plugin]: https://github.com/google/protobuf-gradle-plugin
131
Eric Andersonfb28ad22015-01-29 15:00:58 -0800132How to Build
133------------
134
Eric Anderson1b1c6462015-08-14 08:49:56 -0700135If you are making changes to gRPC-Java, see the [compiling
136instructions](COMPILING.md).
Kun Zhang9805e272015-05-12 17:03:19 -0700137
Eric Andersonfb28ad22015-01-29 15:00:58 -0800138Navigating Around the Source
139----------------------------
140
mekka99907942015-08-07 23:28:06 -0700141Here's a quick readers' guide to the code to help folks get started. At a high
Kun Zhangfc85a402015-08-05 16:48:15 -0700142level there are three distinct layers to the library: __Stub__, __Channel__ &
143__Transport__.
ejonad4531da2014-12-15 10:24:42 -0800144
Eric Andersonfb28ad22015-01-29 15:00:58 -0800145### Stub
ejonad4531da2014-12-15 10:24:42 -0800146
Kun Zhangfc85a402015-08-05 16:48:15 -0700147The Stub layer is what is exposed to most developers and provides type-safe
148bindings to whatever datamodel/IDL/interface you are adapting. gRPC comes with
149a [plugin](https://github.com/google/grpc-java/blob/master/compiler) to the
150protocol-buffers compiler that generates Stub interfaces out of `.proto` files,
151but bindings to other datamodel/IDL should be trivial to add and are welcome.
ejonad4531da2014-12-15 10:24:42 -0800152
153#### Key Interfaces
154
nmittlerf8314582015-01-27 10:25:39 -0800155[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 -0800156
Eric Andersonfb28ad22015-01-29 15:00:58 -0800157### Channel
ejonad4531da2014-12-15 10:24:42 -0800158
Kun Zhangfc85a402015-08-05 16:48:15 -0700159The Channel layer is an abstraction over Transport handling that is suitable for
160interception/decoration and exposes more behavior to the application than the
161Stub layer. It is intended to be easy for application frameworks to use this
162layer to address cross-cutting concerns such as logging, monitoring, auth etc.
163Flow-control is also exposed at this layer to allow more sophisticated
164applications to interact with it directly.
ejonad4531da2014-12-15 10:24:42 -0800165
166#### Common
167
nmittlerf8314582015-01-27 10:25:39 -0800168* [Metadata - headers & trailers](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Metadata.java)
169* [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 -0800170
171#### Client
nmittlerf8314582015-01-27 10:25:39 -0800172* [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 -0700173* [Client Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientCall.java)
nmittlerf8314582015-01-27 10:25:39 -0800174* [Client Interceptor](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientInterceptor.java)
ejonad4531da2014-12-15 10:24:42 -0800175
176#### Server
nmittlerf8314582015-01-27 10:25:39 -0800177* [Server call handler - analog to Channel on server](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCallHandler.java)
178* [Server Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCall.java)
ejonad4531da2014-12-15 10:24:42 -0800179
180
Eric Andersonfb28ad22015-01-29 15:00:58 -0800181### Transport
ejonad4531da2014-12-15 10:24:42 -0800182
mekka99907942015-08-07 23:28:06 -0700183The Transport layer does the heavy lifting of putting and taking bytes off the
Kun Zhangfc85a402015-08-05 16:48:15 -0700184wire. The interfaces to it are abstract just enough to allow plugging in of
185different implementations. Transports are modeled as `Stream` factories. The
186variation in interface between a server Stream and a client Stream exists to
187codify their differing semantics for cancellation and error reporting.
188
189Note the transport layer API is considered internal to gRPC and has weaker API
190guarantees than the core API under package `io.grpc`.
191
mekka99907942015-08-07 23:28:06 -0700192gRPC comes with three Transport implementations:
Kun Zhangfc85a402015-08-05 16:48:15 -0700193
1941. The [Netty-based](https://github.com/google/grpc-java/blob/master/netty)
195 transport is the main transport implementation based on
196 [Netty](http://netty.io). It is for both the client and the server.
1972. The [OkHttp-based](https://github.com/google/grpc-java/blob/master/okhttp)
198 transport is a lightweight transport based on
199 [OkHttp](http://square.github.io/okhttp/). It is mainly for use on Android
mekka99907942015-08-07 23:28:06 -0700200 and is for client only.
Kun Zhangfc85a402015-08-05 16:48:15 -07002013. The
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700202 [inProcess](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/inprocess)
Kun Zhangfc85a402015-08-05 16:48:15 -0700203 transport is for when a server is in the same process as the client. It is
204 useful for testing.
ejonad4531da2014-12-15 10:24:42 -0800205
206#### Common
207
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700208* [Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/Stream.java)
209* [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 -0800210
211#### Client
212
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700213* [Client Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ClientStream.java)
214* [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 -0800215
216#### Server
217
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700218* [Server Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ServerStream.java)
219* [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 -0800220
221
Eric Andersonfb28ad22015-01-29 15:00:58 -0800222### Examples
ejonad4531da2014-12-15 10:24:42 -0800223
Kun Zhangfc85a402015-08-05 16:48:15 -0700224Tests showing how these layers are composed to execute calls using protobuf
225messages can be found here
226https://github.com/google/grpc-java/tree/master/interop-testing/src/main/java/io/grpc/testing/integration