# 9.5 应用配置解析

配置是微服务治理里最重要的环节之一。但现在的行业内,大部分都只做到配置的下发,而没有梳理配置的关系,依赖配置的探活。 因此本文主要介绍以上的配置治理。

# 9.5.1 用户配置玩法多样性

因为用户的配置的格式是多种多样,我们需要用户自己设置的配置模板,来解析对应的配置。以下举一个例子 例如一个用户的MySQL配置可能存在如下三种配置方式。

[mysqlconfig]
    addr = "ip:port"
    user = "hello"
    password = "world"
1
2
3
4
[mysqlconfig]
    ip = "ip"
    port = "port"
    user = "hello"
    password = "world"
1
2
3
4
5
[mysqlconfig]
    dsn = "user:password@ip:port"
1
2

在我们不清楚用户配置的字段情况下,我们是无法将这些配置解析出来。所以我们必须设计一种方式,能够让我们的Juno agent能够准确理解用户的这些配置。

# 9.5.2 配置模板

为了适应用户不同配置方式,所以我们首先需要引入模板的概念。 我们要将用户不同的配置方式,配置成一个解析模板,将这种模板存入到数据库中,将其标记为一种类型,我们把这种类型称之为JunoTpl,那么我们可以把上面的三种mysql配置方式,可以将配置设置为JunoTpl=1,JunoTpl=2,JunoTpl=3,这样我们就可以去类型去解析不同的配置方式。

# 9.5.3 配置基础结构

但这样只是解决了配置的方式,但是我们的Juno agent还是无法理解模板里的字段类型,这个字段是将起解析为ip,还是port,还是dsn,我们需要一个基础结构去识别。 在这里Juno agent规范了基本的几个基础结构,定义如下:

  • $SCHEME
  • $IP
  • $PORT
  • $DSN
  • $USERNAME
  • $PASSWORD

# 9.5.4 配置类型

Juno agent可以通过模板和基础结构,很好的解析出配置。但是他仍然不知道这个配置类型,因为配置解析出来,他可以是MySQL,也可能是Redis,我们还需要识别配置的类型。这样的好处,是为了根据不同类型,去做该类型的探活,这样效果更准确。(例如MySQL,如果只做接口探活,那么有可能你可以访问端口,但你该机器其实是没有访问权限。而Juno agent用MySQL客户端方式访问,就可以提前知道你的应用[agent和你的应用同机部署]部署的机器是否有该MySQL权限)。

目前Juno agent支持以下类型

  • $MYSQL
  • $REDIS
  • $GRPC

后续会支持更多类型

# 9.5.5 配置结构

根据上述的介绍,我们的Juno agent可以将之前多样性的而用户配置完全解析。

# 9.5.5.1 第一种配置

我们在用户端的配置的表现形式将是

[mysqlconfig]
    addr = "ip:port"
    user = "hello"
    password = "world"
    JunoTpl = 1
1
2
3
4
5

我们在后台配置JunoTpl为1的模板内容以下所示,该数据存储在ETCD中。 keyname为/Juno-agent/configtpl/1 value如下所示

addr = $IP:$PORT
user = $USERNAME
password = $PASSWORD
JunoType = $MYSQL
1
2
3
4

# 9.5.5.2 第二种配置

我们在用户端的配置的表现形式将是

[mysqlconfig]
    ip = "ip"
    port = "port"
    user = "hello"
    password = "world"
    JunoTpl = 2
1
2
3
4
5
6

我们在后台配置JunoTpl为1的模板内容以下所示,该数据存储在ETCD中。 keyname为/Juno-agent/configtpl/2 value如下所示

ip = $IP
port = $PORT
user = $USERNAME
password = $PASSWORD
JunoType =  $MYSQL
1
2
3
4
5

# 9.5.5.3 第三种配置

我们在用户端的配置的表现形式将是

[mysqlconfig]
    dsn = "user:password@ip:port"
    JunoTpl = 3
1
2
3

我们在后台配置JunoTpl为1的模板内容以下所示,该数据存储在ETCD中。 keyname为/Juno-agent/configtpl/3 value如下所示

dsn = $DSN
JunoType = $MYSQL
1
2