mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.1 KiB
117 lines
4.1 KiB
Service Config in gRPC |
|
====================== |
|
|
|
# Objective |
|
|
|
The service config is a mechanism that allows service owners to publish |
|
parameters to be automatically used by all clients of their service. |
|
|
|
# Format |
|
|
|
The fields of the service config are defined by the |
|
[`grpc.service_config.ServiceConfig` protocol buffer |
|
message](https://github.com/grpc/grpc-proto/blob/master/grpc/service_config/service_config.proto). |
|
Note that new fields may be added in the future as new functionality is |
|
introduced. |
|
|
|
Internally, gRPC uses the service config in JSON form. The JSON |
|
representation is the result of converting the protobuf form into JSON |
|
using the normal [protobuf to JSON translation |
|
rules](https://developers.google.com/protocol-buffers/docs/proto3#json). |
|
In particular, this means: |
|
- Field names are converted from `snake_case` to `camelCase`. |
|
- Field values are converted as per the documented translation rules: |
|
- Strings, 32-bit integers, and bools are converted into the |
|
corresponding JSON types. |
|
- 64-bit integers are converted into strings (e.g., `"251"`). |
|
- The value of a repeated field will be represented as a JSON array. |
|
- The value of a `google.protobuf.Duration` will be represented as a |
|
string containing a decimal number of seconds (e.g., `"1.000340012s"`). |
|
|
|
For more details, see the protobuf docs linked above. |
|
|
|
Note that the JSON representation has one advantage over the protobuf |
|
representation, which is that it is possible to encode configurations |
|
for [LB policies](load-balancing.md) that are not known to gRPC. In |
|
protobuf form, the `loadBalancingConfig` field contains a `oneof` |
|
supporting only the built-in LB policies. However, in JSON form, the |
|
field inside the `oneof` is encoded as a string that indicates the LB |
|
policy name. In JSON form, that string can be any arbitrary value, not |
|
just one of the supported policies inside of the `oneof`, so third-party |
|
policies can be selected. |
|
|
|
# Architecture |
|
|
|
A service config is associated with a server name. The [name |
|
resolver](naming.md) plugin, when asked to resolve a particular server |
|
name, will return both the resolved addresses and the service config. |
|
|
|
The name resolver returns the service config to the gRPC client in JSON form. |
|
Individual resolver implementations determine where and in what format the |
|
service config is stored. If the resolver implemention obtains the |
|
service config in protobuf form, it must convert it to JSON. |
|
Alternatively, a resolver implementation may obtain the service config |
|
already in JSON form, in which case it may return it directly. Or it |
|
may construct the JSON dynamically from some other source data. |
|
|
|
For details of how the DNS resolver plugin supports service configs, see |
|
[gRFC A2: Service Config via |
|
DNS](https://github.com/grpc/proposal/blob/master/A2-service-configs-in-dns.md). |
|
|
|
# Example |
|
|
|
Here is an example service config in protobuf form: |
|
|
|
```textproto |
|
{ |
|
# Use round_robin LB policy. |
|
load_balancing_config: { round_robin: {} } |
|
# This method config applies to method "foo/bar" and to all methods |
|
# of service "baz". |
|
method_config: { |
|
name: { |
|
service: "foo" |
|
method: "bar" |
|
} |
|
name: { |
|
service: "baz" |
|
} |
|
# Default timeout for matching methods. |
|
timeout: { |
|
seconds: 1 |
|
nanos: 1 |
|
} |
|
} |
|
} |
|
``` |
|
|
|
Here is the same example service config in JSON form: |
|
|
|
```json |
|
{ |
|
"loadBalancingConfig": [ { "round_robin": {} } ], |
|
"methodConfig": [ |
|
{ |
|
"name": [ |
|
{ "service": "foo", "method": "bar" }, |
|
{ "service": "baz" } |
|
], |
|
"timeout": "1.000000001s" |
|
} |
|
] |
|
} |
|
``` |
|
|
|
# APIs |
|
|
|
The service config is used in the following APIs: |
|
|
|
- In the resolver API, used by resolver plugins to return the service |
|
config to the gRPC client. |
|
- In the gRPC client API, where users can query the channel to obtain |
|
the service config associated with the channel (for debugging |
|
purposes). |
|
- In the gRPC client API, where users can set the service config |
|
explicitly. This can be used to set the config in unit tests. It can |
|
also be used to set the default config that will be used if the |
|
resolver plugin does not return a service config.
|
|
|