blob: bafd90d1a115b80ca4c462864e2ef26693d9db20 [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 Anderson446f0cb2016-05-07 11:24:15 -0700106 // ASSUMES GRADLE 2.12 OR HIGHER. Use plugin version 0.7.5 with earlier
107 // gradle versions
108 classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.7'
Eric Anderson1eb16d92015-05-26 14:22:32 -0700109 }
110}
111
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700112protobuf {
113 protoc {
114 // The version of protoc must match protobuf-java. If you don't depend on
115 // protobuf-java directly, you will be transitively depending on the
116 // protobuf-java version that grpc depends on.
Eric Anderson85e68db2016-02-18 12:54:10 -0800117 artifact = "com.google.protobuf:protoc:3.0.0-beta-2"
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700118 }
119 plugins {
120 grpc {
Carl Mastrangelob4fc9292016-05-02 15:07:45 -0700121 artifact = 'io.grpc:protoc-gen-grpc-java:0.14.0'
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700122 }
123 }
124 generateProtoTasks {
125 all()*.plugins {
126 grpc {}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700127 }
128 }
129}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700130```
131
132[protobuf-gradle-plugin]: https://github.com/google/protobuf-gradle-plugin
133
Eric Andersonfb28ad22015-01-29 15:00:58 -0800134How to Build
135------------
136
Eric Anderson1b1c6462015-08-14 08:49:56 -0700137If you are making changes to gRPC-Java, see the [compiling
138instructions](COMPILING.md).
Kun Zhang9805e272015-05-12 17:03:19 -0700139
Eric Andersonfb28ad22015-01-29 15:00:58 -0800140Navigating Around the Source
141----------------------------
142
mekka99907942015-08-07 23:28:06 -0700143Here's a quick readers' guide to the code to help folks get started. At a high
Kun Zhangfc85a402015-08-05 16:48:15 -0700144level there are three distinct layers to the library: __Stub__, __Channel__ &
145__Transport__.
ejonad4531da2014-12-15 10:24:42 -0800146
Eric Andersonfb28ad22015-01-29 15:00:58 -0800147### Stub
ejonad4531da2014-12-15 10:24:42 -0800148
Kun Zhangfc85a402015-08-05 16:48:15 -0700149The Stub layer is what is exposed to most developers and provides type-safe
150bindings to whatever datamodel/IDL/interface you are adapting. gRPC comes with
151a [plugin](https://github.com/google/grpc-java/blob/master/compiler) to the
152protocol-buffers compiler that generates Stub interfaces out of `.proto` files,
153but bindings to other datamodel/IDL should be trivial to add and are welcome.
ejonad4531da2014-12-15 10:24:42 -0800154
155#### Key Interfaces
156
nmittlerf8314582015-01-27 10:25:39 -0800157[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 -0800158
Eric Andersonfb28ad22015-01-29 15:00:58 -0800159### Channel
ejonad4531da2014-12-15 10:24:42 -0800160
Kun Zhangfc85a402015-08-05 16:48:15 -0700161The Channel layer is an abstraction over Transport handling that is suitable for
162interception/decoration and exposes more behavior to the application than the
163Stub layer. It is intended to be easy for application frameworks to use this
164layer to address cross-cutting concerns such as logging, monitoring, auth etc.
165Flow-control is also exposed at this layer to allow more sophisticated
166applications to interact with it directly.
ejonad4531da2014-12-15 10:24:42 -0800167
168#### Common
169
nmittlerf8314582015-01-27 10:25:39 -0800170* [Metadata - headers & trailers](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Metadata.java)
171* [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 -0800172
173#### Client
nmittlerf8314582015-01-27 10:25:39 -0800174* [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 -0700175* [Client Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientCall.java)
nmittlerf8314582015-01-27 10:25:39 -0800176* [Client Interceptor](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientInterceptor.java)
ejonad4531da2014-12-15 10:24:42 -0800177
178#### Server
nmittlerf8314582015-01-27 10:25:39 -0800179* [Server call handler - analog to Channel on server](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCallHandler.java)
180* [Server Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCall.java)
ejonad4531da2014-12-15 10:24:42 -0800181
182
Eric Andersonfb28ad22015-01-29 15:00:58 -0800183### Transport
ejonad4531da2014-12-15 10:24:42 -0800184
mekka99907942015-08-07 23:28:06 -0700185The Transport layer does the heavy lifting of putting and taking bytes off the
Kun Zhangfc85a402015-08-05 16:48:15 -0700186wire. The interfaces to it are abstract just enough to allow plugging in of
187different implementations. Transports are modeled as `Stream` factories. The
188variation in interface between a server Stream and a client Stream exists to
189codify their differing semantics for cancellation and error reporting.
190
191Note the transport layer API is considered internal to gRPC and has weaker API
192guarantees than the core API under package `io.grpc`.
193
mekka99907942015-08-07 23:28:06 -0700194gRPC comes with three Transport implementations:
Kun Zhangfc85a402015-08-05 16:48:15 -0700195
1961. The [Netty-based](https://github.com/google/grpc-java/blob/master/netty)
197 transport is the main transport implementation based on
198 [Netty](http://netty.io). It is for both the client and the server.
1992. The [OkHttp-based](https://github.com/google/grpc-java/blob/master/okhttp)
200 transport is a lightweight transport based on
201 [OkHttp](http://square.github.io/okhttp/). It is mainly for use on Android
mekka99907942015-08-07 23:28:06 -0700202 and is for client only.
Kun Zhangfc85a402015-08-05 16:48:15 -07002033. The
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700204 [inProcess](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/inprocess)
Kun Zhangfc85a402015-08-05 16:48:15 -0700205 transport is for when a server is in the same process as the client. It is
206 useful for testing.
ejonad4531da2014-12-15 10:24:42 -0800207
208#### Common
209
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700210* [Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/Stream.java)
211* [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 -0800212
213#### Client
214
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700215* [Client Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ClientStream.java)
216* [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 -0800217
218#### Server
219
Kun Zhange1bd6ef2015-08-11 11:17:39 -0700220* [Server Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/internal/ServerStream.java)
221* [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 -0800222
223
Eric Andersonfb28ad22015-01-29 15:00:58 -0800224### Examples
ejonad4531da2014-12-15 10:24:42 -0800225
Kun Zhangfc85a402015-08-05 16:48:15 -0700226Tests showing how these layers are composed to execute calls using protobuf
227messages can be found here
228https://github.com/google/grpc-java/tree/master/interop-testing/src/main/java/io/grpc/testing/integration