当前位置: 首页 > news >正文

虎牙直播在微服务改造的实践总结

博主介绍:✌全网粉丝4W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅开源项目免费哦:点击这里克隆或者下载 ,已经发布Vue3版   🍅

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》

uniapp小程序《100套》

目录

一、为什么选择Nacos

二、DNS-F的技术价值

三、DNS-F的应用场景

四、DNS-F在数据库场景的落地

💖微服务实战


一、为什么选择Nacos

虎牙关注 Nacos 是从 v0.2 开始的,也参与了社区的建设,可以说是最早期的企业用户。

在虎牙的微服务场景中,原先存在多个注册中心,每个注册中心服务于不同的微服务部分,导致缺少一个能够整合这些注册中心,并将它们逐一打通的大型注册中心来管理整个微服务生态系统。因此,考虑使用Nacos作为服务注册中心,以下是考虑使用Nacos的原因:
1. 相比其他方案,Nacos可以与多个开源产品集成,例如k8s,spring cloud和dubbo, 并使用dns-f作为agent,因此不需要额外的配置或本地安装agents或SDK。
2. Tseer Agent, Consul等方案需要本地安装agents或SDK,且他们仅仅提供限定的接口,因此,它们不太适合支持不同的开源产品。
3. K8s使用coreDNS来查询IP地址,但为集群配置单个DNS,因此无法管理整个微服务生态系统,而Nacos则可以用来管理整个微服务生态系统。
4. Spring Cloud的大部分功能需要深度集成SDK中才能实现,这使得它难以支持其他语言。
5. L5是腾讯内部的服务发现方案,同样需要本地安装L5 agent,向L5 DNS获取到服务数据,因此也不能适应不同的开源产品。 综上,我们认为使用Nacos作为服务注册中心是一个非常好的选择,因为它可以通过dns-f作为agent,并且支持多种开源产品的集成,同时也为提供了一个管理整个微服务生态系统的中心。

心。

Nacos支持DNS-F功能,可以集成多个开源产品(如K8S、Spring Cloud和Dubbo)以实现服务的注册。在选择服务配置中心方案时,希望能够打通配置中心和注册中心,以省去在微服务治理方面的投入。因此,还比较了几个服务配置中心的开源方案

在当前技术发展的背景下,许多开发者都在关注和探索不同的配置中心(Configuration Center),如Nacos、Spring Cloud Config Server、ZooKeeper和Etcd等。这些工具通过提供一个中心化存储器和API接口,使得配置修改、版本管理和配置推送等功能变得更加高效。 虽然这些配置中心都有着其独特的优势,但是它们同时也存在一些不同的缺点。
下面将这些配置中心进行优缺点对比:
- Nacos: Nacos提供一个直接在控制台上进行配置修改的功能,并且修改的配置能够自动推送到监听的客户端。同时,它还支持多种API接口(RESTful API,Java Native接口,Spring Cloud接口等),并且能够自动记录各个修改的版本信息,便于追踪和管理。总的来说,Nacos具有易用性高、扩展性强、功能丰富等特点。
- Spring Cloud Config Server: Spring Cloud Config Server需要使用Git仓库进行配置修改,并且客户端只能在启动的时候加载。虽然它也支持多种API接口和其他语言客户端,但是在版本管理方面相对比较弱。总的来说,Spring Cloud Config Server适用于Web应用程序,特别是基于Spring的应用程序。
- ZooKeeper: ZooKeeper是一个支持Java原生接口的配置中心,同时提供配置自动推送的功能。但是,它没有自动记录版本信息和配置推送历史等功能,需要通过调用ZK API进行相应的修改。总的来说,ZooKeeper适用于分布式系统的管理和控制。
- Etcd: Etcd通过提供RESTful API进行配置修改,并且修改的配置能够自动推送到监听的客户端。但是,它也没有自动记录版本信息和配置推送历史等功能,且也需要通过调用来Etcd API进行相应的修改。总的来说,Etcd适用于基于容器的云原生应用程序和大规模分布式系统。 基于以上对比和综合分析,建议选择Nacos作为配置中心。因为它不仅易于使用和扩展,而且具有较强的版本管理和配置推送追踪能力,适合各种类型的应用程序
针对微服务体系现状以及业务场景,在诸多可选服务注册和服务发现的方案中,综合对比了Spring Cloud Config Server、Zookeeper 和 ETCD,最终选择了Nacos。在使用过程中,发现Nacos的优势远比调研过程中发现的更多。下面,将以DNS-F、Nacos-Sync、CMDB 和负载均衡为例,分享虎牙的实践

二、DNS-F的技术价值

Nacos提供的DNS-F功能带来的技术价值有以下四个方面。
首先,DNS-F功能填补了内部微服务缺乏全局动态调度能力的空白。相比之下,多个微服务体系之间缺乏独立和协同操作能力,需要借助Nacos来融合注册中心以使微服务体系之间实现全局动态调度。
其次,DNS-F解决了服务端内部面临的挑战,包括延时、解析不准和故障牵引慢的问题。在具体应用时,一些微服务框架并不支持同机房或者CMDB路由。在一个服务被注册到多个IDC中心后,即使在同一机房内,也可能调用不同机房的节点,导致无端延迟和解析不准。即使在DNS解析优化之后,也不可能解决全部 延时和解析不准问题,因为DNS只是IP策略的近地解析,并不能根据服务的物理状态和物理信息进行路由,同时缺乏统一的注册中心,当核心服务出现异常问题时,难以准确判断如何进行故障牵引,从而导致故障牵引慢。连接Nacos的全局注册中心和配置中心可以解决这些问题。(目前,虎牙还在微服务体系的改造过程中,未完全实现统一的注册中心)
第三,DNS-F功能提供了专线流量牵引能力,解决了核心机房流量互通的问题。专线特有的物理建设特性和专线容量的冗余只有50%的情况下,某个服务可能出现突发流量大于平时两百倍的情况,超出专线的建设能力,从而可能导致全网故障。但是,通过Nacos的全局注册中心和调度能力,可以将流量牵引到其他地方,例如迁移到公网或者牵引到一个不存在的地址来平衡流量。某个服务出现问题,也不会影响全局服务。
第四,DNS-F功能支持服务端的多种调度需求,包括同机房路由、同机器路由,以及同机架路由。同时,基于Nacos的DNS-F功能,还实现了外部域名解析的加速和服务故障牵引的秒级生效。

三、DNS-F的应用场景

该图描绘了 Nacos DNS-F 的实际运作。它通过拦截 OS 层的 DNS 请求来处理域名。当 DNS 请求的域名属于内部服务时,Nacos DNS-F会从 Nacos Server 获取结果。如果域名并非内部服务,Nacos DNS-F 将会将其转发给其他 LocalDNS 完成解析。

四、DNS-F在数据库场景的落地

以数据库高可用的应用场景为例,数据库切换效率较低,依赖业务方手动修改配置,时效不确定,通常需要10分钟以上。尽管数据库已经实现了主备功能,但当主服务出现问题而需切换IP时,仍需要时间与运维和开发协作。 为了解决这个问题,我们引入DNS技术。DNS可快速使用备用主机的IP地址进行切换,屏蔽故障,同时自动实现故障检测和故障切换,无需运维和开发协作,节省宝贵时间。此外,也可使用MySQL-Proxy等其他场景适用的解法,但MySQL-Proxy还在建设中,使用DNS技术是目前最为合适的解决方案。 最后,分享基于DNS-F对LocalDNS的优化。目前还没有建设自己的LocalDNS,而是使用公共的DNS,大致有以下组成部分。

在应用程序中,使用公共 DNS 能够带来某些好处。然而,这种组成方式存在一个问题:如果服务突然崩溃然后又马上恢复,我们将无法重现崩溃原因。这是因为在许多情况下,请求超时或解析失败是由公共 DNS 引起的。由于无法保留现场信息,导致难以发现问题。 根据我们的监测数据,使用公共 DNS时,DNS 解析错误率约为1‰,而超时比例则更高。这意味着如果服务没有做好容错处理,服务会出现异常。值得注意的是,许多公共 DNS 解析节点的延迟是不稳定的,导致解析延迟相差较大。比如在亚马逊上部分不良节点,解析延迟平均超过三四十毫秒。

为了优化使用公共 DNS 所带来的问题,我们针对本地DNS基于DNS-F进行了一系列优化。
优化效果如下:
● 平均解析时间从之前超过两百毫秒降低至两毫秒以下;
● 缓存命中率从92%提升至99%以上;
● 解析失败率之前为1‰,现在基本上没有了。
这些优化效果还体现在我们的风控服务上。平均延迟与异常比例分别降低了10毫秒和25%,有效降低了因延迟或服务超时导致用户上传的图片或文字违规事件。

💖微服务实战

✨【微服务】SpringCloud的OpenFeign与Ribbon配置

✨集Oauth2+Jwt实现单点登录

✨Spring Cloud Alibaba微服务第29章之Rancher

✨Spring Cloud Alibaba微服务第27章之Jenkins

✨Spring Cloud Alibaba微服务第24章之Docker部署

✨Spring Cloud Alibaba微服务第23章之Oauth2授权码模式

✨Spring Cloud Alibaba微服务第22章之Oauth2

✨Spring Cloud Alibaba微服务第21章之分布式事务

✨Spring Cloud Alibaba微服务第18章之消息服务

✨Spring Cloud Alibaba微服务第16章之服务容错

✨Spring Cloud Alibaba微服务第14章之分库分表

✨Spring Cloud Alibaba微服务第11章之MyBatis-plus

✨Spring Cloud Alibaba微服务第8章之OpenFeign

✨Spring Cloud Alibaba微服务第7章之负载均衡Ribbon

✨SpringCloud Alibaba微服务第6章之Gateway

✨SpringCloud Alibaba微服务第4章之Nacos

✨SpringCloud Alibaba微服务开篇

相关文章:

虎牙直播在微服务改造的实践总结

博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程,博主也曾写过优秀论文,查重率极低,在这方面…...

设置线程池的大小

线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。在代码中通常不会固定线程池的大小,而应该通过某种配置机制来提供,或者根据Runtime. availableProcessors来动态计算。 幸运的是,要设置线程池的大小也并不困难,只需要避免“过大”和“过…...

Vue3 除了 keep-alive,还有哪些实现页面缓存的方法

有这么一个需求:列表页进入详情页后,切换回列表页,需要对列表页进行缓存,如果从首页进入列表页,就要重新加载列表页。 对于这个需求,我的第一个想法就是使用keep-alive来缓存列表页,列表和详情…...

JavaScript闭包

定义 定义:在计算机科学中,闭包(Closure)是一个函数及其相关引用环境组合而成的实体。简单来说,闭包是指一个函数以及该函数访问的外部变量的集合。在一些编程语言中,函数可以访问在其定义时所处的上下文中…...

华为OD机试之不含101的整数(Java源码)

不含101的数 题目描述 小明在学习二进制时,发现了一类不含 101的数,也就是: 将数字用二进制表示,不能出现 101 。 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个二进制不含 101 的整数? 输入描述…...

SpringCloud Ribbon 学习

SpringCloud Ribbon 学习 文章目录 SpringCloud Ribbon 学习1. Ribbon 是什么?2. LB(Load Balance)3 Ribbon 架构图&机制4 Ribbon 常见负载均衡算法5 测试 1. Ribbon 是什么? Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡…...

预告:XuperOS Global 国际化进展

XuperOS新年致辞中,我们提到XuperOS成长计划的最后一个阶段是国际化。伴随前三个阶段创世、监督、共建先后落地,很多用户特来咨询XuperOS国际化进展,我们在此统一说明。 按照之前的规划,XuperOS将在海外部署一条新的开放链XuperOS…...

炫技操作--递归实现翻转链表(java)

递归实现链表的逆序 leetcode 206题。 翻转链表递归解法普通方式实现链表翻转链表专题 leetcode 206题。 翻转链表 leetcode链接用于测试 题目:描述 将一个链表翻转: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 递归解法 解题思路…...

华为OD机试真题 Java 实现【求最小公倍数】【牛客练习题】

一、题目描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。 数据范围:1≤a,b≤100000 。 二、输入描述 输入两个正整数A和B。 三、输出描述 输出A和B的最小公倍数。 四、解…...

[java]两数之和 II - 输入有序数组

两数之和 II - 输入有序数组 leetcode 167 原题链接解题思路解题代码排序专题 leetcode 167 原题链接 167. 两数之和 II - 输入有序数组 – 原题链接 题目描述: 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出…...

Linux-0.11 boot目录head.s详解

Linux-0.11 boot目录head.s详解 模块简介 在head.s中,操作系统主要做了如下几件事: 重新设置中断描述符和全局描述符检查A20地址线是否开启检查数学协处理器初始化页表并开启分页跳转到main函数执行 过程详解 重新设置IDT和GDT 在setup.s中我们已经…...

离散数学_十章-图 ( 3 ):由旧图构造新图

📷10.3 由旧图构造新图 概念1. 子图2. 真子图3. 导出的子图 旧图构造新图的方法1. 删除或增加图中的边2. 边的收缩3. 删除顶点 有时解决问题只需要图的一部分。 比如我们现在只关心大型计算机网络中涉及济南,广州,深圳的计算机中心&#xff0…...

Golang每日一练(leetDay0083) 汇总区间、多数元素II

目录 228. 汇总区间 Summary Ranges 🌟 229. 多数元素 II Majority Element ii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专…...

JAVA数组基础

目录 一、使用方式 1-动态初始化 ①先声明数组 ② 创建数组 ③分配方式 二、使用方式 2-静态初始化(直接在声明的同时初始化{ } ) 三、数组使用注意事项和细节 四、数组两种初始化方式都是将内存空间分配到堆上面的 一、使用方式 1-动态初始化 …...

Linux-0.11 文件系统exec.c详解

Linux-0.11 文件系统exec.c详解 模块简介 该模块实现了二进制可执行文件和shell脚本文件的加载和执行。 函数详解 create_tables static unsigned long * create_tables(char * p,int argc,int envc)该函数的作用是建立参数和环境变量指针表。 create_table的作用就是建立…...

NET框架程序设计-第1章.NET框架开发平台体系架构

1.1 .NET 框架基本组成 .NET 框架的核心便是通用语言运行时(Commomn Language Runtime,简称 CLR),CLR 是一个可被各种不同的编程语言所使用的运行时。 托管模块(mangaed module): 一个需要 CLR 才能执行的标准 Window…...

(哈希表 ) 349. 两个数组的交集 ——【Leetcode每日一题】

❓349. 两个数组的交集 难度:简单 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[…...

JavaScript基本语法(二)

JavaScript基本语法 1、变量1.1、简介1.2、变量命名规则1.3、JS的关键字和保留字1.4、声明提升 2、JavaScript数据类型2.1、基本类型2.2、引用类型2.3、两种类型的区别2.4、字符串常用方法 3、数据类型转换 1、变量 1.1、简介 在 JavaScript 中声明一个新变量的方法是使用关键…...

ChatGPT3.5-4资源汇总,直连无梯子

什么是ChatGPT? ChatGPT,全称:聊天生成预训练转换器(英语:Chat Generative Pre-trained Transformer),是OpenAI开发的人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5、GPT-4…...

【Netty】使用 SSL/TLS 加密 Netty 程序(二十)

文章目录 前言一、SSL/TLS概述二、Sslhandler类 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计(二)Netty Channel 概述(三)Netty ChannelHandler(四)ChannelP…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...