# Dynamic Configuration Consul Implementation

[Consul](https://github.com/rickfast/consul-client) is also supported as Dynamic Configuration Center (DCC). To use it, please configure as follows:

```yaml
configuration:
  selector: ${SW_CONFIGURATION:consul}
  consul:
    # Consul host and ports, separated by comma, e.g. 1.2.3.4:8500,2.3.4.5:8500
    hostAndPorts: ${SW_CONFIG_CONSUL_HOST_AND_PORTS:1.2.3.4:8500}
    # Sync period in seconds. Defaults to 60 seconds.
    period: ${SW_CONFIG_CONSUL_PERIOD:1}
    # Consul aclToken
    aclToken: ${SW_CONFIG_CONSUL_ACL_TOKEN:""}
```

## Config Storage
### Single Config
Single configs in Consul are key/value pairs:

| Key | Value |
|-----|-----|
| configKey | configVaule |

e.g. The config is:
```
{agent-analyzer.default.slowDBAccessThreshold}:{default:200,mongodb:50}
```
The config in Consul is:

| Key | Value |
|-----|-----|
| agent-analyzer.default.slowDBAccessThreshold | default:200,mongodb:50 |
| ... | ... |


### Group Config
Group config in Consul are key/value pairs as well, but  according to the level keys organized by `/`, see: https://www.consul.io/docs/dynamic-app-config/kv#using-consul-kv

| Key | Value |
|-----|-----|
| configKey/subItemkey1 | subItemValue1 |
| configKey/subItemkey2 | subItemValue2 |
| ... | ... |

If use Consul UI we can see keys organized like folder:
```
configKey
    -- subItemkey1
    -- subItemkey2
...
```
e.g. The config is:
```
{core.default.endpoint-name-grouping-openapi}:|{customerAPI-v1}:{value of customerAPI-v1}
                                              |{productAPI-v1}:{value of productAPI-v1}
                                              |{productAPI-v2}:{value of productAPI-v2}
```
The config in Consul is:

| Key | Value |
|-----|-----|
| core.default.endpoint-name-grouping-openapi/customerAPI-v1 | value of customerAPI-v1 |
| core.default.endpoint-name-grouping-openapi/productAPI-v1 | value of productAPI-v1 |
| core.default.endpoint-name-grouping-openapi/productAPI-v2 | value of productAPI-v2 |
