Skip to content
Choose a tag to compare


@voidzcy voidzcy released this
· 1210 commits to master since this release
Choose a tag to compare

Note: gRPC-Java no longer exposes many transitive dependencies as "compile" dependencies, but instead specifies them as "runtime" dependencies. Consuming projects using these dependencies directly will need to explicitly add the dependencies to their compile-time classpath.

Behavioral Changes

  • netty: Bandwidth delay product (BDP) is enabled by default (#6979). BDP dynamically adjusts flow control window to optimize the network bandwidth utilization. To disable this feature, build channel/server with NettyChannelBuilder#flowControlWindow or NettyServerBuilder#flowControlWindow. Existing flowControlWindow users need to use initialFlowWindowSize to enable BDP. The default initial window size has remained unchanged, so most users should not see a performance difference. In the future we plan to reduce the default size, which may briefly (up to 4 RTT) slow down new connections as they determine an appropriate BDP.

New Features

  • This release adds an xDS URI scheme called xds. This is the stable version of the scheme xds-experimental that was introduced in v1.28.0. xds-experimental scheme will be removed in subsequent releases so you must switch to xds scheme instead. xds scheme is a client side implementation of xDSv2 APIs. This allows a gRPC client written in Java to receive configuration from an xDSv2 API compatible server and use that configuration to load balance RPCs. In this release, only the virtual host matching, default path (“” or “/”) matching and cluster route action are supported. The features supported in a given release are documented here.
  • core: ManagedChannel provides LoadBalancer#Helper with implemented createResolvingOobChannel (#6923).
  • stub: Add ClientCallStreamObserver.disableAutoRequestWithInitial(int) and ServerCallStreamObserver.disableAutoRequest() that disables all automatic inbound flow-control requests. These methods are intended to replace the existing CallStreamObserver.disableAutoInboundFlowControl(). There may still be some tweaks to the API, so disableAutoInboundFlowControl() is not yet deprecated.
  • inprocess: Add InprocessChannelBuilder.propagateCauseWithStatus(true) to propagate exceptions from the server within status.getCause() (#6968). This is intended for unit tests to ease debugging test failures.
  • netty: support setting options of boss in NettyServer (#6947). Adds a new API on NettyServerBuilder to allow passing channel options for the boss ELG.

Bug Fixes

  • okhttp: use new APIs to configure TLS in Android (roll forward of #6959) (#6960). Starting from Android 10, there is a new set of public APIs for configuring TLS, where we were previously invoking hidden methods in SSLSocket. Some of those hidden methods are no longer allowed (will be removed in the future) in Android 11. We migrate to use public APIs whenever possible.
  • netty: Using classloader to isolate grpc without isolating netty can cause exceptions when creating netty channel/server is fixed (#7048).
  • api, core, services: make ProtoReflectionService interceptor compatible (#6967). Previously intercepting the ProtoReflectionService breaks the internal hack of passing the server instance to the service. Now we change the way of how it obtains the server instance so that applying interceptors to it doesn’t break its functionality. This change also allows multiple servers to use a shared ProtoReflectionService instance.
  • netty: Reduce race window size between GOAWAY and new streams. This should greatly reduce the number of calls that fail with errors similar to “UNAVAILABLE: HTTP/2 error code: NO_ERROR Received Goaway.” Although note that these errors have multiple sources, and it only addresses one of them
  • core: Delay transport shutdown when changing a subchannel’s addresses. This should prevent users from seeing errors saying “UNAVAILABLE: InternalSubchannel closed transport due to address change,” which should have already been rare


  • For Java 9+ users, we now recommend using org.apache.tomcat:annotations-api for the @Generated annotation instead of javax.annotation:javax.annotation-api, as it has a more appropriate license
  • add instruction for disabling Conscrypt's default TrustManager (#6962). By default, Conscrypt delegates hostname verification to the platform's default HostNameVerifier, which in OpenJDK is a deny-all implementation. You can configure the Conscrypt provider to not use its TrustManager.


  • Starting from this version, some transitive dependencies of gRPC artifacts are changed from compile scope to runtime scope. Users may experience their application can not rebuild once the gRPC version is upgraded, because some other component of the project may require a dependency that is no longer transitively provided by gRPC artifacts at compile time; and if that happens, users should explicitly add that dependency for the other component. This change does not affect running the application at runtime.
  • Bumped protobuf to 3.12.0


  • Deleted example-kotlin (#6936). grpc-kotlin was officially released and examples can be found in its own repository.