什么是流量染色

流量染色是指根据流量协议设置对应的流量染色规则,对指定的流量进行染色标记,并在整个调用链中携带该标记。通过染色流量可以对特定的流量进行跟踪和路由,所以流量染色功能常被用于灰度发布的场景。在业务系统迭代过程中会不断有新版本发布,在正式发布前,可以使用流量染色控制先进行小规模验证,通过收集使用体验的数据,对应用新版本的功能、性能、稳定性等指标进行评判,然后再全量升级。即使某个新版本出现问题,也只会影响已染色流量,不会将问题蔓延至整个系统,保证整个系统的正常运行。

同理,流量染色功能还可以用于大促前的性能压测。在线上压测的场景中,为了让压测数据和正式的线上数据实现隔离,常用的方法是对于消息队列,缓存,数据库使用影子的方式。这就需要流量染色的技术,带一个tag进去,说明这个请求是测试数据,还是真实数据。

此外,流量染色功能还可以用于多测试环境的治理。在大规模微服务场景下,不可能每个部门部署一套完整的环境,因为耗费的资源量实在是太大了。这时候就需要合理规划测试环境,可以建立一个基准测试环境,对应Master分支,里面部署全量的应用。每一个分支对应有更新的模块,比如说你修改了五个工程,测试的时候,不需要部署全量的应用,只需要把这五个工程去创建一个Delta测试环境就可以了。

当客户端进行测试的时候,通过流量染色标记不同的测试分支流量,将该流量路由至测试版本。当这五个服务之内相互调用的时候,微服务框架就会选择这五个服务的实例进行调用,如果需要调用五个服务之外的其他服务的时候,微服务框架会到Master环境里面,选择服务实例进行调用。有了流量染色的环境治理机制,测试环境数量会大大减少。

染色信息的传递

给入站请求绑定上下文(如: http header), in-process 使用 context 传递,跨服务使用 metadata 传递在这个架构中每一个基础组件都能够理解染色信息,并且能够基于染色路由隔离流量

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实现流量染色相关推荐

  1. “天猫双11”背后的流量治理技术与标准实践

    赵奕豪(宿何):Sentinel & OpenSergo 开源项目负责人 一年一度的天猫双11已经落下帷幕,大家在疯狂买买买的过程中一定会有疑问:如何保障微服务在双十一的超级峰值下也能如丝般顺 ...

  2. 流量录制与回放在vivo的落地实践

    一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...

  3. EDAS 流量入口网关最佳实践

    作者:澄潭 云原生网关介绍 MSE 云原生网关是阿里云提供的下一代网关解决方案,完全兼容 Kubernetes Ingress 标准 API,将流量网关.微服务网关和安全网关三合一,解决了多层网关架构 ...

  4. 使用 Istio 实现非侵入流量治理

    现在最火的后端架构无疑是微服务了,微服务将之前的单体应用拆分成了许多独立的服务应用,每个微服务都是独立的,好处自然很多,但是随着应用的越来越大,微服务暴露出来的问题也就随之而来了,微服务越来越多,管理 ...

  5. 如果你只写CRUD,那这种技术栈你永远碰不到

    一.前言 写这篇文章的时候我在想可能大部分程序员包括你我,常常都在忙于业务开发或奔波在日常维护与修复BUG的路上,当不能从中吸取技术营养与改变现状后,就像一台恒定运行的机器,逃不出限定宇宙速度的一个圈 ...

  6. 蜕变!网易轻舟微服务这波操作,始于异构融合、源于中台!

    戳蓝字"CSDN云计算"关注我们哦! 作者|刘晶晶 提及中台,无人不知.从概念诞生于阿里到如今高居神坛之上,整个行业无一不在频繁建设中,不可否认,TA带来的ICT变革远远超过了字面 ...

  7. ribbon 配置 动态更新_Netflix开源工具:在SpringBoot实现动态路由

    前言 假设你有一个服务A,要调用服务B(有三个实例,B1.B2.B3),如何只调用其中的B1和B2,屏蔽掉B3?实际上解决方法大致分为两类. 一种是外部路由,就是通过网关等组件,在请求链路上进行路由选 ...

  8. 春节保卫战:腾讯百万 QPS 线上环境云压测方案解析

    导语|春节期间腾讯大部分业务进入流量备战的紧张时刻.压测相比于监控而言,是更具主动性的筹备手段.通过高负载.真实流量的预演,探测系统的瓶颈和发现风险,是服务质量保障体系的重要一环.云压测主要聚焦在压测 ...

  9. 实现全托管,腾讯云服务网格的架构演进

    导语 | 腾讯云服务网格(TCM)作为一个兼容 isito 的服务网格平台,已经在腾讯内外部有诸多落地案例.本文是对腾讯云高级工程师钟华.苗艳强在云+社区沙龙online的分享整理,深度解析服务网格架 ...

  10. 架构师图谱之微服务消息队列

    更多内容关注微信公众号:fullstack888 概述 "架构师图谱"是一个很宏大的命题,特别是优秀的架构师自身也是"由点到面再到图",一点点成长积累起来,尝试 ...

最新文章

  1. hdu-1847-畅桶工程续
  2. STM32F030 ADC1的DMA采样问题
  3. Python 优先级
  4. 单调栈之Next Greater Number
  5. 大数据之-Hadoop之HDFS_合并FsImage和Edits文件_之CheckPoint时间设置---大数据之hadoop工作笔记0072
  6. 解读Scorm(0):标准
  7. Go 用JSON加载表格数据
  8. WCF Service Configuration Editor的使用
  9. 定时器和promise_如何讲清楚Promise?
  10. 计算机大学生职业规划书word模板,大学生职业规划书范文word模板
  11. 计算机技术应用于测量,在测量绘图中计算机技术应用探析.doc
  12. 神武3登录显示未能成功连接服务器,T3安装成功后,点击运行显示登录界面,但提示“检测公共组件Protal。exe时未能通过,公共组件可能被破坏”,和”无法连接服务器“。应该怎么处理?求助!...
  13. 修复0xc0000034的经历
  14. 计算机程序中的堆和栈的区别,内存中的堆与栈(stack)和栈的区别
  15. 中科大计算机科学技术导师周,中国科技大学计算机科学与技术学院导师教师师资介绍简介-周学海...
  16. 分布式技术高频面试考点梳理
  17. Xceed Words for .NET转换和页眉/页脚功能
  18. UCK全球路演走进佛山,跨链技术将加速区块链商业应用
  19. ArcGIS for Js Graphic、GraphicLayer、Geometry、(Point,Line,Polygon)、Rings(Coordinates)之间的关系
  20. DirectShow AVI 文件操作【转】

热门文章

  1. QBadgeView小红点的简单使用
  2. python爬取ZOL高清壁纸
  3. 卫星遥感影像查询网址
  4. C++自学历程——启程篇
  5. 笔记本连接无线网络后通过有线网口共享网络
  6. 直流屏电源模块GF22007-2高频充电模块R22007
  7. MTTR、MTBF、MTTF、可用性、可靠性傻傻分不清楚?
  8. 大白话C++:新手入门教程(附源码及详解、视频课程资料推荐)
  9. 计算机房属于学校场馆吗,校园常见火灾的预防和逃生安全知识
  10. Golang chan的任务分发和优雅退出