yang-g c5d3f43713 make random uint32 %!s(int64=10) %!d(string=hai) anos
..
lb_policies 03dc655d2e Fix state tracking, refcounting bugs %!s(int64=10) %!d(string=hai) anos
resolvers 81bcc4caba Make endpoint peer API work on Windows %!s(int64=10) %!d(string=hai) anos
README.md 698d00c60e Add ipv4:, ipv6: schemes %!s(int64=10) %!d(string=hai) anos
client_config.c d7b68e72f5 Simple request unsecure passes with new client_config code %!s(int64=10) %!d(string=hai) anos
client_config.h 3bc8ebd48e Implementation work for client_config %!s(int64=10) %!d(string=hai) anos
connector.c 4ab82d2c4d clang-format %!s(int64=10) %!d(string=hai) anos
connector.h 4ab82d2c4d clang-format %!s(int64=10) %!d(string=hai) anos
lb_policy.c 03dc655d2e Fix state tracking, refcounting bugs %!s(int64=10) %!d(string=hai) anos
lb_policy.h acd095006f Spam cleanup %!s(int64=10) %!d(string=hai) anos
resolver.c 079a11bb9b clang-format affected files %!s(int64=10) %!d(string=hai) anos
resolver.h 079a11bb9b clang-format affected files %!s(int64=10) %!d(string=hai) anos
resolver_factory.c eb3b12e417 Further client config work %!s(int64=10) %!d(string=hai) anos
resolver_factory.h 3bc8ebd48e Implementation work for client_config %!s(int64=10) %!d(string=hai) anos
resolver_registry.c 49924e0e62 Better handling of cancellation, uri parse errors, and disconnection %!s(int64=10) %!d(string=hai) anos
resolver_registry.h eb3b12e417 Further client config work %!s(int64=10) %!d(string=hai) anos
subchannel.c c5d3f43713 make random uint32 %!s(int64=10) %!d(string=hai) anos
subchannel.h 1b22b9db94 Add grpc_call_get_peer %!s(int64=10) %!d(string=hai) anos
subchannel_factory.c eb3b12e417 Further client config work %!s(int64=10) %!d(string=hai) anos
subchannel_factory.h f7afa1f1ba client_config: chttp2_fullstack_no_op_unsecure_test passes %!s(int64=10) %!d(string=hai) anos
uri_parser.c 275a02c317 Small fix %!s(int64=10) %!d(string=hai) anos
uri_parser.h 49924e0e62 Better handling of cancellation, uri parse errors, and disconnection %!s(int64=10) %!d(string=hai) anos

README.md

Client Configuration Support for GRPC

This library provides high level configuration machinery to construct client channels and load balance between them.

Each grpc_channel is created with a grpc_resolver. It is the resolver's duty to resolve a name into configuration data for the channel. Such configuration data might include:

  • a list of (ip, port) addresses to connect to
  • a load balancing policy to decide which server to send a request to
  • a set of filters to mutate outgoing requests (say, by adding metadata)

The resolver provides this data as a stream of grpc_client_config objects to the channel. We represent configuration as a stream so that it can be changed by the resolver during execution, by reacting to external events (such as a new configuration file being pushed to some store).

Load Balancing

Load balancing configuration is provided by a grpc_lb_policy object, stored as part of grpc_client_config.

The primary job of the load balancing policies is to pick a target server given only the initial metadata for a request. It does this by providing a grpc_subchannel object to the owning channel.

Sub-Channels

A sub-channel provides a connection to a server for a client channel. It has a connectivity state like a regular channel, and so can be connected or disconnected. This connectivity state can be used to inform load balancing decisions (for example, by avoiding disconnected backends).

Configured sub-channels are fully setup to participate in the grpc data plane. Their behavior is specified by a set of grpc channel filters defined at their construction. To customize this behavior, resolvers build grpc_subchannel_factory objects, which use the decorator pattern to customize construction arguments for concrete grpc_subchannel instances.

Naming for GRPC

Names in GRPC are represented by a URI (as defined in RFC 3986).

The following schemes are currently supported:

dns:///host:port - dns schemes are currently supported so long as authority is

               empty (authority based dns resolution is expected in a future
               release)

unix:path - the unix scheme is used to create and connect to unix domain

               sockets - the authority must be empty, and the path
               represents the absolute or relative path to the desired
               socket

ipv4:host:port - a pre-resolved ipv4 dotted decimal address/port combination

ipv6:[host]:port - a pre-resolved ipv6 address/port combination