从开源自治到微服务云化,用这剂良药提升微服务幸福感

前言

微服务发展至今,因其高内聚、低耦合等特性,以及诸多开源方案带来的开放性,已成为提升架构效率的最佳实践之一。当一项技术或一个框架成为事实标准之后,我们会把更多的注意力聚焦在运维效率和应用可用性的持续提升上。相信下面这些场景大家或多或少都遇到过。

场景一:当业务达到一定的规模之后,微服务的数量和单个微服务实例的数就会变的很多,从而导致微服务注册中心需要管理很多服务地址,同时还需要给所有的上下游提供服务注册和服务发现的能力。

场景二:发布是天大的事情,每一次的发布,都会出现执行到一半的请求中断掉,上游继续调用已经下线的节点导致报错的现象。发布时收到各种报错,同时还影响用户的体验,发布后又需要修复执行到一半的脏数据。
上述场景还是在新版本没有任何问题的情况下,如果新版本有问题,则会导致大量业务直接请求到有问题的新版本,轻则修复数据,重则严重影响用户体验,甚至产生资损。最后不得不每次发版都安排在凌晨两三点发布,心惊胆颤,睡眠不足,苦不可言。

场景三:大半夜某个服务节点出现异常,上游仍旧不断地调用,出现很多异常和各种报警短信。被报警吵醒后,想直接在线上修复,有点难,想保留现场又害怕拖垮整个应用,只好先重启为上。
但是这只是治标不治本的方式,因为很难复现从而无法有效定位,可能明天又被吵醒,继续重启。上述场景还是建立在报警系统比较完善的情况下,如果没有完善的报警系统,严重情况可能整个业务系统都被单机异常拖垮。

场景四:公司业务壮大了,部门组织变复杂后,微服务模块越来越多。我不清楚发布的服务到底被谁调用了,所以我不知道能否安全地下线一个服务。我这个应用的这个接口是个敏感接口,我只希望得到我授权的应用才能调用,而不是直接从服务注册中心得到我的地址就能直接调用,但是目前好像还做不到。
面对以上这些场景,可以通过投入更多的开发和运维资源来解决,但对于大部分希望专注于业务开发的企业来说,如果能有一款适合企业自身需求,支持组件化的商业化产品,将会是更好的选择。

接下来,我们就来详细剖析下阿里云微服务MSE是如何解决以上问题的。

一、注册和配置中心托管

相比基于Zookeeper/Nacos/Eureka来自建注册中心,MSE 提供了以下这些差异化竞争力。

1.1注册和配置中心托管.png

二、如何降低应用发布出错率

什么是无损下线

传统的发布流程中,服务提供者停止再启动,服务消费者感知到服务提供者节点停止的流程如下:

2.1什么是无损下线.png

1、服务发布前,消费者根据负载均衡规则调用服务提供者,业务正常。
2、服务提供者 B 需要发布新版本,先对其中的一个节点进行操作,首先是停止 Java 进程。
3、服务停止过程,又分为主动注销和被动注销,主动注销是准实时的,被动注销的时间由不同的注册中心决定,最差的情况会需要 1 分钟。

如果应用是正常停止,Spring Cloud 和 Dubbo 框架的 Shutdown Hook 能正常被执行,这一步的耗时可以忽略不计。

如果应用是非正常停止,比如直接使用 kill -9 停止,或者 Docker 镜像构建的时候 Java 应用不是 1 号进程且没有把 kill 信号传递给应用。那么服务提供者不会主动去注销服务节点,而是在超过一段时间后由于心跳超时而被动地被注册中心摘除。

4、服务注册中心通知消费者,其中的一个服务提供者节点已下线。包含推送和轮询两种方式,推送可以认为是准实时的,轮询的耗时由服务消费者轮询间隔决定,最差的情况下需要 1 分钟。

5、服务消费者刷新服务列表,感知到服务提供者已经下线了一个节点,这一步对于 Dubbo 框架来说不存在,但是 Spring Cloud 的负载均衡组件 Ribbon 默认的刷新时间是 30 秒 ,最差情况下需要耗时 30 秒。

6、服务消费者不再调用已经下线的节点。
从第 2 步到第 6 步的过程中,Eureka 在最差的情况下需要耗时 2 分钟,Nacos 在最差的情况下需要耗时 50 秒。在这段时间内,请求都有可能出现问题,所以发布时会出现各种报错,同时还影响用户的体验,发布后又需要修复执行到一半的脏数据。最后不得不每次发版都安排在凌晨两三点发布,心惊胆颤,睡眠不足,苦不可言。

MSE提供的无损下线功能会自动在发布新版本的时候做如下的增强,我们主要关注绿色部分的信息:

2.2服务消费者不再调用已经下线的节点。.png

1、应用在发布前主动向注册中心注销应用,并将应用标记为已下线的状态。
2、在接收到服务消费者请求时,首先会正常处理本次调用,并通知服务消费者此节点已下线,服务消费者会立即从调用列表删除此节点。
3、在这之后,服务消费者不再调用已经下线的节点。

MSE的无损下线功能,将原来的从原来的 停止进程阶段 注销服务变成了 prestop 阶段注销服务,将原来的依赖于 注册中心推送,做到了服务提供者直接通知消费者从调用列表中摘除自己。使得下线感知的时间大大减短,从原来的分钟级别做到准实时,确保您的应用在下线时能做到业务无损。

金丝雀发布再加一重保障

在普通的新版本发布场景中,默认情况下请求到各个节点的流量是均匀分布的。

假设服务提供者有 4 台,只要某个节点一发布新版本,就会有 25% 的流量打到新版本。如果新版本存在问题,就会影响线上 25% 的流量,轻则修复数据,重则严重影响用户体验,甚至产生资损。

2.3金丝雀发布再加一重保障.png


MSE提供的金丝雀发布功能,支持用户在发布新版本之前就提前配置好金丝雀规则,使得只有符合流量特征的流量会调用到新版本,从而可以精准地控制调用到新版本的流量,进行新版本验证。

2.4如何降低应用发布出错率.png

在发布一个新版本的应用的时候,通过一个新的 Deployment 来发布,并在 Deployment 中填写相应的版本号

新版本启动之后,默认没有流量,需要在 MSE 控制台配置流量规则才有流量进来,可以基于流量百分比进行配置,也可以按照流量特征进行配置。

配置完成后,Agent 会自动将路由规则推送到服务消费者端,服务消费者会去根据配置好的规则选择去调用新版本或者旧版本。

2.5金丝雀发布.png

比如这里我们配置 user-id 对 100 取模为 20 的会去新版本,那么 user-id=120 的这个流量就会去新版本。

三、如何避免半夜醒来重启机器

开源框架有可能被单点异常拖垮整个应用系统

在微服务架构中,当服务提供者的应用实例出现异常时,服务消费者无法及时感知,会影响服务的正常调用,进而影响消费者的服务性能甚至可用性。

3.1开源框架有可能被单点异常拖垮整个应用系统.png

在上图的示例场景中,系统包含 4 个应用,A、B、C 和 D,其中应用 A 会分别调用应用 B、C 和 D。当应用 B、C 或 D 的某些实例异常时(如图中应用 B、C 和 D 标识的各有 1个和 2 个异常实例),如果应用 A 无法感知,会导致部分调用失败;如果业务代码写的不够优雅,有可能影响应用 A 的性能甚至整个系统的可用性。

离群实例摘除给业务系统的稳定性加把锁

为了保护应用的服务性能和可用性,MSE支持检测应用实例的可用性并进行动态调整,以保证服务成功调用,从而提升业务的稳定性和服务质量。

如下图所示,您可以在控制台上对应用 A 进行如下配置,从而保证 A 应用的稳定性。

3.2离群实例摘除给业务系统的稳定性加把锁.png

1、 异常类型,网络异常指的是 IOException,业务异常在 Spring Cloud 框架中指的是返回值 http 状态码 为 500 ,Dubbo 框架中指的是返回值中包含 Exception。
2、 QPS 下限,为了避免调用次数太少,随机性较大从而影响判断的准确性,您可以设置 QPS 的下限,只有 QPS 达到一定值后才进行离群摘除判断。默认为 1 ,可以配置成 0。
3、 错误率下限,如果某台服务提供者返回值中,错误的比例超过了配置的这个值,会被判定成需要被摘除。
4、 摘除实例比例上限,为了避免摘除过多的机器节点,导致剩余的节点数流量过载,需要配置一个摘除比例的上限,建议不超过 50%。
5、 恢复检测单位时间,离群节点被摘除的动作是暂时性的,经过单位时间后,消费者侧会对此节点进行检测。如果节点已经恢复,会将其放回到节点中。如果节点持续被摘除,那么它被摘除的时间会线性增加到最大值。

基于离群实例摘除功能,您不会因为单机异常在半夜醒来重启机器,先安心地睡一觉吧,反正业务也不会受影响。醒来之后机器现场也还在,是拿着保留的现场进行分析,还是直接重启,任君选择。

四、如何做到对自己的服务胸有成竹

服务查询一目了然

我们熟知的 zookeeper 组件并没有服务查询界面,Eureka 和 Nacos 这两个注册中心,虽然提供了网页版的控制台,但是在控制台上只能查询到服务的 IP 和 port 等基本的信息。

MSE用户在使用服务查询时,不仅能够查询到应用注册了哪些服务,对应的 IP 和 port 是什么,还能查询到服务包含的具体方法和参数类型,以及直观地看到服务被其他应用和节点的订阅情况。

4.1如何做到对自己的服务胸有成竹.png

即使部门组织再复杂、微服务模块再多,您也可以清晰地查询出服务的被调用情况,做到心中有数,在梳理服务依赖以及评估影响面的时候可以做到胸有成竹。

精准地控制服务调用的权限

业务发展后,服务还会遇到权限控制的需求。比如优惠券部门的某个应用,同时包含了优惠券查询接口 和优惠券发放接口。对于优惠券查询接口来说,默认公司内部的所有应用都有权限调用的;但优惠券发放接口只有客服和运营部门的某些应用才有权限调用。

如下图所示,MSE用户可以对自己的服务进行权限管理,这里以 Dubbo 为例,下图中配置表明,应用 cartservice 发布的 com.alibabacloud.hipstershop.CartService 服务的 addItemToCart 的方法,只允许 frontend 这个应用调用。

4.2如何做到对自己的服务胸有成竹.png

除了支持对指定的接口添加鉴权规则之外,服务鉴权也支持对整个应用添加鉴权规则,还支持根据调用方 IP 进行鉴权。

精准的权限管理,可以让你更好地管理微服务调用的权限,保证业务的合规性,保障数据的安全。

结语

MSE 以组件化的方式来提供微服务能力,客户既能对应用实现自主可控,还能低门槛的接入注册中心和配置中心的托管,以及高阶的微服务治理能力。据悉,Spring Cloud 和Dubbo近5年的开源版本,均可0代码修改就能接入MSE。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

uniapp 打包安卓 Android 抖音app 前后端调试篇~03

文章目录1. 未登录首页浏览短视频2. 发布视频-云短信登录3. 发布选择视频4. 上传短视频到云存储5. 测试发布视频6. 个人中心查看发布视频7. 首页查看刚发布视频8. 个人中心1. 未登录首页浏览短视频 在未登录的情况下,首页可以看短视频 2. 发布视频-云短信登录 点…

俯瞰云原生,这便是供应层

来源 | K8sMeetup社区作者 | Catherine Paganini,Jason Morgan头图 | 下载于视觉中国在都在说云原生,它的技术图谱你真的了解吗?中,我们对 CNCF 的云原生技术生态做了整体的介绍。从本篇开始,将详细介绍云原生全景图的…

进击的Kubernetes调度系统(一):SchedulingFramework

作者:王庆璨 张凯 前言 Kubernetes已经成为目前事实标准上的容器集群管理平台。它为容器化应用提供了自动化部署、运维、资源调度等全生命周期管理功能。经过3年多的快速发展,Kubernetes在稳定性、扩展性和规模化方面都有了长足进步。 尤其是Kubernete…

HTTP系列学习(笔记三):HTTP的发展历程思维导图

HTTP(HyperText Transfer Protocol)是万维网(World Wide Web)的基础协议。 0.9版本: 1.0版本: 1.1版本: 2.0版本: 2.0进化版本: 为了便于浏览记忆,整理了一份…

为什么说Serverless是云的未来?

作者 | 不瞋 阿里云高级技术专家 每隔几年,IT 界就会出现新突破性的进展。回望整个计算机技术发展史,我们会发现“抽象、解耦、集成”的主题贯穿其中。产业每一次的抽象、解耦、集成,都将创新推向新的高度,也催生出庞大的市场和…

(企业级)HBuilder X 安装蓝叠安卓模拟器

文章目录1. 下载蓝叠模拟器2. 设置 adb链接和root3. 设置竖屏4. 设置uni-app adb 环境变量5. 配置 HBuilderX adb5. 运行6.效果图7.常见模拟器1. 下载蓝叠模拟器 https://www.bluestacks.cn/ 2. 设置 adb链接和root 3. 设置竖屏 4. 设置uni-app adb 环境变量 在 HBuilderX…

小困惑,关于 Serverless 函数计算的字体安装

来源 | Serverless作者 | 孙飞宇头图 | 下载于视觉中国前言首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情…

一文带你了解MySQL中的各种锁机制!

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 行级锁是Mysql中锁…

for循环中let,var 的经典面试题:for循环中 console.log(i)详解

同学们在刚准备面试时肯定见过一道经典面试题&#xff1a; for(var i 0; i < 10; i) {setTimeOut(function(){console.log(i)}) } // 输出 10 10 10 10 10 10 10 10 10 10for(let i 0; i < 10; i) {setTimeOut(function(){console.log(i)}) } // 输出 0 1 2 3 4 5 6 7…

后疫情时代,银行从数字化转型到智能化“迁徙”

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 全球数据智能趋势一览 笔者在搜索了众多机构发表的数据智能发展趋势报告&#xff0c;并做了筛选和甄别后&#xff0c;参考了公…

普通二本学校软件工程专业本科毕业的女生,没有考研,选择直接就业现如今过得怎样呐?

第一篇程序人生 在进入大学之前买的联想笔记本电脑被我之前放在窗户边&#xff0c;一个月之前去上班的时候忘记关窗户&#xff0c;下大雨给淋雨进水了&#xff0c;刚好开机密码的几个键盘失灵了&#xff0c;上周末在网上买了一个键盘&#xff0c;终于可以开机了&#xff0c;为…

阿里云交通数据中台解决方案打造“数字化生产力”

数字经济时代&#xff0c;计算、分析、处理等作为“关键生产要素”已成为行业和社会的共识。但是对于交通领域而言&#xff0c;以往端到端的方式进行平台搭建和应用开发已不能适应数字爆炸和产品快速迭代的要求。交通行业在计算分析方面面临着信息采集难、样式杂、变化快、价值…

一次讲清楚,七种分布式事务的解决方案

来源 | moon聊技术责编 | 寇雪芹头图 | 下载于视觉中国什么是分布式事务分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器「分别位于不同的分布式系统的不同节点之上」。一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针…

SpringCloud应用在Kubernetes上的最佳实践—开发篇

作者 | 孤弋 阿里云高级技术专家&#xff0c;负责 EDAS 的开发和用户体验优化工作。 前言 近年来&#xff0c;云原生、Kubernetes、微服务、SpringCloud 这些名词在技术圈内不绝于耳&#xff0c;数据显示&#xff0c;使用 SpringCloud 作为微服务的框架&#xff0c;同时选择…

支持批任务的Coscheduling/Gang scheduling

作者&#xff1a;王庆璨 张凯 进击的Kubernetes调度系统&#xff08;一&#xff09;&#xff1a;Scheduling Framework 进击的Kubernetes调度系统&#xff08;二&#xff09;&#xff1a;支持批任务的Coscheduling/Gang scheduling 前言 首先我们来了解一下什么是Coscheduli…

ESLint is disabled since its execution has not been approved or denied yet

我的vs code有安装eslint插件&#xff0c;但是不这道为什么这两天很多代码校验都不起作用了 一顿操作猛如虎&#xff0c;最后发现代码开始的时候有一条黄线 爆出了一个错误 ESLint is disabled since its execution has not been approved or denied yet. Use the light bulb…

13种重要的云原生工具,让交付过程更快

来源 | SDNLAB责编 | 寇雪芹头图 | 下载于视觉中国SUSE收购RancherPure Storage收购PortworxVeeam收购KastenVMware收购OctarineMirantis收购Lens IDE思科收购Banzai CloudNew Relic收购Pixie Labs云原生市场趋于整合........以上是过去一年云原生行业发生的并购案&#xff0c;…

后疫情时代企业将加速向云服务迁移

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; LogicMonitor的新调查结果表明&#xff0c;COVID-19已成为企业快速实施云迁移的强大催化剂&#xff0c;尽管整体情况仍在发展…

会话拦截限制一台手机登录

文章目录1. 流程图2. 流程简述1. 流程图 2. 流程简述 1.前端传递userId和token2.后端接收userId和token3.校验userId和token是否为空4.校验任一为空&#xff0c;则提示“请登录后再继续操作&#xff01;”5.不为空&#xff0c;通过UserId从redis中获取token6.redis中的token与…

HTML a链接下载文件之图片,文件,乱码等问题

我们在做需求的时候&#xff0c;经常会遇到下载文件 前端下载文件一般分为两种方式&#xff1a; 使用 a 链接进行下载&#xff1a; <a herf"url" >下载</a>向后端发送请求进行下载&#xff1a; methods:{downloadReport(item,index){let date item.…