# 1.14.俯瞰：配置地图

> 俯瞰江流青一带，坐看山色碧千寻。——蔡戡《陪宪使登榕溪阁》

* 项目地址：<https://github.com/silentbalanceyh/vertx-zero-example/>（子项目：**up-native**）
*

完整地图文件：[Version 1.1](https://github.com/silentbalanceyh/vertx-zero-example/blob/master/document/zero/graphic/zero-configuration.png)

    本文不讲解任何和Zero Extension相关的详细配置信息，那是另外一个故事，而本文中使用的配置地图部分以1.1版为主，可能和本系列教程中的内容不一致，主要是写本文时Zero Extension最新版还在开发中。

## 「壹」内部配置

    虽然Zero框架名字叫“零”，没有任何配置也是可启动的，但往往在真实项目中要真正零配置几乎是不太可能，只是设计时如何让配置的量减到最低，又或者说让配置本身变得简单而实用且易于扩展，让开发人员压力更小，这才是目的。

    Zero的基础配置规范如下：

1. 只有两种配置文件名，`.json`和`.yml`（yaml）格式。
2. 主配置从`src/main/resources`中的`vertx.yml`文件作入口。

    选择`yml`文件是因为我在设计和开发Zero之前一直使用的是Spring Boot，而Zero框架的很多设计思路也是基于它而来，正因为在实际项目开发中看到了**痛点、难点** ，所以一切从简，同时使得曾经用过Spring Boot的开发者可以很流畅过渡。

### 1.1. Zero配置结构

    Zero预定义了基础框架的部分结构，该结构存储在`vertx-co`项目中，且它的完整结构如下图：

![](/files/LC2KkxqLzl5KC7ih4WoH)

    Zero中的核心配置主要分两部分：

* **内部配置**：内部配置在您提供了相关配置后会被合并（`内部配置 = 默认配置 + 您的配置`）。
* **Lime配置**：Lime配置主要由用户提供，提供该配置后，Zero会去扫描所有关联的节点，最终生成唯一的一份`JsonObject`——全环境统一配置。

    从上述配置信息可知，除了内部配置以外，其他Lime相关配置的根节点不能出现重复（重复会覆盖），本章的任务就是带着您看看Zero中目前的Lime有些什么样的魑魅魍魉。

### 1.2. 异常配置

    异常配置包含两个文件：

| 文件名                | Lime方式 | 含义                         |
| ------------------ | ------ | -------------------------- |
| vertx-error.yml    | Lime配置 | 错误代码异常堆栈信息定义模板，以E打头。       |
| vertx-readible.yml | 独立文件   | 直接读取，和vertx-error.yml代码绑定。 |

    之前讲解容错部分已经解释过这两个文件的用法，此处就不详细解释它的基本结构了，您可以将这两个文件理解成两个**哈希表**，针对某一个错误代码`code`而言：

```yaml
# vertx-error.yml
# WebException定义时，该文件中的配置是必须的，如果没有则报错。
E<code>: "message, {0}, {1}, {2}"

# vertx-readible.yml
# 如果定义了该文件，那么就会在错误响应信息中追加一个业务描述节点`info`给前端使用。
<code>: "您的错误信息，xxxxx"
```

#### 配置地图

![](/files/PjG39SSG3Vb5VHcDvcXS)

### 1.3. 插件配置

    插件配置位于`vertx-inject.yml`文件中，默认插件配置只包含了日志记录器：

```yaml
logger: io.vertx.up.log.internal.Log4JAnnal
```

    除此，您还可以增加以下配置：

```yaml
# 「Zero框架内置」
# 启用Jooq数据库访问功能，启用后才可使用 Ux.Jooq
jooq: io.vertx.tp.plugin.jooq.JooqInfix
# Cache，缓存专用，内置缓存实现，SharedMap
shared: io.vertx.tp.plugin.shared.MapInfix
# Job，任务插件，启用后台任务系统
job: io.vertx.tp.plugin.job.JobInfix

# 「Zero标准化插件」
# zero-ifx-history专用配置，启用trash回收站功能，可保存删除历史
trash: io.vertx.tp.plugin.history.TrashInfix
# zero-ifx-excel专用配置，启用Excel的导入/导出功能
excel: io.vertx.tp.plugin.excel.ExcelInfix
# zero-ifx-es专用配置，启用ElasticSearch功能
elasticsearch: io.vertx.tp.plugin.elasticsearch.ElasticSearchInfix
# zero-ifx-neo4j专用配置，启用Neo4j，图引擎数据库专用
neo4j: io.vertx.tp.plugin.neo4j.Neo4jInfix

# 「Zero和Vert.x集成插件」
# zero-ifx-redis专用配置，启用Redis
redis: io.vertx.tp.plugin.redis.RedisInfix
# zero-ifx-native专用配置，启用SQLClient
mysql: io.vertx.up.plugin.jdbc.MySqlInfix
# zero-ifx-mongo专用配置，启用MongoClient
mongo: io.vertx.tp.plugin.mongo.MongoInfix

# 「Zero扩展模块插件」
# zero-jet 动态路由专用配置，启用非Annotation模式的动态路由发布功能
router: io.vertx.tp.jet.JetPollux
```

> 如果您编写了自定义的Infix，那么上述配置中只要不重名即可。

#### 配置地图

![](/files/6oQh3CSwI2YtGcORuqmX)

### 1.4. Resolver配置

    Resolver配置是Zero中的特殊配置，它的基础内容位于`vertx-resolver.yml`文件中，默认内容如：

```yaml
default: io.vertx.up.uca.rs.mime.resolver.DefaultResolver
application:
  json: io.vertx.up.uca.rs.mime.resolver.JsonResolver
  octet-stream: io.vertx.up.uca.rs.mime.resolver.BufferResolver
  x-www-form-urlencoded: io.vertx.up.uca.rs.mime.resolver.XFormResolver
multipart:
  form-data: io.vertx.up.uca.rs.mime.resolver.FormResolver
```

    上述配置在之前的文件中讲解过，按文件结构，它处理的MIME如下表格：

| MIME值                             | 处理类             | 含义           |
| --------------------------------- | --------------- | ------------ |
| （默认）                              | DefaultResolver | 处理不带MIME的请求。 |
| application/json                  | JsonResolver    | Json数据处理。    |
| application/octet-stream          | BufferResolver  | 二进制数据处理。     |
| application/x-www-form-urlencoded | XFormResolver   | 多媒体表单处理。     |
| multipart/form-data               | FormResolver    | 带上传功能请求处理。   |

#### 配置地图

![](/files/olYjlCV7vyQJBCrGUR2M)

### 1.5. 服务器配置

    服务器配置位于`vertx-server.yml`文件中，默认的配置如下：

```yaml
server:
# 当前服务节点名称，微服务模式下可标识节点服务器
- name: zero-ws
# 服务器类型
  type: http
# 服务器配置数据，类型不同则配置有所区别
  config:
    # 端口号
    port: 6083
    # 发布服务的Host地址，该值表示任意IP
    host: 0.0.0.0
```

    注意这里支持的服务器数量是多个，`server`节点是一个数组，而不是单个服务器，主要是为**微服务环境**量身打造的，而此处的`type`节点是读者必须要理解的节点

| type值 | 含义                           | Options           |
| ----- | ---------------------------- | ----------------- |
| http  | Http服务器，常用的RESTful容器。        | HttpServerOptions |
| api   | 微服务模式中的Api Gateway服务。        | HttpServerOptions |
| ipc   | 微服务模式中的Service服务，此时根据名称进行连接。 | HttpServerOptions |
| sock  | 「保留」WebSocket专用服务。           |                   |
| rx    | 「保留」Rx模式下的Http服务器（类名不同。      |                   |

> 「保留」为设计了此扩展但还未实现的部分，后续版本会逐渐扩展。

#### 地图配置

![](/files/Xt8Z2F8LZbjwykAMI66H)

### 1.6. 主配置

    主配置位于`vertx.yml`文件中，默认的配置内容如：

```yaml
zero:
  # 默认连接三个扩展文件
  #     vertx-error.yml
  #     vertx-inject.yml
  #     vertx-server.yml
  lime: error, inject, server
  vertx:
    # Vert.x集群服务配置
    clustered:
      # 启用 Vert.x 集群服务
      enabled: false
      # 配置 Vert.x 集群服务中的类名，为ClusterManager
      # 后期版本会使用 HA 配置代替
      manager:
      # 配置数据（根据不同的ClusterManager有所区别）
      options: 
   
    # Vert.x实例配置，为数组结构，如果是集群模式则可使用多个
    instance:
      # Vert.x实例名
    - name: vx-zero
      # Vert.x实例对应的Vert.x配置，VertxOptions类型的Json序列化结构
      options:
        # Fix block 2000 limit issue.
        maxEventLoopExecuteTime: 6000000000
```

    Zero中设计的完整Vert.x部分的配置结构图如下：

![](/files/yBZNeAxmDxsWUy4dIAkT)

    整个结构包含了两个维度处理RESTful的配置：

1. 您是使用Vert.x的集群模式还是单点模式（实战可知，单点模式已经够用了）。
2. 您是使用Zero中的单机模式还是微服务模式（微服务模式下需配置ipc和api两种服务器）。

    主配置的Vert.x实例的每个节点`options`对应的就是`VertxOptions`数据结构。

    本章节中所有的配置都包含了**固定的文件名**，这是Zero内置的固定配置，如果您想要拓展自己的配置只能走Lime，这也是本文第一章节称为**内部配置**的原因，汇总如下：

| 文件名                | Lime方式 | 含义                 |
| ------------------ | ------ | ------------------ |
| vertx.yml          | 独立文件   | 主配置文件，Vertx实例专用配置。 |
| vertx-inject.yml   | Lime配置 | 插件Infix专用配置文件。     |
| vertx-server.yml   | Lime配置 | HTTP服务器专用配置。       |
| vertx-resolver.yml | 独立文件   | MIME解析器（可扩展）。      |
| vertx-error.yml    | Lime配置 | 异常代码表。             |
| vertx-readible.yml | 独立文件   | 业务异常信息配置。          |

#### 配置地图

![](/files/cpCrkbYFgYpOb8TCtTcc)

## 「贰」Lime配置

> lime的翻译为石灰，石灰遇水就会爆发出能量，在系统中它表示所有的插件遇到了Zero后就可发挥出它的最大能量，对所有lime配置而言，Zero就是：生命之源。

    Lime配置是Zero中最灵活的配置，您可以使用一个文件来配置所有内容，也可以使用多个文件来分开配置，不论多少文件，其文件名都是按照`lime`中定义的子文件进行汇总，假设您定义了如下片段：

```yaml
vertx:
    lime: x1, x2, x3
```

    那么Zero会将`vertx-x1.yml、vertx-x2.yml、vertx-x3.yml` 三个文件内容合并到一起生成一个唯一的JsonObject配置，这种做法唯一的限制就是Lime针对不同功能时配置的键名必须唯一。

### 2.1. 常用规范

    此处提供两套完整的文件规范（不包含主配置）。

**按功能拆分**

| 文件名                  | 含义                              |
| -------------------- | ------------------------------- |
| vertx-jooq.yml       | Jooq主库配置、历史库配置。                 |
| vertx-session.yml    | 会话专用配置。                         |
| vertx-redis.yml      | Redis相关配置（zero-ifx-redis)。      |
| vertx-trash.yml      | 历史库备份功能专用配置（zero-ifx-history）。  |
| vertx-es.yml         | ElasticSearch专用配置（zero-ifx-es）。 |
| vertx-neo4j.yml      | Neo4j图库配置（zero-ifx-neo4j）。      |
| vertx-secure.yml     | 安全相关配置（包括跨域配置）。                 |
| vertx-shell.yml      | DevOps命令行专用配置（zero-ifx-shell）。  |
| vertx-router.yml     | 动态路由启用专用配置（zero-jet）。           |
| vertx-deployment.yml | Verticle部署专用配置。                 |
| vertx-init.yml       | 初始化专用配置。                        |
| vertx-extension.yml  | Zero Extension模块核心配置。           |
| vertx-job.yml        | 后台任务专用配置。                       |
| vertx-cache.yml      | L1、L2、L3缓存专用配置。                 |
| vertx-debug.yml      | 调试专用配置。                         |
| vertx-shared.yml     | SharedData专用配置。                 |
| vertx-sms.yml        | 阿里短信服务配置（zero-ifx-sms）。         |
| vertx-iqiy.yml       | 爱奇艺视频服务配置（zero-ifx-iqiy）。       |
| vertx-feign.yml      | Feign客户端配置（zero-ifx-feign）。     |
| vertx-excel.yml      | Excel导入导出专用配置（zero-ifx-excel）。  |
| vertx-rpc.yml        | 微服务专用配置（zero-iproxy）。           |
| vertx-etcd.yml       | 微服务ETCD专用配置。                    |

**最佳实践**

    最佳实践主要来自于生产环境中的基础文件合并，上述文件过多，如果不做一定程度的压缩，那么对开发人员而言挺繁琐的，压缩文件符合几个基本原则：

1. 复杂配置和独立功能放到一个独立文件中以方便直接更改。
2. 常用固定配置基本只需要配置一次，修改后就不变了，放到一起。
3. 生产部署和开发不同的文件放到一起，每次部署之前统一修改，也方便DevOps脚本。

    压缩过后的文件结构如：

| 文件名                 | 含义                                              |
| ------------------- | ----------------------------------------------- |
| vertx-excel.yml     | Excel导入导出专用定义，内容比较长，独立文件。                       |
| vertx-cache.yml     | L1、L2、L3三级缓存的基础配置（目前只支持L1，Redis）。               |
| vertx-shell.yml     | DevOps专用配置。                                     |
| vertx-secure.yml    | 维持不变。                                           |
| vertx-rpc.yml       | 微服务专用配置（zero-iproxy），原`-rpc, -etcd`             |
| vertx-extention.yml | 原`-init, -extension，-job, -shared, -session`配置。 |
| vertx-jet.yml       | 原`-router, -deployment`配置。                      |
| vertx-jooq.yml      | 原`-jooq, -redis, -trash, -es, -neo4j`配置，以及跨域。   |
| vertx-tp.yml        | 原`-sms, -iqiy`相关配置。                             |

    简单说明一下：

1. `vertx-jooq.yml`是在切换环境时改动最大的一个文件，这样的结构做环境迁移几乎不需要去改动其他配置文件，仅修改`vertx-jooq.yml`即可，因为它包含了所有和Zero相关的集成部分。
2. 单点模式下`vertx-tp.yml、vertx-rpc.yml`是不用配置的文件。
3. `vertx-jet.yml`主控Verticle数量，可做简单模式下的性能调优。

    所以最终形成的配置文件结构如：

![](/files/lQ8P65mlOTzRn2CiDK4e)

    截图中目录配置表如下：

| 目录名     | 含义                            |
| ------- | ----------------------------- |
| cab     | `X_MODULE`中和前端页面绑定的动态配置。      |
| codex   | Zero验证模块专用的接口验证配置（@Codex）。    |
| keys    | 安全专用jceks文件目录以及其他签名文件目录。      |
| plugin  | Zero Extension模块专用文件目录。       |
| pojo    | 旧系统映射层专用配置文件目录。               |
| init    | 初始化Excel模板数据存储位置，包含所有OOB数据文件。 |
| runtime | 运行时的静态配置（可自由处理）。              |

    以上目录中除`init`和`runtime`是可自定义的，其他几个目录几乎是固定的，而且不会重复以及冲突。`init`目录中包含了系统初始化的所有配置数据，它是**产品** 第一个版本的OOB（Out-Of-Box）数据，您可以直接使用该目录的数据重置系统，等价于**恢复出厂**；`runtime` 目录中包含了运行时的各种配置数据，如DevOps、动态建模临时文件、数据模板、特殊插件、测试框架Mock配置等所有和运行相关的配置文件都在此目录中。

> 接下来按功能来看看各部分的详细配置，瞅瞅这张地图，详细配置图可参考：

### 2.2. vertx-jooq.yml

#### 配置地图

![](/files/tcbGzOq8O0p5PdPF8zYz)

#### 示例

```yaml
jooq:
    provider:
        driverClassName: "com.mysql.cj.jdbc.Driver"
        username: cmdb
        password: "????"
        hostname: "ox.engine.cn"
        instance: DB_ORIGIN_X
        jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_ORIGIN_X..."
    # 历史数据库，如果启用逻辑删除则需要使用该库
    orbit:
        driverClassName: "com.mysql.cj.jdbc.Driver"
        username: cmdb
        password: "????"
        hostname: "ox.engine.cn"
        instance: DB_IOP_HIS
        jdbcUrl: "jdbc:mysql://ox.engine.cn:3306/DB_IOP_HIS
```

#### 说明

1. **provider**是主业务数据库配置，如果是动态建模方式，它表示平台数据库，一般用`DB_ORIGIN_X`或其他，若不启用动态建模，则该数据库就是核心业务数据库。
2. **orbit**是历史记录数据库，若启用了删除备份功能，则使用该数据库存储被**物理删除**的数据。

### 2.3. vertx-session.yml

#### 配置地图

![](/files/YzAIwV4Rv2tNiv6UQCnN)

#### 示例

```yaml
session:
    config:
        category: DEFINED
        store: io.vertx.tp.plugin.redis.RedisStore
        options: 
```

#### 说明

    此处需要说明的是会话存储器的核心配置，该会话存储器主要分三类：

| category值 | 使用存储类                                         |
| --------- | --------------------------------------------- |
| LOCAL     | io.vertx.ext.web.sstore.LocalSessionStore     |
| CLUSTER   | io.vertx.ext.web.sstore.ClusteredSessionStore |
| DEFINE    | io.vertx.tp.plugin.redis.RedisStore或其他        |

    上述配置在配置了`session`节点时自动生效，而`options`配置主要针对`category = DEFINE` 类型，这种情况需开发人员自己提供自定义的SessionStore实现，该实现可参考`RedisStore`的代码。

### 2.4. vertx-redis.yml

> zero-ifx-redis

#### 配置地图

![](/files/iQdSQwBj4scZ63DQAim9)

#### 示例

```yaml
redis:
    # Redis运行的Host名或IP地址
    host: ox.integration.cn
    # Redis运行的接口
    port: 6379
```

### 2.5. vertx-trash.yml

> zero-ifx-history

#### 配置地图

![](/files/itkkGcqoIoVaJwQUcrAv)

#### 示例

```yaml
trash:
    # 历史记录保留的时间，-1表示在历史库中永久保留。
    keepDay: -1
```

### 2.6. vertx-es.yml

> zero-ifx-es

#### 配置地图

![](/files/CgXaRnE4G33ZK4blVJWm)

#### 示例

```yaml
elasticsearch:
    hostname: ox.integration.cn
    port: 9200
    scheme: http
    index: cmdb
    username: elastic
    password: ???????
```

### 2.7. vertx-neo4j.yml

> zero-ifx-neo4j

#### 配置地图

![](/files/fGCFmRZ9aeAq6Banndhh)

#### 示例

```yaml
neo4j:
    port: 7687
    protocol: bolt
    hostname: ox.integration.cn
    username: neo4j
    password: ?????
```

#### 说明

    Neo4j一般支持三种连接协议：

| 协议名   | 默认端口 | 对应neo4j配置            |
| ----- | ---- | -------------------- |
| bolt  | 7687 | dbms.connector.bolt  |
| http  | 7474 | dbms.connector.http  |
| https | 7473 | dbms.connector.https |

### 2.8. vertx-secure.yml

#### 配置地图

![](/files/aJHeJsMUOxqgbOaxoVCf)

#### 示例

```yaml
# 安全配置
secure:
    # Standard Type
    jwt:
        type: jwt
        config:
            jwtOptions:
                algorithm: HS256
            keyStore:
                type: jceks
                path: keys/keystore.jceks
                password: zeroup
# 跨域配置
cors:
    credentials: true
    methods:
        - DELETE
        - GET
        - POST
        - PUT
        - OPTIONS
    headers:
        - Authorization
        - Accept
        - Content-Disposition
        - Content-Encoding
        - Content-Length
        - Content-Type
        - X-App-Id
        - X-App-Key
        - X-Sigma
        - X-Lang
    origin: "http://ox.server.cn:5000"
```

> 这部分配置在安全章节已经讲解，此处就不再过多说明。

### 2.9. vertx-shell.yml

> zero-ifx-shell

#### 配置地图

![](/files/rXQfcLKFmtkzwBcVG1lr)

#### 示例

```yaml
shell:
    debug: false # 是否开启命令行的Debug模式，Debug模式可以查看堆栈信息
    welcome:
        banner: "Ox Engine Shell ( γραμμή εντολών )"
        version: "1.0"
        message:
            environment: "[ {0} ]"
            wait: "请输入命令，使用 h 可查看帮助文档"
            quit: "您已经成功推出控制台！Successfully"
            back: "您已经退出当前子系统：{0}！Successfully"
            header: "参数选项表："
            help: "命令表："
            footer: "版权: 深圳招为科技 Ver.1.0"
            empty: "[ Error ] 您还没有输入任何命令，请输入合法命令！"
            invalid: "对不起，该命令无法识别 \"{0}\"，请输入合法命令！"
            previous: "执行命令：\"{0}\", \"{1}\""
            usage: "基本语法：<command> [options...]
                        \t命令名称：{0}, 命令类型：{1}
                        \t参数格式: [-opt1 value1 -opt2 value2]"
    commands:
        default: "runtime/console/commands.default.json"
        defined: "runtime/console/commands.json"
    validate:
        input:
            required: "参数缺失或者长度不匹配（长度必须大于1），请输入合法参数！"
            existing: "请输入合法的参数，参数列表：{0}，当前输入：`{1}`"
        args:
            - start
            - config
```

#### 说明

    注意图中红色部分，还有隐藏的配置，但这些配置太过复杂，在讲解Zero中的**命令行框架**时会单独讲解所有详细配置。

### 2.10. vertx-jet.yml

> zero-jet

该文件合并表格中的`vertx-router.yml`和`vertx-deployment.yml`。

#### 配置地图

![](/files/IELJORd7stjMQknJAL8f)

#### 示例

```yaml
# 路由配置
router:
    wall: /api
    worker:
        instances: 4
    agent:
        instances: 32
    unity: io.vertx.tp.optic.environment.UnityAmbient

## 配置
deployment:
    mode: CONFIG
    options:
        io.vertx.up.verticle.ZeroHttpAgent:
            instances: 32
        io.vertx.up.verticle.ZeroHttpWorker:
            instances: 128
```

#### 说明

    这份配置有几点说明：

1. router主控**动态路由**配置
   1. Agent组件线程数就是32。
   2. Worker组件线程数为`Agent x 4 = 128`，Worker依靠Agent发布。
2. deployment主控**静态路由**配置
   1. Agent组件线程数为32。
   2. Worker组件线程数为128。

> 后续版本中会将router中的Worker标准化，instances是多少就发布多少，这是曾经的一次失误开发引起的问题。

### 2.11. vertx-extension.yml

该文件合并表格中的`vertx-init.yml`和`vertx-extension.yml`。

#### 配置地图

![](/files/HRdm1Ke8vKMkLTYryPbF)

#### 示例

```yaml
# -----------------------------------------------------
# 扩展模块专用配置
init:
    # 初始化Crud
    -   component: io.vertx.tp.crud.init.IxPin
    # 初始化Rbac
    -   component: io.vertx.tp.rbac.init.ScPin
    # 初始化Ambient
    -   component: io.vertx.tp.ambient.init.AtPin
    # 初始化Ui
    -   component: io.vertx.tp.ui.init.UiPin
    # 初始化Api
    -   component: io.vertx.tp.jet.init.JtPin
    # 初始化Atom
    -   component: io.vertx.tp.atom.init.AoPin

# -----------------------------------------------------
# Extension 模块中的`数据域`和`Auditor`部分
extension:
    region:
        component: io.vertx.tp.rbac.extension.DataRegion
        config:
            prefix: /api/
    auditor:
        component: io.vertx.tp.rbac.extension.AuditorPin
        config:
            # 重写过 /api/:actor 的模块需要配置
            include:
                - /api/employee                                 # 员工
                - /api/user                                     # 用户
                - /api/permission                               # 权限
            exclude:
                # 员工排除
                - /api/employee/search
                - /api/employee/missing
                - /api/employee/existing
                - /api/employee/export
                - /api/employee/import
                # 权限排除
                - /api/permission/search
                - /api/permission/missing
                - /api/permission/existing
                - /api/permission/export
                - /api/permission/import
                # 用户排除
                - /api/user/existing
                - /api/user/missing
                - /api/user/search
                - /api/user/export
                - /api/user/import
```

#### 说明

    这部分配置和前文提到过的插件相关，启用了CRUD项目过后，配置本身就变得比较复杂了，特别是Auditor的exclude部分，若不启用CRUD则这部分配置会简单很多，主要目的是开启Zero Extension中的**职责模块、数据域**等功能，CRUD模块会在Zero Extension中单独介绍。

### 2.12. vertx-job.yml

#### 配置地图

![](/files/7XJ3Dz7lh9pGZYrdEPKy)

#### 示例

```yaml
job:
    store:
        component: io.vertx.tp.jet.uca.micro.JtHypnos
```

> 这部分配置会在任务系统章节单独说明。

### 2.13. vertx-cache.yml

#### 配置地图

![](/files/S2286y1E6TMMCXhGjCxG)

#### 示例

```yaml
cache:
    # L1 Cache between Dao and Database
    l1:
        component: "io.vertx.tp.plugin.redis.cache.L1"
        worker: "io.vertx.tp.plugin.redis.cache.L1Worker"
        address: "EVENT://L1-CACHE/FOR/DAO"
        options:
        # Definition for spec situations
        matrix:
        # 
    # L2 Cache between Service and Dao

    # L3 Cache between Api and Service
```

> 直接查看上述注释部分，目前系统只支持Redis的L1级别的缓存信息。

### 2.14. vertx-debug.yml

#### 配置地图

![](/files/Uuc5mg8GyDRq2nAJSjnn)

#### 示例

```yaml
database:
    sql.debug: false                  # 旧系统用，新版会移除
# Debugger 模块
debug:
    rest.url.detect: false            # Uri 日志关闭（默认打开）
    # job.boot:       false           # Job 详细日志（默认关闭）
    # jooq.condition:   false         # Jooq 条件日志（默认关闭）
    # jooq.password:  false           # Jooq 密码隐藏（默认关闭）
    # excel.range:    false           # Excel 扫描区域日志（默认关闭）

    # Extension Module
    # crud.dao.file:  false           # IxDao 文件读取日志（默认关闭）
```

> 0.8.0之后这部分配置有所变化，如：

```yaml
debug:
    # （默认打开）Restful的路径扫描检查日志，规范检查专用
    web.uri.detecting:      false
    # （默认关闭）Job任务启动时的日志打印
    # job.booting:            true
    # （默认关闭）隐藏初始密码，后台账号可以在日志中看到初始密码
    # password.hidden:        true
    # （默认关闭）打印底层Stack Trace的调试信息
    # stack.tracing:          true
    # Jooq 条件日志（默认关闭）
    # jooq.condition:         true
    # Excel 扫描区域日志（默认关闭）
    # excel.ranging:          true
```

#### 说明

> 只用于调试，生产环境部分日志会自动关闭。

| 选项              | 新                 | 默认    | 含义                           |
| --------------- | ----------------- | ----- | ---------------------------- |
| rest.url.detect | web.uri.detecting | true  | 是否打开Uri的Detect日志，若打开则打印计算日志。 |
| job.boot        | job.booting       | false | 是否打印启动Job的日志。                |
| jooq.condition  | jooq.condition    | false | 是否打印Jooq的SQL底层条件监控日志。        |
| jooq.password   | password.hidden   | false | 是否在后台日志隐藏Jooq密码（防服务端盗窃）。     |
| excel.range     | excel.ranging     | false | 是否开启Excel的区域扫描日志。            |
| crud.dao.file   | crud.dao.file     | false | 是否打开IxDao的文件专用日志。            |
| x               | stack.tracing     | false | 是否打印部分底层异常。                  |

### 2.15. vertx-tp.yml

该文件合并表格中的`vertx-shared.yml, vertx-feign.yml, vertx-iqiy.yml, vertx-sms.yml`。

> zero-ifx-feign, zero-ifx-iqiy, zero-ifx-sms

#### 配置地图

![](/files/wynUoReiMTleANm5twLV)

    该文件中主要包含了第三方的详细配置，而`vertx-shared.yml`配置其实放在哪个文件中都不影响整体，至于Feign, AliSms, IQiy这些第三方都是比较特殊的第三方集成，此处不提供示例。

### 2.16. vertx-excel.yml

> zero-ifx-excel

#### 配置地图

![](/files/TxPP454TCTztSaBNwXdN)

#### 示例

```yaml
excel:
    pen: "io.vertx.tp.plugin.excel.tpl.BlueTpl"
    environment:
        -   name: environment.ambient.xlsx
            path: "init/oob/environment.ambient.xlsx"
    temp: /tmp/
    mapping:
        # Source
        -   table: X_SOURCE
            pojo: cn.vertxup.ambient.domain.tables.pojos.XSource
            dao: cn.vertxup.ambient.domain.tables.daos.XSourceDao
            key: key
            unique:
```

> 0.8.0之后这部分配置有所变化，如：

```yaml
        # Source
        -   dao: cn.vertxup.ambient.domain.tables.daos.XSourceDao
            key: key
            unique:
```

#### 说明

    Zero中在处理Excel模板时，支持很复杂的Excel模板，同时也支持复杂的风格渲染，如上边片段中`pen`配置的是**蓝色风格**：

* 支持JsonArray的分离和合并导入导出。
* 支持Formula表达式以及外联文件表达式实现目录下的Excel链接。
* 2003和2007双格式支持。
* 支持单元格直接从文件读取序列化成JsonArray或JsonObject操作，`JSON:`前缀。
* 支持单元格中的引用值读取，跨表导入导出。

    详细功能在讲解插件时再举例说明。

### 2.17. vertx-rpc.yml

该文件合并表格中的`vertx-rpc.yml、vertx-etcd.yml`。

> zero-iproxy

#### 配置地图

![](/files/LBfJzUUqybseHMdKxdr1)

#### 说明

    最后一份配置比较复杂，和微服务相关。

| 节点      | 含义                             |
| ------- | ------------------------------ |
| rpc     | gRpc完整配置，做微服务之间服务通讯专用。         |
| circuit | 微服务中熔断专用配置。                    |
| etcd    | 微服务中服务配置中心Etcd相关配置（可支持集群配置中心）。 |

## 「叄」小结

    本章节带您领略了整个Zero框架中的所有配置，详细的配置图可参考本文最开始的配置地图专用链接下载该图（2.8M），后续更新会有新版本的配置完整地图。这些配置中某些配置部分是还没讲解的章节，而大部分都是已经讲解过的章节，有关配置的细节只能读者自己在学习过程去体会。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lang-yu.gitbook.io/zero/000.index/014.configuration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
