微服务架构
文章目录
为什么使用微服务架构
分而治之,独立部署、治理
单体应用问题 | 微服务架构解决方案 |
---|---|
代码耦合 | 解耦、独立 |
整个部署,风险高、耗时长 | 独立部署,快速迭代 |
扩展性差 | 高负载组件支持单独扩展 |
技术栈单一 | 各组件技术自由 |
微服务框架
微服务框架服务于微服务架构,核心:通信、治理

rpc调用
服务注册与发现
负载均衡
算法
静态算法
- 轮询、加权轮询
- 随机、加权随机
- 哈希、一致性
动态算法
- 最快响应时间
- 最少活跃数
- 最少连接数
实现
grpc picker接口设计
// PickerBuilder creates balancer.Picker.
type PickerBuilder interface {
Build(info PickerBuildInfo) balancer.Picker
}
type Picker interface {
Pick(info PickInfo) (PickResult, error)
}
grpc balancer使用方式
// 1. 实现picker、pickerBuilder接口
&PickerBuilder{} // 实现pickerBuilder接口的struct
// 2. NewBalancerBuilder 创建grpc balanceBuilder
balanceBuilder := base.NewBalancerBuilder("round_robin", &PickerBuilder{}, base.Config{HealthCheck: true})
// 3. 全局注册balanceBuilder
balancer.Register(balanceBuilder)
// 4. 拨号dial时,传入选择的balanceBuilder的名字:round_robin
opts = append(opts, grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingPolicy":"%s"}`, "round_robin")))
return grpc.Dial(addr, opts...)
源码
gitee: https://gitee.com/luyue_zhang/go_rpc_2/tree/master/balancer
路由策略
源码
gitee: https://gitee.com/luyue_zhang/go_rpc_2/blob/master/route_strategy/test/route_strategy_test.go
Cluster 集群
fail-fast
调不通立即失败
### fail-over
调不通就再次尝试。重试时,注意:
- 什么情况下进行重试,超时时可考虑重试,失败时可考虑直接返回;
- 是否更换节点
- 是否更换机房、城市
- 已失败节点从可用列表中移除
- 重试次数
- 重试时间间隔:等时间间隔、退避算法
广播
源码
gitee: https://gitee.com/luyue_zhang/go_rpc_2/blob/master/interceptor/test/broadcast_test.go
广播响应处理
- 不接收响应
- 接收最快响应
- 接收全部响应
使用场景示例
- 刷新缓存 ——通知
- 寻找最快节点 ——尽可能尽快服务
视频讲解
go 微服务框架-广播实现讲解
可用性
故障检测
- 健康检查:定期检查服务存活状态(如HTTP 200响应)
- 指标监控|动态检测:错误率、响应时间、吞吐量、BBR算法(基于拥塞控制的传输层算法)
- 静态监测:比如设置一秒内只能执行100个请求;相应算法:漏桶、令牌桶、固定窗口、滑动窗口
限流
限流对象
- 单机限流
- 集群限流 redis
- 接口限流
- 方法限流
- 业务限流:用户限流、IP限流(如同一ip不能频繁登录)
单机限流
漏桶、令牌桶、固定窗口、滑动窗口
漏桶与令牌桶详解
漏桶 | 令牌桶 | 总结 |
---|---|---|
1. 请求来了排队等待 2. 定时一个一个放过去 3. 请求排队的结果:通过、超时 | 1. 有个人按一定速率发牌 2. 牌被放在一个固定大小的桶里 3. 请求结果:拿到牌处理、没拿到牌(阻塞超时|返回固定值) | 效果差不多;滑动窗口更加平滑 |
集群限流 redis
测试
源码
gitee: https://gitee.com/luyue_zhang/go_rpc_2/tree/master/available/available
故障检测与限流的关系
故障检测触发限流,限流缓解故障影响、检测优化限流策略
故障处理
拒绝策略
分快路径和慢路径
比如缓存模式下,正常情况下,缓存中查不到就查询数据库;当触发限流后,缓存中查不到可以返回默认值或错误
直接返回固定响应
触发限流后直接返回固定响应这一步可以在服务拦截器里实现
缓存请求,等待唤醒
比如令牌桶、漏洞
转为异步模式
当触发限流后,服务接收到请求直接返回202,再异步处理请求
转发到别的服务器
可以结合failover考虑,返回客户端302重定向,让客户端重新找一个可用节点