go 微服务架构

微服务架构

为什么使用微服务架构

分而治之,独立部署、治理

单体应用问题微服务架构解决方案
代码耦合解耦、独立
整个部署,风险高、耗时长独立部署,快速迭代
扩展性差高负载组件支持单独扩展
技术栈单一各组件技术自由

微服务框架

微服务框架服务于微服务架构,核心:通信、治理

rpc调用

go rpc调用

服务注册与发现

go 服务注册与发现

负载均衡

算法

静态算法
  • 轮询、加权轮询
  • 随机、加权随机
  • 哈希、一致性
动态算法
  • 最快响应时间
  • 最少活跃数
  • 最少连接数

实现

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重定向,让客户端重新找一个可用节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值