blob: 2bc3a6ff6b73fe6e6573ccf1acf230c4a8f405a5 [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>
Eric Anderson9ea70ad2015-09-29 13:09:52 -070030 <version>0.9.0</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070031</dependency>
32```
33
34Or for Gradle, add to your dependencies:
35```gradle
Eric Anderson9ea70ad2015-09-29 13:09:52 -070036compile 'io.grpc:grpc-all:0.9.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
41compile 'io.grpc:grpc-okhttp:0.9.0'
42compile 'io.grpc:grpc-protobuf-nano:0.9.0'
43compile 'io.grpc:grpc-stub:0.9.0'
44```
45
Eric Anderson9ea70ad2015-09-29 13:09:52 -070046[the JAR]: https://search.maven.org/remote_content?g=io.grpc&a=grpc-all&v=0.9.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
55[maven-protoc-plugin][]:
56```xml
Kun Zhang7a716272015-06-30 18:13:27 -070057<pluginRepositories>
58 <pluginRepository>
59 <releases>
60 <updatePolicy>never</updatePolicy>
61 </releases>
62 <snapshots>
63 <enabled>false</enabled>
64 </snapshots>
65 <id>central</id>
66 <name>Central Repository</name>
67 <url>https://repo.maven.apache.org/maven2</url>
68 </pluginRepository>
69 <pluginRepository>
70 <id>protoc-plugin</id>
71 <url>https://dl.bintray.com/sergei-ivanov/maven/</url>
72 </pluginRepository>
73</pluginRepositories>
Eric Anderson1eb16d92015-05-26 14:22:32 -070074<build>
75 <extensions>
76 <extension>
77 <groupId>kr.motd.maven</groupId>
78 <artifactId>os-maven-plugin</artifactId>
Artem Prigoda24c398e2015-09-16 22:52:26 +030079 <version>1.4.0.Final</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070080 </extension>
81 </extensions>
82 <plugins>
83 <plugin>
84 <groupId>com.google.protobuf.tools</groupId>
85 <artifactId>maven-protoc-plugin</artifactId>
86 <version>0.4.2</version>
87 <configuration>
Kun Zhang8bd8ed82015-07-22 09:19:52 -070088 <!--
89 The version of protoc must match protobuf-java. If you don't depend on
90 protobuf-java directly, you will be transitively depending on the
91 protobuf-java version that grpc depends on.
92 -->
Eric Anderson9ea70ad2015-09-29 13:09:52 -070093 <protocArtifact>com.google.protobuf:protoc:3.0.0-beta-1:exe:${os.detected.classifier}</protocArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070094 <pluginId>grpc-java</pluginId>
Eric Anderson9ea70ad2015-09-29 13:09:52 -070095 <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.9.0:exe:${os.detected.classifier}</pluginArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070096 </configuration>
97 <executions>
98 <execution>
99 <goals>
100 <goal>compile</goal>
101 <goal>compile-custom</goal>
102 </goals>
103 </execution>
104 </executions>
105 </plugin>
106 </plugins>
107</build>
108```
109
110[maven-protoc-plugin]: http://sergei-ivanov.github.io/maven-protoc-plugin/
111
112For protobuf-based codegen integrated with the Gradle build system, you can use
113[protobuf-gradle-plugin][]:
114```gradle
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700115apply plugin: 'java'
Eric Anderson1eb16d92015-05-26 14:22:32 -0700116apply plugin: 'com.google.protobuf'
117
118buildscript {
119 repositories {
120 mavenCentral()
121 }
122 dependencies {
Kun Zhang137b2ef2015-08-03 11:10:22 -0700123 classpath 'com.google.protobuf:protobuf-gradle-plugin:0.6.1'
Eric Anderson1eb16d92015-05-26 14:22:32 -0700124 }
125}
126
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700127protobuf {
128 protoc {
129 // The version of protoc must match protobuf-java. If you don't depend on
130 // protobuf-java directly, you will be transitively depending on the
131 // protobuf-java version that grpc depends on.
Eric Anderson9ea70ad2015-09-29 13:09:52 -0700132 artifact = "com.google.protobuf:protoc:3.0.0-beta-1"
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700133 }
134 plugins {
135 grpc {
Eric Anderson9ea70ad2015-09-29 13:09:52 -0700136 artifact = 'io.grpc:protoc-gen-grpc-java:0.9.0'
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700137 }
138 }
139 generateProtoTasks {
140 all()*.plugins {
141 grpc {}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700142 }
143 }
144}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700145```
146
147[protobuf-gradle-plugin]: https://github.com/google/protobuf-gradle-plugin
148
Eric Andersonfb28ad22015-01-29 15:00:58 -0800149How to Build
150------------
151
Eric Anderson1b1c6462015-08-14 08:49:56 -0700152If you are making changes to gRPC-Java, see the [compiling
153instructions](COMPILING.md).
Kun Zhang9805e272015-05-12 17:03:19 -0700154
Eric Andersonfb28ad22015-01-29 15:00:58 -0800155Navigating Around the Source
156----------------------------
157
mekka99907942015-08-07 23:28:06 -0700158Here's a quick readers' guide to the code to help folks get started. At a high
Kun Zhangfc85a402015-08-05 16:48:15 -0700159level there are three distinct layers to the library: __Stub__, __Channel__ &
160__Transport__.
ejonad4531da2014-12-15 10:24:42 -0800161
Eric Andersonfb28ad22015-01-29 15:00:58 -0800162### Stub
ejonad4531da2014-12-15 10:24:42 -0800163
Kun Zhangfc85a402015-08-05 16:48:15 -0700164The Stub layer is what is exposed to most developers and provides type-safe
165bindings to whatever datamodel/IDL/interface you are adapting. gRPC comes with
166a [plugin](https://github.com/google/grpc-java/blob/master/compiler) to the
167protocol-buffers compiler that generates Stub interfaces out of `.proto` files,
168but bindings to other datamodel/IDL should be trivial to add and are welcome.
ejonad4531da2014-12-15 10:24:42 -0800169
170#### Key Interfaces
171
nmittlerf8314582015-01-27 10:25:39 -0800172[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 -0800173
Eric Andersonfb28ad22015-01-29 15:00:58 -0800174### Channel
ejonad4531da2014-12-15 10:24:42 -0800175
Kun Zhangfc85a402015-08-05 16:48:15 -0700176The Channel layer is an abstraction over Transport handling that is suitable for
177interception/decoration and exposes more behavior to the application than the
178Stub layer. It is intended to be easy for application frameworks to use this
179layer to address cross-cutting concerns such as logging, monitoring, auth etc.
180Flow-control is also exposed at this layer to allow more sophisticated
181applications to interact with it directly.
ejonad4531da2014-12-15 10:24:42 -0800182
183#### Common
184
nmittlerf8314582015-01-27 10:25:39 -0800185* [Metadata - headers & trailers](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Metadata.java)
186* [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 -0800187
188#### Client
nmittlerf8314582015-01-27 10:25:39 -0800189* [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 -0700190* [Client Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientCall.java)
nmittlerf8314582015-01-27 10:25:39 -0800191* [Client Interceptor](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientInterceptor.java)
ejonad4531da2014-12-15 10:24:42 -0800192
193#### Server
nmittlerf8314582015-01-27 10:25:39 -0800194* [Server call handler - analog to Channel on server](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCallHandler.java)
195* [Server Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCall.java)
ejonad4531da2014-12-15 10:24:42 -0800196
197
Eric Andersonfb28ad22015-01-29 15:00:58 -0800198### Transport
ejonad4531da2014-12-15 10:24:42 -0800199
mekka99907942015-08-07 23:28:06 -0700200The Transport layer does the heavy lifting of putting and taking bytes off the
Kun Zhangfc85a402015-08-05 16:48:15 -0700201wire. The interfaces to it are abstract just enough to allow plugging in of
202different implementations. Transports are modeled as `Stream` factories. The
203variation in interface between a server Stream and a client Stream exists to
204codify their differing semantics for cancellation and error reporting.
205
206Note the transport layer API is considered internal to gRPC and has weaker API
207guarantees than the core API under package `io.grpc`.
208
mekka99907942015-08-07 23:28:06 -0700209gRPC comes with three Transport implementations:
Kun Zhangfc85a402015-08-05 16:48:15 -0700210
2111. The [Netty-based](https://github.com/google/grpc-java/blob/master/netty)
212 transport is the main transport implementation based on
213 [Netty](http://netty.io). It is for both the client and the server.
2142. The [OkHttp-based](https://github.com/google/grpc-java/blob/master/okhttp)
215 transport is a lightweight transport based on
216 [OkHttp](http://square.github.io/okhttp/). It is mainly for use on Android
mekka99907942015-08-07 23:28:06 -0700217 and is for client only.
Kun Zhangfc85a402015-08-05 16:48:15 -07002183. The
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700219 [inProcess](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/inprocess)
Kun Zhangfc85a402015-08-05 16:48:15 -0700220 transport is for when a server is in the same process as the client. It is
221 useful for testing.
ejonad4531da2014-12-15 10:24:42 -0800222
223#### Common
224
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700225* [Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/Stream.java)
226* [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 -0800227
228#### Client
229
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700230* [Client Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ClientStream.java)
231* [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 -0800232
233#### Server
234
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700235* [Server Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ServerStream.java)
236* [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 -0800237
238
Eric Andersonfb28ad22015-01-29 15:00:58 -0800239### Examples
ejonad4531da2014-12-15 10:24:42 -0800240
Kun Zhangfc85a402015-08-05 16:48:15 -0700241Tests showing how these layers are composed to execute calls using protobuf
242messages can be found here
243https://github.com/google/grpc-java/tree/master/interop-testing/src/main/java/io/grpc/testing/integration