mirror of https://github.com/grpc/grpc.io.git
				
				
				
			Add a service config guide (#1261)
This commit is contained in:
		
							parent
							
								
									fb661d4de7
								
							
						
					
					
						commit
						59733711dc
					
				| 
						 | 
				
			
			@ -0,0 +1,129 @@
 | 
			
		|||
---
 | 
			
		||||
title: Service Config
 | 
			
		||||
description: >-
 | 
			
		||||
  How the service config can be used by service owners to control client
 | 
			
		||||
  behavior.
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### Overview
 | 
			
		||||
 | 
			
		||||
The service config specifies how gRPC clients should behave when interacting
 | 
			
		||||
with a gRPC server. Service owners can provide a service config with expected
 | 
			
		||||
behavior of all service clients. The settings in a service config always apply
 | 
			
		||||
to a specific target string (e.g. "api.myapp.com"), not globally.
 | 
			
		||||
 | 
			
		||||
### Behavior controlled by the Service Config
 | 
			
		||||
 | 
			
		||||
The settings in the service config affect client side load balancing, call
 | 
			
		||||
behavior and health checking.
 | 
			
		||||
 | 
			
		||||
This page outlines the options in the service config, but the full service
 | 
			
		||||
config data structure is documented with a [protobuf definition].
 | 
			
		||||
 | 
			
		||||
#### Load Balancing
 | 
			
		||||
 | 
			
		||||
A service can be composed of multiple servers and the load balancing
 | 
			
		||||
configuration specifies how calls from clients should be distributed among
 | 
			
		||||
those servers. By default the `pick_first` load balancing policy is utilized,
 | 
			
		||||
but another policy can be specified in the service config. E.g. specifying the
 | 
			
		||||
`round_robin` policy will make the clients rotate through the servers instead
 | 
			
		||||
of repeatedly using the first server.
 | 
			
		||||
 | 
			
		||||
#### Call Behavior
 | 
			
		||||
 | 
			
		||||
RPCs can be configured in many ways:
 | 
			
		||||
 | 
			
		||||
- With [wait-for-ready] enabled, if a client cannot connect to a backend, the
 | 
			
		||||
  RPC will be delayed instead of immediately failing.
 | 
			
		||||
- A call [timeout] can be provided, indicating the maximum time the client
 | 
			
		||||
  should wait before giving up on the RPC.
 | 
			
		||||
- One of:
 | 
			
		||||
  - [Retry] policy (max attempts, backoff settings, retryable status codes)
 | 
			
		||||
  - [Hedging] policy (max attempts, delay, non-fatal status codes)
 | 
			
		||||
 | 
			
		||||
{{% alert title="Note" color="info" %}}
 | 
			
		||||
These call behavior settings can be limited to an individual service or a
 | 
			
		||||
method.
 | 
			
		||||
 | 
			
		||||
Retry and hedging policies can be further adjusted by setting a *retry
 | 
			
		||||
throttling policy* but it will apply across all services and methods.
 | 
			
		||||
{{% /alert %}}
 | 
			
		||||
 | 
			
		||||
#### Health Checking
 | 
			
		||||
 | 
			
		||||
A client can be configured to perform [health checking] by providing a health
 | 
			
		||||
checking name. The client will then use the standard gRPC health checking
 | 
			
		||||
service.
 | 
			
		||||
 | 
			
		||||
### Acquiring a Service Config
 | 
			
		||||
 | 
			
		||||
A service config can be provided to a client either via name resolution or
 | 
			
		||||
programatically by the client application. 
 | 
			
		||||
 | 
			
		||||
#### Name Resolution
 | 
			
		||||
 | 
			
		||||
The gRPC [name resolution mechanism] allows for pluggable name resolver
 | 
			
		||||
implementations. These implementations return the addresses associated with a
 | 
			
		||||
name as well as an associated service config. This is the mechanism
 | 
			
		||||
that service owners can use to distribute their service config out to a fleet
 | 
			
		||||
of gRPC clients.
 | 
			
		||||
 | 
			
		||||
- The xDS name resolver converts the xDS configuration it receives from the
 | 
			
		||||
  control plane to a corresponding service config.
 | 
			
		||||
- The standard DNS name resolver in the Go implementation supports service
 | 
			
		||||
  configs [stored as TXT records] on the name server.
 | 
			
		||||
 | 
			
		||||
{{% alert title="Note" color="info" %}}
 | 
			
		||||
Even though the service config structure is documented with a protobuf
 | 
			
		||||
definition the internal representation in the client is JSON. Name resolver
 | 
			
		||||
implementations are free to store the service config information in any way they
 | 
			
		||||
prefer as long as they provide it in JSON format at name resolution time.
 | 
			
		||||
{{% /alert %}}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Programatically
 | 
			
		||||
 | 
			
		||||
The gRPC client API provides a way to specify a service config in JSON format.
 | 
			
		||||
This is used to provide a default service config that will be used in
 | 
			
		||||
situations where the name resolver does not provide a service config. It can
 | 
			
		||||
also be useful in some testing situations.
 | 
			
		||||
 | 
			
		||||
### Example Service Config
 | 
			
		||||
 | 
			
		||||
The below example does the following:
 | 
			
		||||
 | 
			
		||||
- Enables the `round_robin` load balancing policy.
 | 
			
		||||
- Sets a default call timeout of 1s that applies to all methods in all
 | 
			
		||||
  services.
 | 
			
		||||
- Overides that timeout to be 2s for the `bar` method in the `foo` service as
 | 
			
		||||
  well as all the methods in the `baz` service.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
  "loadBalancingConfig": [ { "round_robin": {} } ],
 | 
			
		||||
  "methodConfig": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": [{}],
 | 
			
		||||
      "timeout": "1s"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": [
 | 
			
		||||
        { "service": "foo", "method": "bar" },
 | 
			
		||||
        { "service": "baz" }
 | 
			
		||||
      ],
 | 
			
		||||
      "timeout": "2s"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[protobuf definition]:https://github.com/grpc/grpc-proto/blob/master/grpc/service_config/service_config.proto
 | 
			
		||||
[timeout]:https://grpc.io/docs/guides/deadlines/
 | 
			
		||||
[Retry]:https://grpc.io/docs/guides/retry/
 | 
			
		||||
[health checking]:https://grpc.io/docs/guides/health-checking/
 | 
			
		||||
[Hedging]:https://grpc.io/docs/guides/request-hedging/
 | 
			
		||||
[wait-for-ready]:https://grpc.io/docs/guides/wait-for-ready/
 | 
			
		||||
[name resolution mechanism]:https://github.com/grpc/grpc/blob/master/doc/naming.md
 | 
			
		||||
[stored as TXT records]:https://github.com/grpc/proposal/blob/master/A2-service-configs-in-dns.md
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue