c++ 使用nacos_为什么选用Nacos?虎牙直播微服务改造实践

原标题:为什么选用Nacos?虎牙直播微服务改造实践

相比文字和图片,直播提供了人与人之间更丰富的沟通形式,其对平台稳定性的考验很大,那么倡导“以技术驱动娱乐”的虎牙直播如何在技术上赋能娱乐?

本文将分为如下几个部分介绍虎牙在 DNS、服务注册、CMDB 和服务配置中心等方面的实践:

为什么选用 Nacos

DNS-F 的技术价值和应用场景

服务注册的实践

CMDB 的应用和实践

服务配置的实践

Nacos 改造和升级总结

为什么选用 Nacos

虎牙关注 Nacos 是从 v0.2 开始的(最新版本:Pre-GA v0.8),我们也参与了社区的建设,可以说是比较早期的企业用户。

Nacos 是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态 DNS 服务三大功能。

首先,在虎牙的微服务场景中,起初有多个注册中心,每一个注册中心服务于某一部分微服务,缺少一个能融合多个注册中心,并把他们逐一打通,然后实现一个能管理整个微服务体系的大的注册中心。

以下内容摘自我们考虑引入 Nacos 时,在服务注册中心方案上的选型对比:

Nacos 提供 DNS-F 功能, 可以与 K8S、Spring Cloud 和 Dubbo 等多个开源产品进行集成,实现服务的注册功能。

其次,在服务配置中心方案的选型过程中,我们希望配置中心和注册中心能够打通,这样可以省去我们在微服务治理方面的一些投入。

因此,我们也同步比较了一些服务配置中心的开源方案:

例如 Spring Cloud Config Server、Zookeeper 和 ETCD,总体评估下来,基于我们微服务体系现状以及业务场景,我们决定使用 Nacos 作为我们服务化改造中服务注册和服务发现的方案。

使用过程中,我们发现,随着社区版本的不断更新和虎牙的深入实践,Nacos 的优势远比我们调研过程中发现的更多。

接下来,我将围绕 DNS-F、Nacos-Sync、 CMDB 和负载均衡四个方面来分享虎牙的实践。

DNS-F 的技术价值和应用场景

DNS-F 的技术价值

Nacos 提供的 DNS-F 功能的第一个技术价值在于,弥补了我们内部微服务没有一个全局动态调度能力的空白。

刚才提到,虎牙有多个微服务体系,但并没有一个微服务具备全局动态调度的能力,因为它们各自都是独立的。

目前,我们通过 Nacos 已经融合了四个微服务体系的注册中心,最终目标是把所有的微服务都融合在一起,实现全局动态调动的能力。

第二,DNS-F 解决了服务端端到端面临的挑战,即延时大、解析不准、故障牵引慢的问题。

如何去理解呢?当内部有多个微服务体系的时候,每一个体系的成熟度是不同的。

例如,有一些微服务框架对同机房或 CMDB 路由是不支持的,当一个服务注册到了多个 IDC 中心,去调用它的服务的时候,即便是同机房,也可能调用到一个不是同机房的节点。

这样就会无端的造成服务的延时和解析不准。即使我们基于 DNS 做一些解析的优化,但仍然无法完全解决服务的延时和解析不准。

这是因为 DNS 都是 IP 策略的就近解析,无法根据服务的物理状态、物理信息进行路由。

此外,当一个核心服务出现问题,如果缺少一个融合了多个调用方和被调用方的信息的统一的注册中心,就很难去准确判断如何去牵引,从而导致故障牵引慢。

有了 Nacos 后,就可以接入一个统一的注册中心以及配置中心,去解决这些问题。(目前,虎牙还在微服务体系的改造过程中,未完全实现统一的注册中心)

第三,提供专线流量牵引能力。虎牙的核心机房的流量互通,是使用专线来实现的。专线的特性就是物理建设的,而且我们的专线建设可能不像 BAT 那么大。

例如我们专线容量的冗余只有 50%,假设某个直播异常火爆,突发流量高于平常的两百倍,超过了专线的建设能力,这时候一个服务就有可能会导致全网故障。

但是,通过全局的注册中心和调动能力,我们就可以把流量牵引到其他地方,例如迁移到公网,甚至牵引到一个不存在的地址,来平衡一下。即便某个服务出现问题,也不会影响我们的全局服务。

第四,支持服务端的多种调度需求,包括同机房路由、同机器路由,以及同机架路由,Nacos 都可以去做适配。

此外,基于 Nacos 的 DNS-F 功能,我们还实现了加速外部域名解析和服务故障牵引秒级生效。

DNS-F 的应用场景

这张图是 Nacos DNS-F 的一个具体实现,实际上是拦截了 OS 层的 DNS 请求。

如果经过 DNS 的域名是内部服务,它就会从 Nacos Server 获取结果,如果不是,就会转发到其它的 LocalDNS 进行解析。

以数据库高可用的应用场景为例,我们的数据库切换效率比较低,依赖业务方修改配置,时效不确定,通常需要 10 分钟以上(备注:我们的数据库实际上已经实现了主备的功能,但当一个主服务出现问题的时候,总是要去切换IP。)切换 IP 的过程中,依赖运维和开发的协作,这是一个比较长的过程。

引入 DNS 后,当主出现问题的时候,就可以很快的用另外一个主的 IP 来进行替换,屏蔽故障,而且节点的故障检测和故障切换都可以自动完成,并不依赖运维和开发的协作,节省了时间。

当然,这个场景的解法有很多,比如说使用 MySQL - Proxy 也可以去解这个问题,但我们的 MySQL - Proxy 还在建设中,想尽快的把这个问题解决,所以采用了 DNS 的方式。

下面我们再着重分享下基于 DNS-F 对 LocalDNS 的优化。虎牙还没有去建设自己的 LocalDNS,大部分使用的是一些公共的 DNS,大致有以下这些组成。

这种组成方式会存在一个问题:假设服务突然一下崩溃后,之后服务又马上正常了,这种情况我们无法重现去找到崩溃原因。

因为很多场景下,是一个公共 DNS 的请求超时导致的,甚至一个解析失败导致的,在那一刻,因为无法保留现场的,所以就发现不了问题。

以我们的监测数据来看,DNS 解析错误的比例达到 1% 左右,超时比例将更高。

意思是在使用公共 DNS 的情况下,服务有 1% 的几率是会超时或失败,如果服务没有做好容错,就会出现异常。

同时,一些公共 DNS 解析的延时都是不定的,比如在亚马逊上一些比较不好的节点,它的延时会比较高,平均超过三四十毫秒。

然后我们基于 DNS-F 对 LocalDNS 做了一些优化,优化结果如下:

平均解析时间从之前的超过两百毫秒降低到两毫秒以下。

缓存命中率从 92% 提升到了 99% 以上。

解析失败率之前是 1%,现在基本上没有了。

优化的效果也体现在我们的风控服务上,平均延迟下降 10ms,服务超时比例下降 25%,降低了因延迟或服务超时导致的用户上传的图片或文字违规但未被审核到的风险。

服务注册的实践

虎牙的核心业务是跑在 Tars(腾讯开源的一款微服务框架) 上的。

Tars 主要是支持 C++,但对 Java、PHP 等开发语言的支持力度比较差,这就使得我们非 C++ 的业务方去调用它就会很别扭。

引入 Nacos 以后,我们通过 Nacos 支持的 DNS 协议来实现服务发现过程中对全语言的支持。

当然,Nacos 不只是一个注册中心,它具备了融合多个数据中心的能力,支持多数据源的同步。

例如,我们目前已经支持了 Taf(虎牙内部的一个重要微服务体系)、Nacos 自身、ZooKeeper、以及 K8S 上一些服务注册的同步。

同时,基于 Nacos 集群的双向同步功能(Nacos-Sync),我们实现了国内的两个可用区,以及国外的多个可用区之间的数据值同步,最终实现了一处注册、多地可读。

Nacos-Sync 是事件机制,即同步任务通过事件触发,可以灵活地开启和关闭你要同步的任务,然后根据服务变化事件触发监听,保证实时性,最后通过定时的全量突发同步事件,保证服务数据的最终一致。

同时,Nacos-Sync 也支持服务心跳维持,即多个数据中心的心跳,可以使用 Nacos-Sync 代理来实现远端同步。此外,也支持心跳与同步任务绑定,便于灵活控制。

由于 Taf 上有数万个注册服务,同步的量特别大,所以我们在 Nacos-Sync 做了一些改造,通过任务分片来实现数万服务同步的可用性保障。

改造步骤是先以服务为粒度定义任务,然后在多个分片上分散任务负载,最后以单分片多副本来保证任务可用性。

对接 CMDB,实现就近访问

在服务进行多机房或者多地域部署时,跨地域的服务访问往往延迟较高,一个城市内的机房间的典型网络延迟在 1ms 左右,而跨城市的网络延迟,例如上海到北京大概为 30ms。

此时自然而然的一个想法就是能不能让服务消费者和服务提供者进行同地域访问。

Nacos 定义了一个 SPI 接口,里面包含了与第三方 CMDB 约定的一些方法。

用户依照约定实现了相应的 SPI 接口后,将实现打成 Jar 包放置到 Nacos 安装目录下,重启 Nacos 即可让 Nacos 与 CMDB 的数据打通。

在实际的落地过程中,我们是在 DNS-F 接入 Taf,在 DNS-F 上实现 Taf 的中控接口,无缝对接 Taf 的 SDK。

DNS-F 提供缓存负载均衡和实例信息,Nacos 则提供负载均衡信息的查询接口。

服务配置的实践

虎牙的域名(www.huya.com)会接入华南、华中、华北多个 IDC 机房,每个机房都会建设一个 Nginx 去做负载均衡,经过负载均衡的流量会通过专线返回到我们的后端服务器上。

在这个过程中,如果我们去修改一个在中间的配置,需要下发到多个机房的上百个负责负载均衡的机器上。

如果出现配置下发不及时,或下发配置失败,极大可能会出现故障,同时,负责均衡服务的机器对弹性能力的要求较高,在业务高峰如果不能快速扩容,容易出现全网故障。

传统的配置下发方式是通过服务端下发文件更新配置,更新配置生效时间长,由于需要预先知道负责均衡集群的机器信息,扩缩容需要等元信息同步以后才能接入流量,扩容流量的接入时间较长。

引入 Nacos 后,我们采用了配置中心监听方式,通过客户端主动监听配置更新,配置便可秒级生效,新扩容服务主动拉取全量配置,流量接入时长缩短 3 分钟+。

Nacos 改造和升级总结

引入 Nacos 的过程中,我们所做的改造和升级总结如下:

①在 DNS-F 上,我们增加了对外部域名的预缓存的支持,Agent 的监控数据对接到公司的内部监控,日志输出也对接到内部的日志服务,然后和公司的 CMDB 对接,并实现了 DNS-F Cluster 集群。

我们之所以去构建一个 DNS-FCluster 集群,是为了避免内存、硬盘或版本问题导致的 DNS 服务无效,有了 DNS-F Cluster 集群,当本地 Agent 出现问题的时候,就可以通过集群去代理和解析 DNS 请求。

②在 Nacos-Sync 上,我们对接了 TAF 注册服务和 K8S 注册服务,以及解决了多数据中心环形同步的问题。

③在 Nacos CMDB 上,我们对 Nacos CMDB 进行了扩展,对接了虎牙自己的 CMDB,并对接了内部的负载均衡策略。

作者:张波

简介:张波,社区 ID:zhangjimmy,Nacos Committer,虎牙基础保障部中间件团队负责人,阿里云 MVP。

编辑:陶家龙、孙淑娟

出处:本文转自阿里巴巴中间件(ID:Aliware_2018)微信公众号,文章整理自虎牙基础保障部中间件团队负责人张波在 Dubbo Meetup 广州站沙龙上的分享。返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

three.js 拖动场景中物体(原生|拖拽控制器)

非控制器版 拖动场景中的物体实际上是在一个平行于窗口的平面中进行拖动&#xff0c;确定这个平面并确定鼠标在该平面中的位置变化&#xff0c;就将问题转换成简单的2d移动物体了 <!DOCTYPE html> <html> <head><meta charsetutf-8><title>015-…

bch纠错码 码长8_从HDMI视频数据带有BCH纠错码讨论线材对画质的影响

一直感觉几十元的HDMI线已经可以正常传输视频信号,那么几百元应该是接近完美了,再听人说换上几千块的线就让画质黑位什么的提升一大截,认为非常不可思议.但别人又信誓旦旦的说自己是感觉到了明显改变,对这种情况产生的争论最终不会得到正确答案,所以数据党还是从科学的角度先分…

element-ui 可复选树型表格

效果 思路 自定义模板当点击某个行复选框时&#xff0c;其所有后代复选框都要同步状态&#xff0c;且其直系父辈状态需要根据所点击复选框的状态来修正点击全选复选框时&#xff0c;批量同步所有行内复选框状态 代码 非封装组件&#xff0c;按需自行改写 确保引入element-ui…

linux 删除含有关键词的文件_linux下查找包含关键字的文件

在linux下如果要查找包含某个关键字的文件&#xff0c;如要在nagios目录下搜索带有关键字“store-rd-sys”的文件&#xff0c;在终端下运行命令&#xff1a;/usr/local/nagios/etc/* (nagios目录)法1&#xff1a;grep -r “关键字” 路径[rootnagios01 ~]#grep -r "store-…

树形可拖拽排序配置组件

效果 使用场景 vue2下自定义表格表头配置: 列排序&#xff0c;显示/隐藏等。确保表头以配置项的形式加载&#xff0c;这样表格才能对修改后的配置作响应 思路 1、表格使用render函数加载(如有疑问可私信)&#xff0c;通过类似如下的columns配置表头 columns: [{ label: 姓名…

maven 打包指定依赖包_Maven打包成Jar文件时依赖包的问题

我们项目中使用到第三方的库文件&#xff0c;这些jar库文件并没有放到Maven中央库上&#xff0c;导致我们需要在项目中自己配置使用。我们的两三个开发人员对Java都是很熟&#xff0c;因此在使用中遇到了一些问题&#xff0c;表现在&#xff1a;在本地中引入第三方jar包后&…

自适应浮动表单填充布局脚本

效果 1、适合搜素表单布局&#xff0c;查询重置等功能块始终位于最后一行的最后一列 2、适合普通多行两端对齐&#xff0c;未填充满的行左对齐 思路 此脚本目的为实现整齐风格的表单布局&#xff0c;为了达到整齐的效果&#xff0c;每个表单元素或者块都要设置一致的 宽度…

rstudio导入txt文件_R语言 | 读写txt、csv、excel文件

前段时间看到plotnine库(封装的R语言ggplot2)作的图太美了&#xff0c;有点想重新拾起R语言^_^R语言代码略带凌乱&#xff0c;讲真的还是更喜欢Python代码简洁。不过好几年不琢磨R语言&#xff0c;对R语言代码的凌乱美有些新奇&#xff0c;很好玩&#xff0c;这也许就是久别胜新…

erp采购总监个人总结_erp采购总监总结.docx

erp采购总监总结ERP沙盘模拟心得体会——采购总监  刚开始接触ERP&#xff0c;就从学长们那里了解到这门课比较有意思&#xff0c;然后又听老师说我们还有一个为期两周的ERP沙盘模拟&#xff0c;这让我对这门课更有了极大的兴趣。一直期待着沙盘模拟对抗早点到来&#xff0c;…

矩阵字符串配置任意合并表格布局

效果 核心 布局配置矩阵&#xff08;以下为多个模式),可以使用|或\n表示矩阵行 const gridArr [1,2,a,b 3,4,a,b 5,6,a,b ,1,2 3,4 5,6 ,1,2,3,4 3,4]任意横向或者纵向相同的字符表示一个合并块 使用 <CalcTable grid"1,2,a,b|3,4,a,b|5,6,a,b" ><span…

django 套vue 模板_Vue admin template + Django 快速进行Web开发

本文教大家如何使用Vue admin template和Django快速进行Web开发&#xff0c;旨在帮助我们使用现有的工具、框架及开源UI&#xff0c;让我们在基础较为薄弱的情况下&#xff0c;能进行Web开发。本文不会介绍过多的原理&#xff0c;实践为主。Vue admin template的简单使用Vue ad…

js浮点运算式

结果 calc(0.23*-0.03(4*0.2)) >0.7931 代码 //加|减|乘|除 浮点运算 const floatMulti (a, b) > {let m 0, s1 a.toString(), s2 b.toString(), s1l s1.split(.)[1], s2l s2.split(.)[1]m (s1l ? s1l.length : 0) (s2l ? s2l.length : 0)return Number(s1…

悬浮球多功能_一个悬浮球,怎么可以这么贴心~

原标题&#xff1a;一个悬浮球&#xff0c;怎么可以这么贴心~一个悬浮球 满足你N个愿望※ 专题&#xff5c;图文&#xff5c;悬浮球上手指南这个小蛋蛋是不少小朋友喜爱的零食&#xff0c;因为它能满足小朋友好几个愿望&#xff0c;能吃又能玩的零食哪个小朋友会不喜欢&#xf…

python 字典添加元素乱序了_Python有序字典的两个小“惊喜”

从 Python 3.6 开始&#xff0c;常规的字典会记住其插入的顺序&#xff1a;就是说&#xff0c;当遍历字典时&#xff0c;你获得字典中元素的顺序跟它们插入时的顺序相同。在 3.6 之前&#xff0c;字典是无序的&#xff1a;遍历顺序是随机的。关于有序字典&#xff0c;这里有两件…

el-table跨页选中

以id作为唯一标识 模板 <el-table :data"data" ref"table"select-all"selectAll"select"select"style"width:100%"><el-table-column type"selection"></el-table-column><el-table-colum…

bsc是指什么_为什么KPI令人厌恶?中小企业不要乱用KPI!

私信小编“绩效”两字&#xff0c;免费发送60分钟薪酬绩效管理内部培训视频。导读现在很多的企业都会对员工做一些绩效考核&#xff0c;大多数还是采用KPI的方式。但是员工对KPI的考核越来越反感&#xff0c;甚至出现抵触的情况。为什么会出现这种想象呢&#xff1f;其实很简单…

js原生popup_JavaScript的popup框

确认框用于使用户可以验证或者接受某些信息。当确认框出现后&#xff0c;用户需要点击确定或者取消按钮才能继续进行操作。如果用户点击确认&#xff0c;那么返回值为 true。如果用户点击取消&#xff0c;那么返回值为 false。语法&#xff1a;confirm("文本")functi…

解决微信小程序 [Component] slot ““ is not found.

解决方式 当使用自定义组件或者slot标签作为组件A的插槽内容时&#xff0c;在组件A中必须定义一个默认插槽&#xff0c;对普通view等标签无限制。且因为wx:if为false的插槽等同没有定义 场景复现&#xff08;仅以自己遇到情况为例&#xff09; 1、调试基础库2.19.4 2、使用w…

列表排序应用FLIP动画(vue)

效果 原理详解 链接 1.beforeUpdate 获取first 变化前位置 (以id建立map映射) 2.updated 获取变化后位置 last 3.禁用transition并transform元素回初始位置 4.异步恢复transition 并取消 transform 代码 <template><div ref"container"><div style&…