Skip to content

Commit edecafc

Browse files
authored
Merge pull request #65 from JaD1ng/develop
refactor(service_manager): 重构服务管理模块数据库模型和API
2 parents ab28004 + 625dc3a commit edecafc

File tree

26 files changed

+439
-278
lines changed

26 files changed

+439
-278
lines changed

docs/service_manager/README.md

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
# Service Manager 服务管理模块
2+
3+
Service Manager 是 ZeroOps 平台的核心服务管理模块,负责微服务的生命周期管理、部署协调和状态监控。
4+
5+
## 架构设计
6+
7+
### 分层架构
8+
9+
```
10+
┌─────────────────┐
11+
│ HTTP API │ ← REST API 接口层
12+
├─────────────────┤
13+
│ Service │ ← 业务逻辑层
14+
├─────────────────┤
15+
│ Database │ ← 数据访问层
16+
├─────────────────┤
17+
│ PostgreSQL │ ← 数据存储层
18+
└─────────────────┘
19+
```
20+
21+
- **API层** (`api/`): 处理HTTP请求和响应,参数验证
22+
- **Service层** (`service/`): 核心业务逻辑,事务管理
23+
- **Database层** (`database/`): 数据库操作,SQL查询
24+
- **Model层** (`model/`): 数据模型和类型定义
25+
26+
## 核心功能
27+
28+
### 1. 服务信息管理
29+
30+
- **服务注册**: 创建和注册新的微服务
31+
- **依赖管理**: 维护服务间的依赖关系图
32+
- **版本管理**: 跟踪服务的多个版本
33+
- **健康监控**: 实时监控服务健康状态
34+
35+
### 2. 部署管理
36+
37+
- **部署协调**: 管理服务的部署任务
38+
- **灰度发布**: 支持渐进式部署策略
39+
- **状态控制**: 暂停、继续、回滚部署
40+
- **实例管理**: 跟踪服务实例的分布
41+
42+
### 3. 监控集成
43+
44+
- **指标收集**: 集成时序数据库(Prometheus格式)
45+
- **状态报告**: 服务运行状态实时上报
46+
- **告警处理**: 异常状态检测和告警
47+
48+
## API接口
49+
50+
### 服务管理接口
51+
52+
| 方法 | 路径 | 描述 |
53+
|------|------|------|
54+
| GET | `/v1/services` | 获取所有服务列表 |
55+
| POST | `/v1/services` | 创建新服务 |
56+
| PUT | `/v1/services/:service` | 更新服务信息 |
57+
| DELETE | `/v1/services/:service` | 删除服务 |
58+
| GET | `/v1/services/:service/activeVersions` | 获取服务详情 |
59+
| GET | `/v1/services/:service/availableVersions` | 获取可用服务版本 |
60+
| GET | `/v1/metrics/:service/:name` | 获取服务监控指标 |
61+
62+
### 部署管理接口
63+
64+
| 方法 | 路径 | 描述 |
65+
|------|------|------|
66+
| POST | `/v1/deployments` | 创建部署任务 |
67+
| GET | `/v1/deployments` | 获取部署任务列表 |
68+
| GET | `/v1/deployments/:deployID` | 获取部署任务详情 |
69+
| POST | `/v1/deployments/:deployID` | 更新部署任务 |
70+
| DELETE | `/v1/deployments/:deployID` | 删除部署任务 |
71+
| POST | `/v1/deployments/:deployID/pause` | 暂停部署 |
72+
| POST | `/v1/deployments/:deployID/continue` | 继续部署 |
73+
| POST | `/v1/deployments/:deployID/rollback` | 回滚部署 |
74+
75+
## 数据模型
76+
77+
### 核心实体
78+
79+
#### Service (服务)
80+
```go
81+
type Service struct {
82+
Name string `json:"name"` // 服务名称(主键)
83+
Deps []string `json:"deps"` // 依赖关系列表
84+
}
85+
```
86+
87+
#### ServiceInstance (服务实例)
88+
```go
89+
type ServiceInstance struct {
90+
ID string `json:"id"` // 实例ID(主键)
91+
Service string `json:"service"` // 关联服务名
92+
Version string `json:"version"` // 服务版本
93+
}
94+
```
95+
96+
#### ServiceState (服务状态)
97+
- 健康状态等级
98+
- 状态报告时间
99+
- 异常信息
100+
101+
#### DeployTask (部署任务)
102+
- 部署ID
103+
- 目标服务和版本
104+
- 部署状态
105+
- 创建和更新时间
106+
107+
### 数据库设计
108+
109+
使用 PostgreSQL 作为主数据库:
110+
111+
- **services**: 服务基础信息表
112+
- **service_instances**: 服务实例表
113+
- **service_versions**: 服务版本表
114+
- **service_states**: 服务状态表
115+
- **deploy_tasks**: 部署任务表
116+
117+
## 使用示例
118+
119+
### 创建服务
120+
121+
```bash
122+
curl -X POST http://localhost:8080/v1/services \
123+
-H "Content-Type: application/json" \
124+
-d '{
125+
"name": "user-service",
126+
"deps": ["database-service", "cache-service"]
127+
}'
128+
```
129+
130+
### 创建部署任务
131+
132+
```bash
133+
curl -X POST http://localhost:8080/v1/deployments \
134+
-H "Content-Type: application/json" \
135+
-d '{
136+
"service": "user-service",
137+
"version": "v1.2.0",
138+
"strategy": "rolling"
139+
}'
140+
```
141+
142+
### 获取服务列表
143+
144+
```bash
145+
curl http://localhost:8080/v1/services
146+
```
147+
148+
响应示例:
149+
```json
150+
{
151+
"items": [
152+
{
153+
"name": "user-service",
154+
"deployState": "deployed",
155+
"health": "normal",
156+
"deps": ["database-service"]
157+
}
158+
],
159+
"relation": {
160+
"user-service": ["database-service"]
161+
}
162+
}
163+
```
164+
165+
## 配置说明
166+
167+
### 数据库配置
168+
```yaml
169+
database:
170+
host: localhost
171+
port: 5432
172+
user: postgres
173+
password: password
174+
dbname: zeroops
175+
sslmode: disable
176+
```
177+
178+
### 服务配置
179+
```yaml
180+
service_manager:
181+
port: 8080
182+
log_level: info
183+
```
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
-- ZeroOps Service Manager Database Schema
2+
3+
-- 删除现有表(按依赖关系逆序删除)
4+
DROP TABLE IF EXISTS deploy_tasks;
5+
DROP TABLE IF EXISTS service_states;
6+
DROP TABLE IF EXISTS service_instances;
7+
DROP TABLE IF EXISTS service_versions;
8+
DROP TABLE IF EXISTS services;
9+
10+
-- 服务表
11+
CREATE TABLE IF NOT EXISTS services (
12+
name VARCHAR(255) PRIMARY KEY,
13+
deps JSONB DEFAULT '[]'::jsonb
14+
);
15+
16+
-- 服务版本表
17+
CREATE TABLE IF NOT EXISTS service_versions (
18+
version VARCHAR(255),
19+
service VARCHAR(255),
20+
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
21+
PRIMARY KEY (version, service),
22+
FOREIGN KEY (service) REFERENCES services(name) ON DELETE CASCADE
23+
);
24+
25+
-- 服务实例表
26+
CREATE TABLE IF NOT EXISTS service_instances (
27+
id VARCHAR(255) PRIMARY KEY,
28+
service VARCHAR(255),
29+
version VARCHAR(255),
30+
FOREIGN KEY (service) REFERENCES services(name) ON DELETE CASCADE
31+
);
32+
33+
-- 服务状态表
34+
CREATE TABLE IF NOT EXISTS service_states (
35+
service VARCHAR(255),
36+
version VARCHAR(255),
37+
level VARCHAR(50),
38+
detail TEXT,
39+
report_at TIMESTAMP,
40+
resolved_at TIMESTAMP,
41+
health_status VARCHAR(50),
42+
correlation_id VARCHAR(255),
43+
PRIMARY KEY (service, version),
44+
FOREIGN KEY (service) REFERENCES services(name) ON DELETE CASCADE
45+
);
46+
47+
-- 部署任务表 (deploy_tasks)
48+
CREATE TABLE IF NOT EXISTS deploy_tasks (
49+
id VARCHAR(32) PRIMARY KEY,
50+
start_time TIMESTAMP,
51+
end_time TIMESTAMP,
52+
target_ratio DOUBLE PRECISION,
53+
instances JSONB DEFAULT '[]'::jsonb,
54+
deploy_state VARCHAR(50)
55+
);
56+
57+
-- 创建索引以提高查询性能
58+
CREATE INDEX IF NOT EXISTS idx_service_states_service ON service_states(service);
59+
CREATE INDEX IF NOT EXISTS idx_service_states_report_at ON service_states(service, report_at DESC);
60+
CREATE INDEX IF NOT EXISTS idx_deploy_tasks_state ON deploy_tasks(deploy_state);
61+
CREATE INDEX IF NOT EXISTS idx_service_instances_service ON service_instances(service);
62+
63+
-- 插入Mock S3项目的真实服务数据
64+
-- 服务及其依赖关系(基于实际业务流程)
65+
INSERT INTO services (name, deps) VALUES
66+
('storage', '[]'::jsonb), -- 存储服务:基础服务
67+
('metadata', '["storage"]'::jsonb), -- 元数据服务:依赖存储服务
68+
('queue', '["storage"]'::jsonb), -- 队列服务:依赖存储服务
69+
('third-party', '[]'::jsonb), -- 第三方服务:独立
70+
('mock-error', '[]'::jsonb) -- 错误模拟服务:独立
71+
ON CONFLICT (name) DO NOTHING;
72+
73+
-- 服务版本:metadata, storage, queue, third-party 各有3个版本,mock-error只有1个版本
74+
INSERT INTO service_versions (version, service, create_time) VALUES
75+
-- metadata service versions
76+
('v1.0.0', 'metadata', CURRENT_TIMESTAMP - INTERVAL '60 days'),
77+
('v1.1.0', 'metadata', CURRENT_TIMESTAMP - INTERVAL '30 days'),
78+
('v1.2.0', 'metadata', CURRENT_TIMESTAMP - INTERVAL '7 days'),
79+
-- storage service versions
80+
('v1.0.0', 'storage', CURRENT_TIMESTAMP - INTERVAL '55 days'),
81+
('v1.1.0', 'storage', CURRENT_TIMESTAMP - INTERVAL '25 days'),
82+
('v1.2.0', 'storage', CURRENT_TIMESTAMP - INTERVAL '5 days'),
83+
-- queue service versions
84+
('v1.0.0', 'queue', CURRENT_TIMESTAMP - INTERVAL '50 days'),
85+
('v1.1.0', 'queue', CURRENT_TIMESTAMP - INTERVAL '20 days'),
86+
('v1.2.0', 'queue', CURRENT_TIMESTAMP - INTERVAL '3 days'),
87+
-- third-party service versions
88+
('v1.0.0', 'third-party', CURRENT_TIMESTAMP - INTERVAL '45 days'),
89+
('v1.1.0', 'third-party', CURRENT_TIMESTAMP - INTERVAL '15 days'),
90+
('v1.2.0', 'third-party', CURRENT_TIMESTAMP - INTERVAL '1 day'),
91+
-- mock-error service version
92+
('v1.0.0', 'mock-error', CURRENT_TIMESTAMP - INTERVAL '40 days')
93+
ON CONFLICT (version, service) DO NOTHING;

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.24
44

55
require (
66
github.com/fox-gonic/fox v0.0.6
7+
github.com/lib/pq v1.10.9
78
github.com/rs/zerolog v1.34.0
89
)
910

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
5050
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
5151
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
5252
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
53+
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
54+
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
5355
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
5456
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
5557
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=

internal/client/README.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

internal/config/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func Load() (*Config, error) {
3939
Database: DatabaseConfig{
4040
Host: getEnv("DB_HOST", "localhost"),
4141
Port: getEnvInt("DB_PORT", 5432),
42-
User: getEnv("DB_USER", "postgres"),
43-
Password: getEnv("DB_PASSWORD", ""),
42+
User: getEnv("DB_USER", "admin"),
43+
Password: getEnv("DB_PASSWORD", "password"),
4444
DBName: getEnv("DB_NAME", "zeroops"),
4545
SSLMode: getEnv("DB_SSLMODE", "disable"),
4646
},

internal/middleware/README.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

internal/service_manager/api/README.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

internal/service_manager/api/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func NewApi(db *database.Database, service *service.Service, router *fox.Engine)
1818
service: service,
1919
router: router,
2020
}
21+
2122
api.setupRouters(router)
2223
return api, nil
2324
}

internal/service_manager/api/deploy_api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import (
1414
func (api *Api) setupDeployRouters(router *fox.Engine) {
1515
// 部署任务基本操作
1616
router.POST("/v1/deployments", api.CreateDeployment)
17+
router.GET("/v1/deployments", api.GetDeployments)
1718
router.GET("/v1/deployments/:deployID", api.GetDeploymentByID)
1819
router.POST("/v1/deployments/:deployID", api.UpdateDeployment)
19-
router.GET("/v1/deployments", api.GetDeployments)
2020
router.DELETE("/v1/deployments/:deployID", api.DeleteDeployment)
2121

2222
// 部署任务控制操作

0 commit comments

Comments
 (0)