实现一个网关的管理:
- 作为一个代理中间件,需要实现限流,熔断,权限认证(IP白名单,JWT权限认证),流量统计
- 负载均衡上,需要进行权值轮询、哈希一致性轮询
- 网络代理上:基于Go的ReverseProxy实现http的代理。TCP,grpc的代理。利用TCP去实现Thrift的代理
https://github.com/Emcikem/gateway-vue
后端:GO + Redis + MySQL + Gin + gRPC 前端:vue + element-ui
慕课网Go的项目,学习使用
中间件一般都是封装在路由上,路由是URL请求分发的管理器
中间件的实现方式
- 基于链表构建中间件,但实现复杂,调用方式不灵活
- 使用数据构建中间件,控制灵活方便
对于简单的http,无法实现一些功能
- 错误回调及错误日志处理
- 更改代理返回内容
- 负载均衡
- url重写
- 限流、熔断、降级
- 数据统计
- 权限验证
ReverseProxy是Go里官方的一个代理工具
我希望扩展这个工具实现:
- 4种负载轮询类型实现及接口封装
- 扩展中间件支持:限流、熔断实现、权限、数据统计
是发起方与第一代里的状态
- keep-alive: 不关闭网络
- close: 关闭网络
- Upgrade:协议升级
记录最后直连实际服务器之前,整个代理过程,可能被篡改
实际请求的ip,不会被改变的
- 随机负载:随机挑选目标服务器IP
- 轮询负载:ABC三台服务器依次轮询
- 加权负载:给目标设置访问权重,按照权值轮询
- 一致性hash负载:请求固定URL访问指定IP
有两个协议:
- 连接建立协议
- 数据传输协议
和http的区别就是,http是一问一答的形式 如果说服务器发生改变,需要让客户端及时更新,那么就要去轮询,但这样耗内存, 所以需要websocket,进行连接之后,如果服务器有数据更新,就发送给客户端进行数据更新
使用tcp进行心跳检测,查询服务的状态,观察者模式通知对应的负载均衡进行服务发现
要求保证:
- 负载均衡策略池是单例
- 限流是单例
-
计数器
-
漏桶 桶的容量是一定的,桶出去的速度是固定的,桶进入的流量是未知的。 保证了请求运行的速度
-
令牌桶 产生令牌的速度是一定的,每次请求都需要申请令牌,如果令牌不足,那么久拒绝请求,令牌桶也有数量大小限制