grpc实现流量染色
什么是流量染色
流量染色是指根据流量协议设置对应的流量染色规则,对指定的流量进行染色标记,并在整个调用链中携带该标记。通过染色流量可以对特定的流量进行跟踪和路由,所以流量染色功能常被用于灰度发布的场景。在业务系统迭代过程中会不断有新版本发布,在正式发布前,可以使用流量染色控制先进行小规模验证,通过收集使用体验的数据,对应用新版本的功能、性能、稳定性等指标进行评判,然后再全量升级。即使某个新版本出现问题,也只会影响已染色流量,不会将问题蔓延至整个系统,保证整个系统的正常运行。
同理,流量染色功能还可以用于大促前的性能压测。在线上压测的场景中,为了让压测数据和正式的线上数据实现隔离,常用的方法是对于消息队列,缓存,数据库使用影子的方式。这就需要流量染色的技术,带一个tag进去,说明这个请求是测试数据,还是真实数据。
此外,流量染色功能还可以用于多测试环境的治理。在大规模微服务场景下,不可能每个部门部署一套完整的环境,因为耗费的资源量实在是太大了。这时候就需要合理规划测试环境,可以建立一个基准测试环境,对应Master分支,里面部署全量的应用。每一个分支对应有更新的模块,比如说你修改了五个工程,测试的时候,不需要部署全量的应用,只需要把这五个工程去创建一个Delta测试环境就可以了。
当客户端进行测试的时候,通过流量染色标记不同的测试分支流量,将该流量路由至测试版本。当这五个服务之内相互调用的时候,微服务框架就会选择这五个服务的实例进行调用,如果需要调用五个服务之外的其他服务的时候,微服务框架会到Master环境里面,选择服务实例进行调用。有了流量染色的环境治理机制,测试环境数量会大大减少。
染色信息的传递
grpc怎么实现流量染色
依赖resolver注册组件以及balancer负载均衡组件
一.首先需要将染色信息注册到etcd等注册发现中心
ip := "127.0.0.1" // NOTE: 必须拿到您实例节点的真实IP,port := "9000" // NOTE: 必须拿到您实例grpc监听的真实端口hn, _ := os.Hostname()dis,err := etcd.New(&clientv3.Config{Endpoints:[]string{"127.0.0.1"}})if err != nil {panic(err)}ins := &naming.Instfszance{AppID: "test",Addrs: []string{"grpc://" + ip + ":" + port,},Metadata : map[string]string{"color":env.Color},}cancel, err := etcd.Register(context.Background(), ins)
完成服务注册,如test服务,如果有不同测试分支,则数据有多条,同一个appid不用addr和color
二.实现resolver组件Build方法
addrs := make([]resolver.Address, 0, len(instances))for _, ins := range instances {var rpc stringfor _, a := range ins.Addrs {u, err := url.Parse(a)if err == nil && u.Scheme == Scheme {rpc = u.Host}}addr := resolver.Address{Addr: rpc,Type: resolver.Backend,ServerName: ins.AppID,Metadata: wmeta.MD{Weight: uint64(weight), Color: ins.Metadata[naming.MetaColor]},}addrs = append(addrs, addr)}log.Info("resolver: finally get %d instances", len(addrs))r.cc.NewAddress(addrs)
主要逻辑思想为从etcd发现信息,而后更新到grpc,resolver.Address里自此存在了color信息
三.实现balancer的Build和Pick方法,从中挑选出你想要的Conn
func (*p2cPickerBuilder) Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker {p := &p2cPicker{colors: make(map[string]*p2cPicker),r: rand.New(rand.NewSource(time.Now().UnixNano())),}for addr, sc := range readySCs {meta, ok := addr.Metadata.(wmd.MD)if !ok {meta = wmd.MD{Weight: 10,}}subc := &subConn{conn: sc,addr: addr,meta: meta,svrCPU: 500,lag: 0,success: 1000,inflight: 1,}if meta.Color == "" {p.subConns = append(p.subConns, subc)continue}// if color not empty, use color pickercp, ok := p.colors[meta.Color]if !ok {cp = &p2cPicker{r: rand.New(rand.NewSource(time.Now().UnixNano()))}p.colors[meta.Color] = cp}cp.subConns = append(cp.subConns, subc)}return p
}type p2cPicker struct {// subConns is the snapshot of the weighted-roundrobin balancer when this picker was// created. The slice is immutable. Each Get() will do a round robin// selection from it and return the selected SubConn.subConns []*subConncolors map[string]*p2cPickerlogTs int64r *rand.Randlk sync.Mutex
}func (p *p2cPicker) Pick(ctx context.Context, opts balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error) {// FIXME refactor to unify the color logiccolor := nmd.String(ctx, nmd.Color)if color == "" && env.Color != "" {color = env.Color}if color != "" {if cp, ok := p.colors[color]; ok {return cp.pick(ctx, opts)}}return p.pick(ctx, opts)
}
自此则实现了根据染色信息进而路由的功能,那么最后从网关入口处根据不通的流量,标记不通的染色信息,带入go中的context,流量染色整体的功能就实现了。
grpc实现流量染色相关推荐
- “天猫双11”背后的流量治理技术与标准实践
赵奕豪(宿何):Sentinel & OpenSergo 开源项目负责人 一年一度的天猫双11已经落下帷幕,大家在疯狂买买买的过程中一定会有疑问:如何保障微服务在双十一的超级峰值下也能如丝般顺 ...
- 流量录制与回放在vivo的落地实践
一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...
- EDAS 流量入口网关最佳实践
作者:澄潭 云原生网关介绍 MSE 云原生网关是阿里云提供的下一代网关解决方案,完全兼容 Kubernetes Ingress 标准 API,将流量网关.微服务网关和安全网关三合一,解决了多层网关架构 ...
- 使用 Istio 实现非侵入流量治理
现在最火的后端架构无疑是微服务了,微服务将之前的单体应用拆分成了许多独立的服务应用,每个微服务都是独立的,好处自然很多,但是随着应用的越来越大,微服务暴露出来的问题也就随之而来了,微服务越来越多,管理 ...
- 如果你只写CRUD,那这种技术栈你永远碰不到
一.前言 写这篇文章的时候我在想可能大部分程序员包括你我,常常都在忙于业务开发或奔波在日常维护与修复BUG的路上,当不能从中吸取技术营养与改变现状后,就像一台恒定运行的机器,逃不出限定宇宙速度的一个圈 ...
- 蜕变!网易轻舟微服务这波操作,始于异构融合、源于中台!
戳蓝字"CSDN云计算"关注我们哦! 作者|刘晶晶 提及中台,无人不知.从概念诞生于阿里到如今高居神坛之上,整个行业无一不在频繁建设中,不可否认,TA带来的ICT变革远远超过了字面 ...
- ribbon 配置 动态更新_Netflix开源工具:在SpringBoot实现动态路由
前言 假设你有一个服务A,要调用服务B(有三个实例,B1.B2.B3),如何只调用其中的B1和B2,屏蔽掉B3?实际上解决方法大致分为两类. 一种是外部路由,就是通过网关等组件,在请求链路上进行路由选 ...
- 春节保卫战:腾讯百万 QPS 线上环境云压测方案解析
导语|春节期间腾讯大部分业务进入流量备战的紧张时刻.压测相比于监控而言,是更具主动性的筹备手段.通过高负载.真实流量的预演,探测系统的瓶颈和发现风险,是服务质量保障体系的重要一环.云压测主要聚焦在压测 ...
- 实现全托管,腾讯云服务网格的架构演进
导语 | 腾讯云服务网格(TCM)作为一个兼容 isito 的服务网格平台,已经在腾讯内外部有诸多落地案例.本文是对腾讯云高级工程师钟华.苗艳强在云+社区沙龙online的分享整理,深度解析服务网格架 ...
- 架构师图谱之微服务消息队列
更多内容关注微信公众号:fullstack888 概述 "架构师图谱"是一个很宏大的命题,特别是优秀的架构师自身也是"由点到面再到图",一点点成长积累起来,尝试 ...
最新文章
- hdu-1847-畅桶工程续
- STM32F030 ADC1的DMA采样问题
- Python 优先级
- 单调栈之Next Greater Number
- 大数据之-Hadoop之HDFS_合并FsImage和Edits文件_之CheckPoint时间设置---大数据之hadoop工作笔记0072
- 解读Scorm(0):标准
- Go 用JSON加载表格数据
- WCF Service Configuration Editor的使用
- 定时器和promise_如何讲清楚Promise?
- 计算机大学生职业规划书word模板,大学生职业规划书范文word模板
- 计算机技术应用于测量,在测量绘图中计算机技术应用探析.doc
- 神武3登录显示未能成功连接服务器,T3安装成功后,点击运行显示登录界面,但提示“检测公共组件Protal。exe时未能通过,公共组件可能被破坏”,和”无法连接服务器“。应该怎么处理?求助!...
- 修复0xc0000034的经历
- 计算机程序中的堆和栈的区别,内存中的堆与栈(stack)和栈的区别
- 中科大计算机科学技术导师周,中国科技大学计算机科学与技术学院导师教师师资介绍简介-周学海...
- 分布式技术高频面试考点梳理
- Xceed Words for .NET转换和页眉/页脚功能
- UCK全球路演走进佛山,跨链技术将加速区块链商业应用
- ArcGIS for Js Graphic、GraphicLayer、Geometry、(Point,Line,Polygon)、Rings(Coordinates)之间的关系
- DirectShow AVI 文件操作【转】