高可用架构 学习笔记(第 10 部分)
5.3 微服务高可用架构
微服务高可用架构:
code
微服务高可用架构:
用户请求
↓
┌───────────────┐
│ API 网关集群 │ ← 多实例部署
└───────┬───────┘
│
┌───────┴───────────────────┐
│ │
↓ ↓
┌─────────┐ ┌─────────┐
│用户服务 │ │订单服务 │
│(3实例) │ │(5实例) │
└────┬────┘ └────┬────┘
│ │
┌────┴────┐ ┌────┴────┐
│用户 DB │ │订单 DB │
│主 + 从 │ │主 + 从 │
└─────────┘ └─────────┘
保障措施:
1. 服务多实例部署
2. 数据库主从复制
3. 服务注册发现
4. 熔断降级
5. 限流保护服务降级实现:
javascript
// 服务降级示例
class ServiceDegradation {
constructor() {
this.circuitBreaker = new CircuitBreaker()
}
// 调用远程服务
async callRemoteService(serviceName, params) {
// 检查熔断器状态
if (this.circuitBreaker.isOpen(serviceName)) {
// 服务熔断,执行降级逻辑
return this.fallback(serviceName, params)
}
try {
// 调用远程服务
const result = await this.invoke(serviceName, params)
// 成功,重置熔断器
this.circuitBreaker.recordSuccess(serviceName)
return result
} catch (error) {
// 失败,记录失败
this.circuitBreaker.recordFailure(serviceName)
// 执行降级逻辑
return this.fallback(serviceName, params)
}
}
// 降级逻辑
fallback(serviceName, params) {
switch (serviceName) {
case 'recommendation':
// 推荐服务降级:返回热门商品
return this.getHotProducts()
case 'comment':
// 评论服务降级:返回缓存评论
return this.getCachedComments(params.productId)
case 'payment':
// 支付服务不可降级:返回错误
throw new Error('支付服务暂时不可用,请稍后重试')
default:
return null
}
}
async invoke(serviceName, params) {
// 模拟服务调用
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.3) {
resolve({ data: 'success' })
} else {
reject(new Error('服务调用失败'))
}
}, 100)
})
}
async getHotProducts() {
return [
{ id: 1, name: '热门商品1' },
{ id: 2, name: '热门商品2' }
]
}
async getCachedComments(productId) {
return [
{ id: 1, content: '缓存评论1' },
{ id: 2, content: '缓存评论2' }
]
}
}
// 熔断器
class CircuitBreaker {
constructor() {
this.states = new Map()
this.threshold = 5 // 失败阈值
this.timeout = 60000 // 熔断超时时间
}
isOpen(serviceName) {
const state = this.states.get(serviceName)
if (!state) return false
if (state.status === 'open') {
// 检查是否超过超时时间
if (Date.now() - state.lastFailureTime > this.timeout) {
// 进入半开状态
state.status = 'half-open'
return false
}
return true
}
return false
}
recordSuccess(serviceName) {
const state = this.states.get(serviceName) || {
status: 'closed',
failureCount: 0
}
state.status = 'closed'
state.failureCount = 0
this.states.set(serviceName, state)
}
recordFailure(serviceName) {
const state = this.states.get(serviceName) || {
status: 'closed',
failureCount: 0
}
state.failureCount++
state.lastFailureTime = Date.now()
if (state.failureCount >= this.threshold) {
state.status = 'open'
console.log(`服务 ${serviceName} 熔断器打开`)
}
this.states.set(serviceName, state)
}
}
// 使用示例
const service = new ServiceDegradation()
// 正常调用
service.callRemoteService('recommendation', {})
.then(result => console.log('推荐结果:', result))
// 服务降级
for (let i = 0; i < 10; i++) {
service.callRemoteService('recommendation', {})
.then(result => console.log(`第${i+1}次调用:`, result))
}六、高可用监控与告警
6.1 监控指标
javascript
// 高可用监控指标
const monitoringMetrics = {
// 系统层指标
system: {
cpu: 'CPU 使用率',
memory: '内存使用率',
disk: '磁盘使用率',
network: '网络流量'
},
// 应用层指标
application: {
qps: '请求吞吐量',
latency: '响应时间',
errorRate: '错误率',
availability: '可用性'
},
// 数据层指标
database: {
connections: '连接数',
queryTime: '查询时间',
replicationLag: '复制延迟',
diskIO: '磁盘 I/O'
},
// 中间件指标
middleware: {
mqLag: '消息队列延迟',
cacheHitRate: '缓存命中率',
serviceHealth: '服务健康状态'
}
}