blob: 698ccae7aed4ec8e54ef08d8cce197a27b83f26b [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
Kun Zhang9805e272015-05-12 17:03:19 -0700221### Notes for unsupported operating systems
222The 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
ejonad4531da2014-12-15 10:24:42 -0800234Heres a quick readers guide to the code to help folks get started. At a high level there are three distinct layers
Kun Zhanga8ef36a2015-04-22 14:46:07 -0700235to the library: stub, channel & transport.
ejonad4531da2014-12-15 10:24:42 -0800236
Eric Andersonfb28ad22015-01-29 15:00:58 -0800237### Stub
ejonad4531da2014-12-15 10:24:42 -0800238
239The 'stub' layer is what is exposed to most developers and provides type-safe bindings to whatever
240datamodel/IDL/interface you are adapting. An example is provided of a binding to code generated by the protocol-buffers compiler but others should be trivial to add and are welcome.
241
242#### Key Interfaces
243
nmittlerf8314582015-01-27 10:25:39 -0800244[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 -0800245
246
Eric Andersonfb28ad22015-01-29 15:00:58 -0800247### Channel
ejonad4531da2014-12-15 10:24:42 -0800248
249The 'channel' layer is an abstraction over transport handling that is suitable for interception/decoration and exposes more behavior to the application than the stub layer. It is intended to be easy for application frameworks to use this layer to address cross-cutting concerns such as logging, monitoring, auth etc. Flow-control is also exposed at this layer to allow more sophisticated applications to interact with it directly.
250
251#### Common
252
nmittlerf8314582015-01-27 10:25:39 -0800253* [Metadata - headers & trailers](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/Metadata.java)
254* [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 -0800255
256#### Client
nmittlerf8314582015-01-27 10:25:39 -0800257* [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 -0700258* [Client Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientCall.java)
nmittlerf8314582015-01-27 10:25:39 -0800259* [Client Interceptor](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ClientInterceptor.java)
ejonad4531da2014-12-15 10:24:42 -0800260
261#### Server
nmittlerf8314582015-01-27 10:25:39 -0800262* [Server call handler - analog to Channel on server](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCallHandler.java)
263* [Server Call](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/ServerCall.java)
ejonad4531da2014-12-15 10:24:42 -0800264
265
Eric Andersonfb28ad22015-01-29 15:00:58 -0800266### Transport
ejonad4531da2014-12-15 10:24:42 -0800267
268The 'transport' layer does the heavy lifting of putting & taking bytes off the wire. The interfaces to it are abstract just enough to allow plugging in of different implementations. Transports are modeled as 'Stream' factories. The variation in interface between a server stream and a client stream exists to codify their differing semantics for cancellation and error reporting.
269
270#### Common
271
nmittlerf8314582015-01-27 10:25:39 -0800272* [Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/Stream.java)
273* [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 -0800274
275#### Client
276
nmittlerf8314582015-01-27 10:25:39 -0800277* [Client Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/ClientStream.java)
278* [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 -0800279
280#### Server
281
nmittlerf8314582015-01-27 10:25:39 -0800282* [Server Stream](https://github.com/google/grpc-java/blob/master/core/src/main/java/io/grpc/transport/ServerStream.java)
283* [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 -0800284
285
Eric Andersonfb28ad22015-01-29 15:00:58 -0800286### Examples
ejonad4531da2014-12-15 10:24:42 -0800287
Eric Andersone03d5c02015-05-20 13:23:11 -0700288Tests showing how these layers are composed to execute calls using protobuf messages can be found here https://github.com/google/grpc-java/tree/master/interop-testing/src/main/java/io/grpc/testing/integration