# Initialize 初始化微服务


## 介绍

Initialize 微服务负责在初始化数据、检测新版本或新的配置、获取应用的相关配置信息、系统区域数据、系统标签数据等其它应用相关数据。

## 源码仓库
```
https://git.apinb.com/bsm-service-base/initialize
```

## 安装

要安装 Initialize 初始化微服务,请确保您已经安装了 bsm cli, 安装命令如下:

```bash
bsm install initialize
```

## 配置文件

在 `etc/` 目录中,根据dev,test,prod环境不同读取不同的配置文件,通过配置微服务决定是否启用相关服务,例如:

initialize_prod.yaml
```yaml
Name: {ServiceKey}
ListenOn: 0.0.0.0:12202

Dsn: postgres://postgres:******@127.0.0.1:5432/{Workspace}_prod?sslmode=disable&TimeZone=Asia/Shanghai

# cache DB的选择请在后面直接带参数,不带会自动HASH计算选择DB库。
Cache: redis://null:******@127.0.0.1:6379/

Etcd:
  Hosts:
  - 127.0.0.1:2379
  Key: service.{Workspace}.{ServiceKey}.rpc

# 匿名访问清单,自动注入网关层
Anonymous:
  Key: anonymous.{Workspace}
  Urls:
    - initialize.Check.Hello
    - initialize.Check.Updates
    - initialize.Data.Configure
    - initialize.Data.Areas
    - initialize.Data.Tags


# 日志记录, 注释将不启用此功能
Log:
  ServiceName: {ServiceKey}
  Mode: file
  Path: logs/{ServiceKey}
  Stat: false

# 性能监控, 注释将不启用此功能
Prometheus:
  Host: 127.0.0.1
  Port: 22202
  Path: /metrics

# 链路追踪, 注释将不启用此功能
Telemetry:
  Name: {Workspace}.{ServiceKey}.{RuntimeMode}
  Endpoint: http://127.0.0.1:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger

# MQ Pulsar, 不启用
#Pulsar:
#  Endpoints: 127.0.0.1
#  Token: 9091
#  Namespaces: {Workspace}

```

## 管理微服务

使用以下命令管理微服务:

```bash
bsm start/restart/update initialize
```

## API 接口说明

### 检测是否有新版或新的配置

POST /initialize.Check.Updates

> Body 请求参数

```json
{
  "app": "ut occaecat sit Duis proident",
  "os": "consequat laborum velit reprehenderit",
  "arch": "exercitation sit reprehenderit in amet",
  "version": "minim ullamco"
}
```

#### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|Request-Id|header|string| 是 ||请求ID|
|Content-Type|header|string| 是 ||传输格式|
|Workspace|header|string| 是 ||项目名称|
|Authorization|header|string| 否 ||用户通行证Token|
|body|body|object| 否 ||none|
|» app|body|string| 是 | 应用程序名称 <必填>|应用程序名称|
|» os|body|string| 是 | 操作系统 <必填>|操作系统|
|» arch|body|string| 是 | 构架名称 <必填>|构架名称|
|» version|body|string| 是 | 版本号 <必填>|版本号|

> 返回示例

> 200 Response

```json
{
  "identity": "string",
  "version": "string",
  "summary": "string",
  "files": "string",
  "pubdate": "string"
}
```

#### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

#### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» identity|string|true|none|唯一标识|0为未找到相应版本|
|» version|string|true|none|版本号|0为未找到相应版本|
|» summary|string|true|none||none|
|» files|string|true|none||none|
|» pubdate|string|true|none||none|

### 获取应用的相关配置信息

POST /initialize.Data.Configure

> Body 请求参数

```json
{
  "app": "milu",
  "os": "windows"
}
```

#### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|Content-Type|header|string| 是 ||none|
|Request-Id|header|string| 是 ||请求ID|
|Workspace|header|string| 是 ||项目名称|
|Authorization|header|string| 否 ||用户通行证Token|
|body|body|object| 否 ||none|
|» app|body|string| 是 | 应用程序名称 <必填>|应用程序名称|
|» os|body|string| 是 | 操作系统 <必填>|操作系统|

> 返回示例

> 200 Response

```json
{}
```

#### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

#### 返回数据结构

状态码 **200**

*empty object*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|

### 获取系统区域数据

POST /initialize.Data.Areas

> Body 请求参数

```json
{}
```

#### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|Content-Type|header|string| 是 ||none|
|Request-Id|header|string| 是 ||请求ID|
|Workspace|header|string| 是 ||项目名称|
|Authorization|header|string| 否 ||用户通行证Token|
|body|body|object| 否 ||none|
|» is_town|body|boolean| 否 ||是否列出乡镇数据,【开关】|

> 返回示例

> 200 Response

```json
{
  "areas": [
    {
      "id": "string",
      "pid": "string",
      "deep": 0,
      "name": "string",
      "pinyinPrefix": "string",
      "pinyin": "string",
      "extId": "string",
      "extName": "string"
    }
  ]
}
```

#### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

#### 返回数据结构

状态码 **200**

*empty object*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» areas|[object]|true|none||区域数据数组|
|»» id|string|true|none||none|
|»» pid|string|true|none||none|
|»» deep|integer|true|none||none|
|»» name|string|true|none||none|
|»» pinyinPrefix|string|true|none||none|
|»» pinyin|string|true|none||none|
|»» extId|string|true|none||none|
|»» extName|string|true|none||none|

### 获取系统标签数据

POST /initialize.Data.Tags

> Body 请求参数

```json
{}
```

#### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|Content-Type|header|string| 是 ||none|
|Request-Id|header|string| 是 ||请求ID|
|Workspace|header|string| 是 ||项目名称|
|Authorization|header|string| 否 ||用户通行证Token|
|body|body|object| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "tags": [
    "string"
  ]
}
```

#### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

#### 返回数据结构

状态码 **200**

*empty object*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» tags|[string]|true|none||标签数据数组|

### hello

POST /initialize.Check.Hello

> Body 请求参数

```json
{}
```

#### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|Request-Id|header|string| 是 ||请求ID|
|Content-Type|header|string| 是 ||传输格式|
|Workspace|header|string| 是 ||项目名称|
|Authorization|header|string| 否 ||用户通行证Token|
|body|body|object| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "Code": 0,
  "Data": {
    "identity": "string",
    "status": "string",
    "message": "string",
    "timeseq": "string"
  }
}
```

#### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

#### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» Code|integer|true|none||none|
|» Data|object|true|none||none|
|»» identity|string|true|none||none|
|»» status|string|true|none||none|
|»» message|string|true|none||none|
|»» timeseq|string|true|none||none|