blob: 720234c8b620f3161a5efc191de6c8efb2570014 [file] [log] [blame] [view]
Eric Anderson65291322015-05-15 11:57:05 -07001[![Build Status](https://travis-ci.org/grpc/grpc-java.svg?branch=master)](https://travis-ci.org/grpc/grpc-java)
2
Kun Zhangd32bb472015-05-06 16:15:53 -07003gRPC-Java - An RPC library and framework
4========================================
5
Eric Anderson65291322015-05-15 11:57:05 -07006gRPC-Java works with JDK 6. TLS usage typically requires using Java 8, or Play
nmittler24830092015-05-28 13:12:56 -07007Services Dynamic Security Provider on Android. Please see the [Security
8Readme](SECURITY.md).
ejonad4531da2014-12-15 10:24:42 -08009
Eric Anderson1eb16d92015-05-26 14:22:32 -070010Download
11--------
12
13Download [the JAR][]. Or for Maven, add to your `pom.xml`:
14```xml
15<dependency>
16 <groupId>io.grpc</groupId>
17 <artifactId>grpc-all</artifactId>
nmittlerd94fedc2015-06-12 07:32:50 -070018 <version>0.7.1</version>
Eric Anderson1eb16d92015-05-26 14:22:32 -070019</dependency>
20```
21
22Or for Gradle, add to your dependencies:
23```gradle
nmittlerd94fedc2015-06-12 07:32:50 -070024compile 'io.grpc:grpc-all:0.7.1'
Eric Anderson1eb16d92015-05-26 14:22:32 -070025```
26
nmittlerd94fedc2015-06-12 07:32:50 -070027[the JAR]: https://search.maven.org/remote_content?g=io.grpc&a=grpc-all&v=0.7.1
Eric Anderson1eb16d92015-05-26 14:22:32 -070028
29Development snapshots are available in [Sonatypes's snapshot
30repository](https://oss.sonatype.org/content/repositories/snapshots/).
31
32For protobuf-based codegen integrated with the Maven build system, you can use
33[maven-protoc-plugin][]:
34```xml
Kun Zhang7a716272015-06-30 18:13:27 -070035<pluginRepositories>
36 <pluginRepository>
37 <releases>
38 <updatePolicy>never</updatePolicy>
39 </releases>
40 <snapshots>
41 <enabled>false</enabled>
42 </snapshots>
43 <id>central</id>
44 <name>Central Repository</name>
45 <url>https://repo.maven.apache.org/maven2</url>
46 </pluginRepository>
47 <pluginRepository>
48 <id>protoc-plugin</id>
49 <url>https://dl.bintray.com/sergei-ivanov/maven/</url>
50 </pluginRepository>
51</pluginRepositories>
Eric Anderson1eb16d92015-05-26 14:22:32 -070052<build>
53 <extensions>
54 <extension>
55 <groupId>kr.motd.maven</groupId>
56 <artifactId>os-maven-plugin</artifactId>
57 <version>1.2.3.Final</version>
58 </extension>
59 </extensions>
60 <plugins>
61 <plugin>
62 <groupId>com.google.protobuf.tools</groupId>
63 <artifactId>maven-protoc-plugin</artifactId>
64 <version>0.4.2</version>
65 <configuration>
Kun Zhang8bd8ed82015-07-22 09:19:52 -070066 <!--
67 The version of protoc must match protobuf-java. If you don't depend on
68 protobuf-java directly, you will be transitively depending on the
69 protobuf-java version that grpc depends on.
70 -->
71 <protocArtifact>com.google.protobuf:protoc:3.0.0-alpha-2:exe:${os.detected.classifier}</protocArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070072 <pluginId>grpc-java</pluginId>
nmittlerd94fedc2015-06-12 07:32:50 -070073 <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.7.1:exe:${os.detected.classifier}</pluginArtifact>
Eric Anderson1eb16d92015-05-26 14:22:32 -070074 </configuration>
75 <executions>
76 <execution>
77 <goals>
78 <goal>compile</goal>
79 <goal>compile-custom</goal>
80 </goals>
81 </execution>
82 </executions>
83 </plugin>
84 </plugins>
85</build>
86```
87
88[maven-protoc-plugin]: http://sergei-ivanov.github.io/maven-protoc-plugin/
89
90For protobuf-based codegen integrated with the Gradle build system, you can use
91[protobuf-gradle-plugin][]:
92```gradle
Kun Zhang8bd8ed82015-07-22 09:19:52 -070093apply plugin: 'java'
Eric Anderson1eb16d92015-05-26 14:22:32 -070094apply plugin: 'com.google.protobuf'
95
96buildscript {
97 repositories {
98 mavenCentral()
99 }
100 dependencies {
Kun Zhang137b2ef2015-08-03 11:10:22 -0700101 classpath 'com.google.protobuf:protobuf-gradle-plugin:0.6.1'
Eric Anderson1eb16d92015-05-26 14:22:32 -0700102 }
103}
104
Kun Zhang8bd8ed82015-07-22 09:19:52 -0700105protobuf {
106 protoc {
107 // The version of protoc must match protobuf-java. If you don't depend on
108 // protobuf-java directly, you will be transitively depending on the
109 // protobuf-java version that grpc depends on.
110 artifact = "com.google.protobuf:protoc:3.0.0-alpha-2"
111 }
112 plugins {
113 grpc {
114 artifact = 'io.grpc:protoc-gen-grpc-java:0.7.1'
115 }
116 }
117 generateProtoTasks {
118 all()*.plugins {
119 grpc {}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700120 }
121 }
122}
Eric Anderson1eb16d92015-05-26 14:22:32 -0700123```
124
125[protobuf-gradle-plugin]: https://github.com/google/protobuf-gradle-plugin
126
Eric Andersonfb28ad22015-01-29 15:00:58 -0800127How to Build
128------------
Eric Anderson1eb16d92015-05-26 14:22:32 -0700129This section is only necessary if you are making changes to gRPC-Java.
Eric Andersonfb28ad22015-01-29 15:00:58 -0800130
Eric Anderson65291322015-05-15 11:57:05 -0700131Building requires JDK 8, as our tests use TLS.
132
Eric Anderson66c55ee2015-05-07 15:07:13 -0700133grpc-java has a C++ code generation plugin for protoc. Since many Java
134developers don't have C compilers installed and don't need to modify the
135codegen, the build can skip it. To skip, create the file
136`<project-root>/gradle.properties` and add `skipCodegen=true`.
137
138Then, to build, run:
139```
140$ ./gradlew build
141```
142
143To install the artifacts to your Maven local repository for use in your own
144project, run:
145```
146$ ./gradlew install
147```
148
149How to Build Code Generation Plugin
150-----------------------------------
151This section is only necessary if you are making changes to the code
152generation. Most users only need to use `skipCodegen=true` as discussed above.
153
Kun Zhangfd0aed22015-04-30 17:29:17 -0700154### Build Protobuf
Kun Zhangaf9fb6d2015-06-30 16:08:46 -0700155The codegen plugin is C++ code and requires protobuf 3.0.0-alpha-3.1.
Kun Zhang111f6dd2015-05-05 16:11:27 -0700156
Kun Zhangfd0aed22015-04-30 17:29:17 -0700157For Linux, Mac and MinGW:
Eric Andersonfb28ad22015-01-29 15:00:58 -0800158```
159$ git clone https://github.com/google/protobuf.git
160$ cd protobuf
Kun Zhangaf9fb6d2015-06-30 16:08:46 -0700161$ git checkout v3.0.0-alpha-3.1
Eric Andersonfb28ad22015-01-29 15:00:58 -0800162$ ./autogen.sh
163$ ./configure
164$ make
165$ make check
166$ sudo make install
Eric Andersonfb28ad22015-01-29 15:00:58 -0800167```
168
169If you are comfortable with C++ compilation and autotools, you can specify a
Kun Zhangfd0aed22015-04-30 17:29:17 -0700170``--prefix`` for Protobuf and use ``-I`` in ``CXXFLAGS``, ``-L`` in
171``LDFLAGS``, ``LD_LIBRARY_PATH``, and ``PATH`` to reference it. The
172environment variables will be used when building grpc-java.
Eric Andersonfb28ad22015-01-29 15:00:58 -0800173
Kun Zhangfd0aed22015-04-30 17:29:17 -0700174Protobuf installs to ``/usr/local`` by default.
175
176For Visual C++, please refer to the [Protobuf README](https://github.com/google/protobuf/blob/master/vsprojects/readme.txt)
177for how to compile Protobuf.
178
179#### Linux and MinGW
180If ``/usr/local/lib`` is not in your library search path, you can add it by running:
Louis Ryan65d64cd2015-02-18 14:51:42 -0800181```
182$ sudo sh -c 'echo /usr/local/lib >> /etc/ld.so.conf'
183$ sudo ldconfig
184```
185
Kun Zhangfd0aed22015-04-30 17:29:17 -0700186#### Mac
187Some versions of Mac OS X (e.g., 10.10) doesn't have ``/usr/local`` in the
Kun Zhang111f6dd2015-05-05 16:11:27 -0700188default search paths for header files and libraries. It will fail the build of
189the codegen. To work around this, you will need to set environment variables:
Kun Zhangfd0aed22015-04-30 17:29:17 -0700190```
191$ export CXXFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib"
192```
193
Kun Zhang221c5342015-04-29 18:16:15 -0700194### Notes for Visual C++
195
Eric Anderson456216b2015-03-02 16:58:27 -0800196When building on Windows and VC++, you need to specify project properties for
197Gradle to find protobuf:
198```
Kun Zhang221c5342015-04-29 18:16:15 -0700199.\gradlew install ^
Kun Zhangaf9fb6d2015-06-30 16:08:46 -0700200 -PvcProtobufInclude=C:\path\to\protobuf-3.0.0-alpha-3.1\src ^
201 -PvcProtobufLibs=C:\path\to\protobuf-3.0.0-alpha-3.1\vsprojects\Release
Eric Anderson456216b2015-03-02 16:58:27 -0800202```
203
204Since specifying those properties every build is bothersome, you can instead
Kun Zhang2f749712015-05-06 13:10:28 -0700205create ``<project-root>\gradle.properties`` with contents like:
Eric Anderson456216b2015-03-02 16:58:27 -0800206```
Kun Zhangaf9fb6d2015-06-30 16:08:46 -0700207vcProtobufInclude=C:\\path\\to\\protobuf-3.0.0-alpha-3.1\\src
208vcProtobufLibs=C:\\path\\to\\protobuf-3.0.0-alpha-3.1\\vsprojects\\Release
Eric Anderson456216b2015-03-02 16:58:27 -0800209```
210
Kun Zhang221c5342015-04-29 18:16:15 -0700211The build script will build the codegen for the same architecture as the Java
212runtime installed on your system. If you are using 64-bit JVM, the codegen will
213be compiled for 64-bit, that means you must have compiled Protobuf in 64-bit.
214
215### Notes for MinGW on Windows
216If you have both MinGW and VC++ installed on Windows, VC++ will be used by
Kun Zhang2f749712015-05-06 13:10:28 -0700217default. To override this default and use MinGW, add ``-PvcDisable=true``
218to your Gradle command line or add ``vcDisable=true`` to your
219``<project-root>\gradle.properties``.
Kun Zhang221c5342015-04-29 18:16:15 -0700220
mekka99907942015-08-07 23:28:06 -0700221### Notes for Unsupported Operating Systems
Kun Zhang9805e272015-05-12 17:03:19 -0700222The build script pulls pre-compiled ``protoc`` from Maven Central by default.
223We have built ``protoc`` binaries for popular systems, but they may not work
224for your system. If ``protoc`` cannot be downloaded or would not run, you can
225use the one that has been built by your own, by adding this property to
226``<project-root>/gradle.properties``:
227```
228protoc=/path/to/protoc
229```
230
Eric Andersonfb28ad22015-01-29 15:00:58 -0800231Navigating Around the Source
232----------------------------
233
mekka99907942015-08-07 23:28:06 -0700234Here's a quick readers' guide to the code to help folks get started. At a high
Kun Zhangfc85a402015-08-05 16:48:15 -0700235level there are three distinct layers to the library: __Stub__, __Channel__ &
236__Transport__.
ejonad4531da2014-12-15 10:24:42 -0800237
Eric Andersonfb28ad22015-01-29 15:00:58 -0800238### Stub
ejonad4531da2014-12-15 10:24:42 -0800239
Kun Zhangfc85a402015-08-05 16:48:15 -0700240The Stub layer is what is exposed to most developers and provides type-safe
241bindings to whatever datamodel/IDL/interface you are adapting. gRPC comes with
242a [plugin](https://github.com/google/grpc-java/blob/master/compiler) to the
243protocol-buffers compiler that generates Stub interfaces out of `.proto` files,
244but bindings to other datamodel/IDL should be trivial to add and are welcome.
ejonad4531da2014-12-15 10:24:42 -0800245
246#### Key Interfaces
247
nmittlerf8314582015-01-27 10:25:39 -0800248[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 -0800249
Eric Andersonfb28ad22015-01-29 15:00:58 -0800250### Channel
ejonad4531da2014-12-15 10:24:42 -0800251
Kun Zhangfc85a402015-08-05 16:48:15 -0700252The Channel layer is an abstraction over Transport handling that is suitable for
253interception/decoration and exposes more behavior to the application than the
254Stub layer. It is intended to be easy for application frameworks to use this
255layer to address cross-cutting concerns such as logging, monitoring, auth etc.
256Flow-control is also exposed at this layer to allow more sophisticated
257applications to interact with it directly.
ejonad4531da2014-12-15 10:24:42 -0800258
259#### Common
260
nmittlerf8314582015-01-27 10:25:39 -0800261* [Metadata - headers & trailers](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Metadata.java)
262* [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 -0800263
264#### Client
nmittlerf8314582015-01-27 10:25:39 -0800265* [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 -0700266* [Client Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientCall.java)
nmittlerf8314582015-01-27 10:25:39 -0800267* [Client Interceptor](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientInterceptor.java)
ejonad4531da2014-12-15 10:24:42 -0800268
269#### Server
nmittlerf8314582015-01-27 10:25:39 -0800270* [Server call handler - analog to Channel on server](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCallHandler.java)
271* [Server Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCall.java)
ejonad4531da2014-12-15 10:24:42 -0800272
273
Eric Andersonfb28ad22015-01-29 15:00:58 -0800274### Transport
ejonad4531da2014-12-15 10:24:42 -0800275
mekka99907942015-08-07 23:28:06 -0700276The Transport layer does the heavy lifting of putting and taking bytes off the
Kun Zhangfc85a402015-08-05 16:48:15 -0700277wire. The interfaces to it are abstract just enough to allow plugging in of
278different implementations. Transports are modeled as `Stream` factories. The
279variation in interface between a server Stream and a client Stream exists to
280codify their differing semantics for cancellation and error reporting.
281
282Note the transport layer API is considered internal to gRPC and has weaker API
283guarantees than the core API under package `io.grpc`.
284
mekka99907942015-08-07 23:28:06 -0700285gRPC comes with three Transport implementations:
Kun Zhangfc85a402015-08-05 16:48:15 -0700286
2871. The [Netty-based](https://github.com/google/grpc-java/blob/master/netty)
288 transport is the main transport implementation based on
289 [Netty](http://netty.io). It is for both the client and the server.
2902. The [OkHttp-based](https://github.com/google/grpc-java/blob/master/okhttp)
291 transport is a lightweight transport based on
292 [OkHttp](http://square.github.io/okhttp/). It is mainly for use on Android
mekka99907942015-08-07 23:28:06 -0700293 and is for client only.
Kun Zhangfc85a402015-08-05 16:48:15 -07002943. The
mekka99907942015-08-07 23:28:06 -0700295 [inProcess](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/inprocess)
Kun Zhangfc85a402015-08-05 16:48:15 -0700296 transport is for when a server is in the same process as the client. It is
297 useful for testing.
ejonad4531da2014-12-15 10:24:42 -0800298
299#### Common
300
nmittlerf8314582015-01-27 10:25:39 -0800301* [Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/Stream.java)
302* [Stream Listener](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/StreamListener.java)
ejonad4531da2014-12-15 10:24:42 -0800303
304#### Client
305
nmittlerf8314582015-01-27 10:25:39 -0800306* [Client Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/ClientStream.java)
307* [Client Stream Listener](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/ClientStreamListener.java)
ejonad4531da2014-12-15 10:24:42 -0800308
309#### Server
310
nmittlerf8314582015-01-27 10:25:39 -0800311* [Server Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/ServerStream.java)
312* [Server Stream Listener](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/ServerStreamListener.java)
ejonad4531da2014-12-15 10:24:42 -0800313
314
Eric Andersonfb28ad22015-01-29 15:00:58 -0800315### Examples
ejonad4531da2014-12-15 10:24:42 -0800316
Kun Zhangfc85a402015-08-05 16:48:15 -0700317Tests showing how these layers are composed to execute calls using protobuf
318messages can be found here
319https://github.com/google/grpc-java/tree/master/interop-testing/src/main/java/io/grpc/testing/integration