The Go language implementation of gRPC. HTTP/2 based RPC https://grpc.io
Find a file
Easwar Swaminathan 12e91ddb6d
xds: add support for HTTP filter state retention, as specified in A83 (#8924)
#### How the API looked before this change?
- We had a single interface, `Filter`, that was responsible for
functionality like config parsing and optionally for building client and
server interceptors (or filter instances).
- We had a registry of `Filter`s keyed by the supported type_urls.

#### How the API looks after this change?
- We will have an interface, `Builder`, that contains functionality for
config parsing and other things like "what are the supported
type_urls?", "Are filters produced by this builder supposed to be
terminal?",
- Two optional interfaces that the `Builder` can implement that provide
the functionality to create filter instances for the client and server,
`ClientFilterBuilder` and `ServerFilterBuilder` respectively.
- The `ClientFilterBuilder` and `ServerFilterBuilder` create
`ClientFilter` and `ServerFilter` respectively.
- The `ClientFilter` and `ServerFilter` interface contains functionality
to build client and server interceptors.
- The methods to create filter instances and interceptors will return
cleanup functions that callers need to invoke when the
filter/interceptor is no longer required.
- We will have a registry of `Builders`s keyed by the supported
type_urls.

#### Why is this change required?
- As part of gRFC A83 and moving forward on a bunch of other gRFCs, we
will start having HTTP filters that need to maintain a bunch of state,
and this state needs to be retained across resource updates. For
example, the filter might contain a gRPC channel to an external service,
and we don't want to recreate this channel for resource updates that
doesn't change any properties associated with the service that is being
connected to.

#### How will this be used?
- The xDS name resolver and the xDS enabled grpc server (entities that
create HTTP filters on the client and server side) will create new
`Filter` instances only when the filter names in the xDS resources
change. Otherwise, they will only create new interceptors using the
updated filter configuration from the existing `Filter`. This will allow
`Filter` instances to share state across interceptors and across state
updates.

The changes here and inspired by similar changes made for Java and
described here:
https://github.com/grpc/proposal/blob/master/A83-xds-gcp-authn-filter.md#java

RELEASE NOTES: None
2026-03-18 00:46:45 -07:00
.gemini github: Add config for Gemini code assist (#8873) 2026-02-02 23:47:21 +05:30
.github github: set testing CI names to be stable (#8982) 2026-03-17 16:26:53 -07:00
admin cleanup: replace dial with newclient (#7970) 2025-02-28 13:53:16 +05:30
attributes attributes: Replace internal map with linked list (#8933) 2026-02-27 11:35:41 +05:30
authz deps: update dependencies for all modules and fix revive findings (#8372) 2025-06-03 08:59:34 +05:30
backoff *: fix minor typos (#7487) 2024-08-14 22:43:01 +05:30
balancer grpclb: replace net.IP with netip.Addr (#8918) 2026-03-17 14:30:13 +05:30
benchmark grpc: Enable shared write buffers by default (#8957) 2026-03-09 10:55:03 +05:30
binarylog deps: update dependencies for all modules (#8853) 2026-01-21 18:12:04 +05:30
channelz cmd/protoc-gen-go-grpc: bump -version to 1.6.1 for release (#8879) 2026-02-04 15:34:59 +05:30
cmd/protoc-gen-go-grpc deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
codes codes: replace %q to %d in error string when invalid code is an integer (#7188) 2024-05-09 09:11:37 -07:00
connectivity xds: de-experimentalize xDS apis required for psm security (#4753) 2021-09-15 14:05:59 -07:00
credentials xds: leaf clusters provide the handshake info instead of top level cluster (#8956) 2026-03-11 09:20:30 +05:30
Documentation documentation: improve proxy documentation (#8840) 2026-01-29 10:59:35 +05:30
encoding encoding: remove unused DecompressedSize API (#8830) 2026-01-17 14:26:34 +05:30
examples deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
experimental mem: Allow overriding the default buffer pool. (#8806) 2026-01-20 11:39:25 -08:00
gcp/observability deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
grpclog Change logger to avoid Printf when disabled (#7471) 2024-11-27 00:07:38 +05:30
health cmd/protoc-gen-go-grpc: bump -version to 1.6.1 for release (#8879) 2026-02-04 15:34:59 +05:30
internal xds: add support for HTTP filter state retention, as specified in A83 (#8924) 2026-03-18 00:46:45 -07:00
interop deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
keepalive doc: update keepalive ClientParameters doc about doubling the interval upon GOAWAY (#7469) 2024-08-20 10:10:37 -07:00
mem mem: Move buffer pool implementations to internal (#8910) 2026-02-20 14:19:58 +05:30
metadata *: fix minor typos (#7487) 2024-08-14 22:43:01 +05:30
orca orca: fix goroutine leak in fakeORCAService.StreamCoreMetrics (#8911) 2026-02-23 10:56:33 +05:30
peer scripts: add linter rule for using context.WithTimeout on tests (#7342) 2024-07-03 19:22:54 -04:00
profiling cmd/protoc-gen-go-grpc: bump -version to 1.6.1 for release (#8879) 2026-02-04 15:34:59 +05:30
reflection cmd/protoc-gen-go-grpc: bump -version to 1.6.1 for release (#8879) 2026-02-04 15:34:59 +05:30
resolver resolver: Add resolver.EndpointMap.All() to iterate over keys and values (#8867) 2026-02-10 23:11:52 -08:00
scripts deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
security/advancedtls deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
serviceconfig testing: update Go to 1.19 (#5717) 2022-10-17 15:04:34 -07:00
stats deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
status grpc: introduce ErrRetriesExhausted to wrap retry failures (#8894) 2026-03-16 13:39:40 +05:30
tap transport: Pass Header metadata to tap handle. (#6652) 2023-10-05 14:08:13 -04:00
test xds: add support for HTTP filter state retention, as specified in A83 (#8924) 2026-03-18 00:46:45 -07:00
testdata xds: regenrate expired SPIFFE certs (#8963) 2026-03-09 11:16:24 +05:30
xds xds: refactor server-side HTTP filter processing (#8878) 2026-02-11 11:51:51 -08:00
AUTHORS add AUTHORS and LICENSE 2017-06-08 14:37:28 +02:00
backoff.go testing: update Go to 1.19 (#5717) 2022-10-17 15:04:34 -07:00
balancer_wrapper.go xds: Revert workaround to get SubConn locality (#8802) 2026-01-07 11:54:53 +05:30
balancer_wrapper_test.go cleanup: replace dial with newclient (#7967) 2025-02-27 16:03:14 -08:00
call.go idle: decrement active call count for streaming RPCs only when the call completes (#6610) 2023-09-11 08:39:06 -07:00
clientconn.go transport: Remove unused return value from connect() (#8787) 2026-01-08 12:08:11 +05:30
clientconn_authority_test.go cleanup: replace dial with newclient (#8602) 2025-10-21 10:46:23 +05:30
clientconn_parsed_target_test.go client: Change connectivity state to CONNECTING when creating the name resolver (#8710) 2025-12-08 16:02:52 -08:00
clientconn_test.go client: move tests that rely on Dial to a separate file (#8707) 2025-11-13 23:38:16 -08:00
CODE-OF-CONDUCT.md Update governance, contributing, code of conduct docs (#3033) 2019-09-23 11:24:27 -07:00
codec.go cleanup: use SliceBuffer directly where no pool is available (#7827) 2024-11-18 15:47:51 -08:00
codec_test.go encoding: delete v1 proto codec and use one map for registry (#7557) 2024-08-23 16:26:07 -07:00
CONTRIBUTING.md CONTRIBUTING.md: minor text tweaks for linters (#8533) 2025-08-22 08:49:27 -07:00
default_dial_option_server_option_test.go cleanup: replace dial with newclient (#8602) 2025-10-21 10:46:23 +05:30
dial_test.go client: Change connectivity state to CONNECTING when creating the name resolver (#8710) 2025-12-08 16:02:52 -08:00
dialoptions.go grpc: Enable shared write buffers by default (#8957) 2026-03-09 10:55:03 +05:30
doc.go scripts: improve regenerate.sh to use the correct proto compiler version (#7064) 2024-06-10 10:56:01 -07:00
go.mod deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
go.sum deps: update dependencies for all modules (#8969) 2026-03-10 09:59:15 -07:00
GOVERNANCE.md Update governance, contributing, code of conduct docs (#3033) 2019-09-23 11:24:27 -07:00
grpc_test.go Modified tests to use tlogger. (#3343) 2020-02-06 13:03:20 -08:00
interceptor.go grpc: improve the docstring for StreamServerInterceptor (#8823) 2026-01-13 11:38:42 -08:00
LICENSE Make Apache 2.0 LICENSE file a verbatim copy (#1329) 2017-06-21 10:20:47 -07:00
MAINTAINERS.md Move erm-g to Emeritus Maintainer (#8418) 2025-07-11 15:11:52 -07:00
Makefile Makefile: perfect PHONY (#7076) 2024-04-09 08:15:10 -07:00
NOTICE.txt Create NOTICE.txt (#4739) 2021-09-14 07:15:02 -07:00
picker_wrapper.go client/picker: log loop to V(2) (#8863) 2026-01-29 17:25:31 +05:30
picker_wrapper_test.go stats: add DelayedPickComplete and follow correct semantics (#8465) 2025-07-21 11:35:33 -07:00
preloader.go transport: Reduce heap allocations (#8668) 2025-10-30 11:13:39 +05:30
producer_ext_test.go deps: update dependencies for all modules and fix revive findings (#8372) 2025-06-03 08:59:34 +05:30
README.md Update CONTRIBUTING.md (#8300) 2025-05-09 09:57:52 -07:00
resolver_balancer_ext_test.go client: Change connectivity state to CONNECTING when creating the name resolver (#8710) 2025-12-08 16:02:52 -08:00
resolver_test.go client: move tests that rely on Dial to a separate file (#8707) 2025-11-13 23:38:16 -08:00
resolver_wrapper.go client: Change connectivity state to CONNECTING when creating the name resolver (#8710) 2025-12-08 16:02:52 -08:00
rpc_util.go mem: ensure Reader buffers are reused on early return (#8886) 2026-02-09 18:17:15 +05:30
rpc_util_test.go client: allow overriding grpc-accept-encoding header (#8718) 2025-12-11 11:13:35 +05:30
SECURITY.md *: fix minor typos (#7487) 2024-08-14 22:43:01 +05:30
server.go grpc: enforce strict path checking for incoming requests on the server (#8985) 2026-03-17 23:35:32 +00:00
server_ext_test.go deps: update dependencies for all modules and fix revive findings (#8372) 2025-06-03 08:59:34 +05:30
server_test.go transport: refactor to split ClientStream from ServerStream from common Stream functionality (#7802) 2024-11-04 13:42:38 -08:00
service_config.go serviceconfig: Return errors instead of skipping invalid retry policy config (#7905) 2024-12-05 15:16:45 -08:00
service_config_test.go serviceconfig: Return errors instead of skipping invalid retry policy config (#7905) 2024-12-05 15:16:45 -08:00
stream.go grpc: introduce ErrRetriesExhausted to wrap retry failures (#8894) 2026-03-16 13:39:40 +05:30
stream_interfaces.go grpc: add docs for generic stream interfaces (#7470) 2024-08-29 11:02:05 +05:30
stream_test.go test: use testpb alias in stream_test.go for proto messages. (#8854) 2026-01-22 11:47:00 +05:30
trace.go grpc: add ability to compile with or without tracing (#6954) 2024-02-02 13:49:23 -08:00
trace_notrace.go grpc: add ability to compile with or without tracing (#6954) 2024-02-02 13:49:23 -08:00
trace_test.go trace: fix getting family for the method (#3216) 2019-12-19 13:23:11 -08:00
trace_withtrace.go grpc: add ability to compile with or without tracing (#6954) 2024-02-02 13:49:23 -08:00
version.go Change version to 1.81.0-dev (#8950) 2026-03-06 13:21:08 +05:30

gRPC-Go

GoDoc GoReportCard codecov

The Go implementation of gRPC: A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the Go gRPC docs, or jump directly into the quick start.

Prerequisites

Installation

Simply add the following import to your code, and then go [build|run|test] will automatically fetch the necessary dependencies:

import "google.golang.org/grpc"

Note: If you are trying to access grpc-go from China, see the FAQ below.

Learn more

FAQ

I/O Timeout Errors

The golang.org domain may be blocked from some countries. go get usually produces an error like the following when this happens:

$ go get -u google.golang.org/grpc
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

To build Go code, there are several options:

  • Set up a VPN and access google.golang.org through that.

  • With Go module support: it is possible to use the replace feature of go mod to create aliases for golang.org packages. In your project's directory:

    go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
    go mod tidy
    go mod vendor
    go build -mod=vendor
    

    Again, this will need to be done for all transitive dependencies hosted on golang.org as well. For details, refer to golang/go issue #28652.

Compiling error, undefined: grpc.SupportPackageIsVersion

Please update to the latest version of gRPC-Go using go get google.golang.org/grpc.

How to turn on logging

The default logger is controlled by environment variables. Turn everything on like this:

$ export GRPC_GO_LOG_VERBOSITY_LEVEL=99
$ export GRPC_GO_LOG_SEVERITY_LEVEL=info

The RPC failed with error "code = Unavailable desc = transport is closing"

This error means the connection the RPC is using was closed, and there are many possible reasons, including:

  1. mis-configured transport credentials, connection failed on handshaking
  2. bytes disrupted, possibly by a proxy in between
  3. server shutdown
  4. Keepalive parameters caused connection shutdown, for example if you have configured your server to terminate connections regularly to trigger DNS lookups. If this is the case, you may want to increase your MaxConnectionAgeGrace, to allow longer RPC calls to finish.

It can be tricky to debug this because the error happens on the client side but the root cause of the connection being closed is on the server side. Turn on logging on both client and server, and see if there are any transport errors.