Skip to content

Commit dff769f

Browse files
committed
feat(consul): 使用UUID生成唯一服务ID以支持多实例部署
实现docker上多实例部署
1 parent 3c1d3bc commit dff769f

File tree

3 files changed

+75
-34
lines changed

3 files changed

+75
-34
lines changed

mock/s3/README.md

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,28 @@
7373

7474
#### 网络架构
7575
```
76-
Docker网络:172.20.0.0/16
77-
├─ 基础设施层:172.20.0.10-29
76+
Docker网络:172.20.0.0/16 (支持动态多实例扩容)
77+
├─ 基础设施层:固定IP (172.20.0.10-29)
7878
│ ├─ consul: 172.20.0.10
7979
│ ├─ postgres: 172.20.0.11
8080
│ ├─ redis: 172.20.0.12
8181
│ └─ 监控组件: 172.20.0.20-24
82-
└─ 业务服务层:172.20.0.30-39
83-
├─ metadata-service: 172.20.0.31
84-
├─ storage-service: 172.20.0.32
85-
├─ queue-service: 172.20.0.33
86-
├─ third-party-service: 172.20.0.34
87-
└─ mock-error-service: 172.20.0.35
82+
└─ 业务服务层:动态分配IP (支持多实例)
83+
├─ metadata-service: 可扩容到多个实例
84+
├─ storage-service: 可扩容到多个实例
85+
├─ queue-service: 可扩容到多个实例
86+
├─ third-party-service: 可扩容到多个实例
87+
└─ mock-error-service: 可扩容到多个实例
88+
89+
服务发现:
90+
• 每个服务实例使用UUID生成唯一ServiceID
91+
• Consul自动负载均衡到健康实例
92+
• 端口范围映射支持多实例访问
93+
94+
技术实现:
95+
• ServiceID格式: {service-name}-{uuid}
96+
• 支持动态扩缩容: docker-compose up -d --scale service=N
97+
• 无状态设计: 实例间无依赖,可随意增减
8898
```
8999

90100
---
@@ -111,16 +121,56 @@ Docker网络:172.20.0.0/16
111121
docker --version && docker-compose --version
112122
```
113123

114-
### 第二步:一键启动
115-
```bash
124+
### 第二步:启动服务栈
116125

117-
# 启动完整服务栈
126+
#### 单实例模式
127+
```bash
128+
# 启动完整服务栈(每个服务1个实例)
118129
docker-compose up --build -d
119130

120131
# 等待服务就绪
121132
docker-compose ps
122133
```
123134

135+
#### 多实例模式
136+
137+
**一次性构建**
138+
```bash
139+
# 启动多实例服务栈
140+
docker-compose up --build -d \
141+
--scale metadata-service=3 \
142+
--scale storage-service=2 \
143+
--scale queue-service=2 \
144+
--scale third-party-service=2 \
145+
--scale mock-error-service=1
146+
```
147+
148+
**分批构建**
149+
```bash
150+
# 第一步:启动基础设施服务
151+
docker-compose up -d consul postgres redis elasticsearch prometheus grafana kibana otel-collector
152+
153+
# 第二步:分别构建各个服务镜像
154+
docker-compose build metadata-service
155+
docker-compose build storage-service
156+
docker-compose build queue-service
157+
docker-compose build third-party-service
158+
docker-compose build mock-error-service
159+
160+
# 第三步:分批启动业务服务
161+
docker-compose up -d --scale metadata-service=3 metadata-service
162+
docker-compose up -d --scale storage-service=2 storage-service
163+
docker-compose up -d --scale queue-service=2 queue-service
164+
docker-compose up -d --scale third-party-service=2 third-party-service
165+
docker-compose up -d --scale mock-error-service=1 mock-error-service
166+
167+
# 验证所有实例运行状态
168+
docker-compose ps
169+
170+
# 查看Consul服务发现状态
171+
curl -s "http://localhost:8500/v1/catalog/services" | jq .
172+
```
173+
124174
### 第三步:故障注入体验
125175
```bash
126176
# 创建CPU峰值异常 - 持续2分钟

mock/s3/docker-compose.yml

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
version: '3.8'
2-
31
networks:
42
mock-s3-network:
53
driver: bridge
@@ -244,13 +242,11 @@ services:
244242
context: .
245243
dockerfile: services/metadata/Dockerfile
246244
image: mock-s3/metadata-service:latest
247-
container_name: mock-s3-metadata-service
248245
hostname: metadata-service
249246
networks:
250-
mock-s3-network:
251-
ipv4_address: 172.20.0.31
247+
- mock-s3-network
252248
ports:
253-
- "8081:8081"
249+
- "8081-8090:8081"
254250
environment:
255251
- SERVICE_NAME=metadata-service
256252
- CONSUL_ADDR=consul:8500
@@ -280,13 +276,11 @@ services:
280276
context: .
281277
dockerfile: services/storage/Dockerfile
282278
image: mock-s3/storage-service:latest
283-
container_name: mock-s3-storage-service
284279
hostname: storage-service
285280
networks:
286-
mock-s3-network:
287-
ipv4_address: 172.20.0.32
281+
- mock-s3-network
288282
ports:
289-
- "8082:8082"
283+
- "8082-8092:8082"
290284
volumes:
291285
- storage-data:/app/data/storage
292286
environment:
@@ -311,13 +305,11 @@ services:
311305
context: .
312306
dockerfile: services/queue/Dockerfile
313307
image: mock-s3/queue-service:latest
314-
container_name: mock-s3-queue-service
315308
hostname: queue-service
316309
networks:
317-
mock-s3-network:
318-
ipv4_address: 172.20.0.33
310+
- mock-s3-network
319311
ports:
320-
- "8083:8083"
312+
- "8083-8093:8083"
321313
environment:
322314
- SERVICE_NAME=queue-service
323315
- CONSUL_ADDR=consul:8500
@@ -343,13 +335,11 @@ services:
343335
context: .
344336
dockerfile: services/third-party/Dockerfile
345337
image: mock-s3/third-party-service:latest
346-
container_name: mock-s3-third-party-service
347338
hostname: third-party-service
348339
networks:
349-
mock-s3-network:
350-
ipv4_address: 172.20.0.34
340+
- mock-s3-network
351341
ports:
352-
- "8084:8084"
342+
- "8084-8094:8084"
353343
environment:
354344
- SERVICE_NAME=third-party-service
355345
- CONSUL_ADDR=consul:8500
@@ -372,13 +362,11 @@ services:
372362
context: .
373363
dockerfile: services/mock-error/Dockerfile
374364
image: mock-s3/mock-error-service:latest
375-
container_name: mock-s3-mock-error-service
376365
hostname: mock-error-service
377366
networks:
378-
mock-s3-network:
379-
ipv4_address: 172.20.0.35
367+
- mock-s3-network
380368
ports:
381-
- "8085:8085"
369+
- "8085-8095:8085"
382370
volumes:
383371
- mock-error-data:/app/data
384372
environment:

mock/s3/shared/middleware/consul/consul.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"time"
1010

1111
"github.com/gin-gonic/gin"
12+
"github.com/google/uuid"
1213
"github.com/hashicorp/consul/api"
1314
)
1415

@@ -50,8 +51,10 @@ func CreateConsulClient(address string, logger *observability.Logger) (ConsulCli
5051

5152
// RegisterService 注册服务到Consul
5253
func (c *DefaultConsulClient) RegisterService(ctx context.Context, service *models.ServiceInfo) error {
54+
// 使用UUID确保每个服务实例有唯一的ServiceID
55+
serviceUUID := uuid.New().String()
5356
registration := &api.AgentServiceRegistration{
54-
ID: fmt.Sprintf("%s-%s-%d", service.Name, service.Address, service.Port),
57+
ID: fmt.Sprintf("%s-%s", service.Name, serviceUUID),
5558
Name: service.Name,
5659
Address: service.Address,
5760
Port: service.Port,

0 commit comments

Comments
 (0)