掌门教育微服务体系Solar第3弹:Nacos企业级落地下篇

前言

在高速发展的时候,公司规模越来越大,老师人数越来越多,这时候公司不能铺太多人去做运营与服务,必须提高每个人效,这就需要技术驱动。因此掌门教育转变成一家技术驱动型的公司,如果被迫成为一家靠资金驱动的公司就活不下去了。

-- 张翼(掌门教育创始人兼CEO)

掌门教育自2014年正式转型在线教育以来,秉承“让教育共享智能,让学习高效快乐”的宗旨和愿景,经历云计算、大数据、人工智能、 AR / VR / MR 以及现今最火的 5G ,一直坚持用科技赋能教育。掌门教育的业务近几年得到了快速发展,特别是今年的疫情,使在线教育成为了新的风口,也给掌门教育新的机遇。

随着业务规模进一步扩大,流量进一步暴增,微服务数目进一步增长,使老的微服务体系所采用的注册中心 Eureka 不堪重负,同时 Spring Cloud 体系已经演进到第二代,第一代的 Eureka 注册中心已经不大适合现在的业务逻辑和规模,同时它目前被 Spring Cloud 官方置于维护模式,将不再向前发展。如何选择一个更为优秀和适用的注册中心,这个课题就摆在了掌门人的面前。经过对 Alibaba Nacos 、HashiCorp Consul等开源注册中心做了深入的调研和比较,最终选定 Alibaba Nacos 做微服务体系 Solar 中的新注册中心。

背景故事

基础架构部选择新的注册中心,测试组需要配合对业界成熟的注册中心产品做分析和比较。由于掌门教育采用的是比较纯净的 Spring Cloud 技术栈,所以我们需要围绕它的注册中心,从测试角度,进行功能和性能上研究。

Spring Cloud 技术栈官方支持 Netflix Eureka ,HashiCorp Consul ,Zookeeper 三个注册中心,它们可以相互间实现无缝迁移,Alibaba Nacos 是新加盟 Spring Cloud 技术栈的新成员。测试组的同学们对上述四个注册中心做了一一研究和分析,鉴于时间紧迫,除了 Eureka 和 Nacos 之外,其它两个中间件未做深入的功能测试和性能测试。下面提供来自阿里巴巴 Nacos 官方某次业界宣讲的资料截图以供大家参考:

  • Eureka 介绍

2.png

  • Zookeeper 介绍

3.png

  • Consul 介绍

4.png

  • 上述三个注册中心比较

5.png

本文将围绕 Alibaba Nacos 着重针对其功能测试和性能测试两方面进行剖析和介绍。

Nacos 测试篇

Nacos 性能测试

① Nacos Server 性能测试

开发部署了 UAT 的 Nacos ,测试亲自压测。

  • 核心脚本
def registry(ip):fo = open("service_name.txt", "r")str = fo.read()service_name_list = str.split(";")service_name = service_name_list[random.randint(0,len(service_name_list) - 1)]fo.close()client = nacos.NacosClient(nacos_host, namespace='')print(client.add_naming_instance(service_name,ip,333,"default",1.0,{'preserved.ip.delete.timeout':86400000},True,True))while True:print(client.send_heartbeat(service_name,ip,333,"default",1.0,"{}"))time.sleep(5)
  • 压测数据

表格 1.jpg

  • 压测结果图

6.png

7.png

Nacos Server 是3台 1C4G 集群,同时承受1499个服务和12715个实例注册,而且 CPU 和内存长期保持在一个合适的范围内,果真 Nacos 性能是相当 OK 的。

Nacos 功能测试

① Nacos Server 接口测试

表格2.jpg

更多更详 API 请参见 Nacos 官方文档: Open API 指南

https://nacos.io/zh-cn/docs/open-api.html

② Nacos Eureka Sync 测试

  • 交叉注册

网关,服务 A ,服务 B 各10台实例,网关注册 Eureka , A 注册 Nacos , B 注册 Eureka ,同步正常,可调用。

  • 压力测试

请求大于100万次,查看 Sync Server 会不会受到影响,结果 ErrorRequest = 0,同步服务数和实例数没有变化。

8.png

  • 有无损调用

网关 Sync Server 挂掉,网关服务 Eureka 同步 Nacos 失败,不影响网关 -> A -> B 调用。

  • 自动创建同步

发布系统第一次发布应用到 Eureka / Nacos ,会自动创建 Eureka -> Nacos 的同步任务或 Nacos -> Eureka的同步任务

9.png

  • 减少 Sync Server

Sync Server 4C8G ,停止机器,逐台递减,结论:平均1台 4C8G 机器最大可同步100个服务。

  • 增加 Sync Server

2台 Etcd 节点,停机一台,Etcd 读取超时,结论:600个服务至少2台 Etcd 节点,这里重点强调,新增服务时, Hash 算法虚拟节点数,务必和原有的保持一致,不然会出现同步失败,影响跨注册中心调用。

10.png

  • 重启 Sync Server

增加 Sync Server 个数,重启 Sync Server ,各节点同步数重新计算且均衡。

③ Nacos Client 功能测试

Nacos Client 界面重点测试集群管理,服务列表和权限控制。

  • Nacos Server 重启后,集群管理界面正常展示3台集群节点 IP 。
  • 服务注册 Nacos Server 后,服务列表新增注册上去的服务名和实例个数,而且可查看详情。

11.png

  • 服务上下线操作,健康状态和元数据等展示正常。
  • 编辑,删除等操作只有具备 Admin 权限的人员才可操作。

④ Nacos Client 自动化测试

  • 自动化测试链路

全链路测试路径

API网关 -> 服务A(两个实例) -> 服务B(两个实例)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

12.png

全链路服务部署

表格3.jpg

  • 自动化测试入口

结合 Spring Boot Junit , TestApplication.class 为测试框架内置应用启动程序, MyTestConfiguration 用于初始化所有测试用例类。在测试方法上面加入 JUnit 的 @Test注解

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { TestApplication.class, MyTestConfiguration.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyTest {@Autowiredprivate MyTestCases myTestCases;private static long startTime;@BeforeClasspublic static void beforeTest() {startTime = System.currentTimeMillis();}@AfterClasspublic static void afterTest() {LOG.info("* Finished automation test in {} seconds", (System.currentTimeMillis() - startTime) / 1000);}@Testpublic void testNoGray() throws Exception {myTestCases.testNoGray(gatewayTestUrl);myTestCases.testNoGray(zuulTestUrl);}@Testpublic void testVersionStrategyGray() throws Exception {myTestCases.testVersionStrategyGray1(gatewayGroup, gatewayServiceId, gatewayTestUrl);myTestCases.testVersionStrategyGray1(zuulGroup, zuulServiceId, zuulTestUrl);}
}
@Configuration
public class MyTestConfiguration {@Beanpublic MyTestCases myTestCases() {return new MyTestCases();}
}
  • 基于 Nacos Client 的普通调用自动化测试

在测试方法上面增加注解 @DTest ,通过断言 Assert 来判断测试结果。注解 @DTest 内容如下:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DTest {}

代码如下:

public class MyTestCases {@Autowiredprivate TestRestTemplate testRestTemplate;@DTestpublic void testNoGray(String testUrl) {int noRepeatCount = 0;List<String> resultList = new ArrayList<String>();for (int i = 0; i < 4; i++) {String result = testRestTemplate.getForEntity(testUrl, String.class).getBody();LOG.info("Result{} : {}", i + 1, result);if (!resultList.contains(result)) {noRepeatCount++;}resultList.add(result);}Assert.assertEquals(noRepeatCount, 4);}
}
  • 基于 Nacos Client 的灰度蓝绿调用自动化测试

在测试方法上面增加注解 @DTestConfig ,通过断言 Assert 来判断测试结果。注解 DTestConfig 注解内容如下:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DTestConfig {// 组名String group();// 服务名String serviceId();// 组名-服务名组合键值的前缀String prefix() default StringUtils.EMPTY;// 组名-服务名组合键值的后缀String suffix() default StringUtils.EMPTY;// 执行配置的文件路径。测试用例运行前,会把该文件里的内容推送到远程配置中心或者服务String executePath();// 重置配置的文件路径。测试用例运行后,会把该文件里的内容推送到远程配置中心或者服务。该文件内容是最初的默认配置// 如果该注解属性为空,则直接删除从配置中心删除组名-服务名组合键值String resetPath() default StringUtils.EMPTY;
}

代码如下:

public class MyTestCases {@Autowiredprivate TestRestTemplate testRestTemplate;@DTestConfig(group = "#group", serviceId = "#serviceId", executePath = "gray-strategy-version.xml", resetPath = "gray-default.xml")public void testVersionStrategyGray(String group, String serviceId, String testUrl) {for (int i = 0; i < 4; i++) {String result = testRestTemplate.getForEntity(testUrl, String.class).getBody();LOG.info("Result{} : {}", i + 1, result);int index = result.indexOf("[V=1.0]");int lastIndex = result.lastIndexOf("[V=1.0]");Assert.assertNotEquals(index, -1);Assert.assertNotEquals(lastIndex, -1);Assert.assertNotEquals(index, lastIndex);}}
}

初始默认无灰度蓝绿的配置文件 gray-default.xml

<?xml version="1.0" encoding="UTF-8"?>
<rule></rule>

灰度蓝绿生效的配置文件 gray-strategy-version.xml

<?xml version="1.0" encoding="UTF-8"?>
<rule><strategy><version>1.0</version></strategy>
</rule>
  • 基于 Nacos Client 的自动化测试报告样例
---------- Run automation testcase :: testStrategyCustomizationGray() ----------
Header : [a:"1", b:"2"]
Result1 : zuul -> solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group] -> solar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solar-group]
Result2 : zuul -> solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group] -> solar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solar-group]
Result3 : zuul -> solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group] -> solar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solar-group]
Result4 : zuul -> solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group] -> solar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solar-group]
* Passed
---------- Run automation testcase :: testVersionRuleGray() ----------
Result1 : zuul -> solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group] -> solar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solar-group]
Result2 : zuul -> solar-service-a[192.168.0.107:3001][V=1.0][R=dev][G=solar-group] -> solar-service-b[192.168.0.107:4001][V=1.0][R=qa][G=solar-group]
Result3 : zuul -> solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group] -> solar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solar-group]
Result4 : zuul -> solar-service-a[192.168.0.107:3001][V=1.0][R=dev][G=solar-group] -> solar-service-b[192.168.0.107:4001][V=1.0][R=qa][G=solar-group]
* Passed

Nacos 测试总结

Nacos 不仅性能好,而且界面简洁,这样的注册中心你值得拥有。

作者介绍

  • 吴毅挺,掌门技术副总裁,负责技术中台和少儿技术团队。曾就职于百度、eBay 、携程,曾任携程高级研发总监,负责从零打造携程私有云、容器云、桌面云和 PaaS 平台。
  • 任浩军,掌门基础架构部负责人。曾就职于平安银行、万达、惠普,曾负责平安银行平台架构部 PaaS 平台 Halo 基础服务框架研发。10 多年开源经历,Github ID:@HaojunRen,Nepxion 开源社区创始人,Nacos Group Member,Spring Cloud Alibaba & Nacos & Sentinel & OpenTracing Committer。

参与 Nacos 落地的基础架构部成员,包括:

  • 童子龙,张彬彬,廖梦鸽,张金星,胡振建,谢璐,谢庆芳,伊安娜

 

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

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

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

相关文章

jdk 1.8 安装

步骤 B&#xff1a;配置 JAVA_HOME 系统变量区域&#xff0c;点击【新建】&#xff0c;在弹出的窗口中&#xff0c;分别输入变量名和值 变量名&#xff1a;JAVA_HOME 变量值&#xff1a;你的安装路径 JAVA_HOMEpath %JAVA_HOME%\bin步骤 C&#xff1a;配置 Path Path环境变量…

【漫画】最近,老王又双叒get了CDN的新技能—可编程化敏捷开发

原文链接 本文为阿里云原创内容&#xff0c;未经允许不得转载。

抖音实战~点赞数量弹框

组件 在components下面新建ge-popup.vue <template><view><view class"mask"></view><!--绑定微信--><view class"wxbox"><view class"weixin"><image src"../static/dz.jpg"></…

阿里张磊:如何构建以应用为中心的“Kubernetes”?(内含 QA 整理)

如何构建“以应用为中心”的 Kubernetes&#xff1f; 构建这么一个以用户为中心的 Kubernetes&#xff0c;需要做几个层级的事情。 应用层驱动 首先来看最核心的部分&#xff0c;上图中蓝色部分&#xff0c;也就是 Kubernetes。可以在 Kubernetes 之上定义一组 CRD 和 Contro…

Trie 树是什么样的数据结构?有哪些应用场景?

作者 | 神奕来源 | 前端应届生头图 | 下载于视觉中国出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在计算机科学中&#xff0c;trie&#xff0c;又称前缀树或字典树&#xff0c;是一种有序树&#xff0c;用于保存关联数组&#xff0c;其中的键通常是字符串…

iOS Abort问题系统性解决方案

一、背景 崩溃(Crash)&#xff0c;即闪退&#xff0c;多指移动设备&#xff08;如iOS、Android设备&#xff09;在打开/使用应用程序的过程中&#xff0c;突然出现意外退出/中断的情况。如果App线上版本频繁发生崩溃&#xff0c;会极大地影响用户体验&#xff0c;甚至导致用户…

uniapp 处理过去时间对比现在时间的时间差 如刚刚、几分钟前,几小时前,几个月前

文章目录1. 返回的报文2. 时间格式化方法3. 使用1. 返回的报文 格式化时间&#xff1a;createTime [{"id": "62c11d3435b7c4007a8e650e","fromUserId": "21100598TZ9XG6RP","fromNickname": "小美女","fro…

云原生全景图之五:应用程序定义和开发层

作者 | Catherine Paganini、Jason Morgan来源 | K8sMeetup头图 | 下载于视觉中国前文介绍了如何将所有应用程序组件作为整体来编排和管理&#xff08;编排和管理层&#xff09;。本文将介绍云原生全景图的最上层&#xff1a;应用程序定义和开发层。现在我们来到了云原生全景图…

Flink 1.11 SQL 十余项革新大揭秘,哪些演变在便捷你的使用体验?

简介&#xff1a; SQL 作为 Flink 中公认的核心模块之一&#xff0c;对推动 Flink 流批一体功能的完善至关重要。在 1.11 中&#xff0c;Flink SQL 也进行了大量的增强与完善&#xff0c;开发大功能 10 余项&#xff0c;不仅扩大了应用场景&#xff0c;还简化了流程&#xff0c…

uniapp 小于1000 按原数字显示 超过1000 数字换算成10w+ 1.3k+ 显示

文章目录1. 公共方法2. 使用1. 公共方法 methods: {// 数字换算graceNumber(number) {if (number 0) {return "0";} else if (number > 999 && number < 9999) {return (number / 1000).toFixed(1) k;} else if (number > 9999 && numbe…

我们为什么要做 SoloPi

SoloPi现状 去年&#xff08;2019年&#xff09;7月份&#xff0c;蚂蚁集团正式对外开源了客户端自动化测试工具 SoloPi &#xff0c;其主要包括三大模块&#xff1a;录制回放&#xff08;用于功能测试&#xff09;、性能工具&#xff08;用于性能测试&#xff09;以及一机多控…

华为发布2020年年报:收入8914亿元,华为云增速最高达168%

今天&#xff0c;华为发布了2020年度报告。2020年&#xff0c;华为实现销售收入8914亿元人民币&#xff0c;同比增长3.8%&#xff1b;净利润646亿元人民币&#xff0c;同比增长3.2%。其中&#xff0c;企业业务收入同比增长23%至1003亿元人民币。华为轮值董事长胡厚崑在年报发布…

从单体到混乱的微服务,阿里云托管式服务网格是如何诞生的?

作者 | 王夕宁 阿里巴巴高级技术专家 参与阿里巴巴云原生文末留言互动&#xff0c;即有机会获得赠书福利&#xff01; 在服务网格技术使用之前&#xff0c;为了更快更灵活地进行业务创新, 我们常常会把现有应用进行现代化改造, 把单体应用程序分拆为分布式的微服务架构。通常…

MongoDB数据日期显示相差8小时 原因和解决方案

文章目录一、透过现象看本质1. 背景调研2. 原因分析3. 影响评估二、解决方案2.1. 客户端显示问题2.2. 查询数据不正确2.3. 效果验证一、透过现象看本质 1. 背景调研 最近因为项目需要使用到了MongoDB&#xff0c;使用Navicat Premium 15 客户端可视化工具查询数据&#xff0c…

Kubernetes 和 Docker,到底什么关系?

来源 | 无敌码农责编 | 寇雪芹头图 | 下载于视觉中国作为一名容器时代的程序员相信你已经或多或少接触过Docker&#xff0c;但同时你也会发现Docker虽然流行了多年&#xff0c;但之前却很少有公司直接将线上应用通过Docker容器进行大规模地部署。但最近三年&#xff0c;你会发现…

SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(优雅上下线)

前言 上篇我们讲的是发布回滚过程&#xff0c;尤其是在 Kubernetes 的回滚过程中&#xff0c;原生有提供 Rollout 到上一个版本的能力&#xff0c;能保证我们在发布过程中遇到问题时快速回退的能力。然而在每一次上线的过程中&#xff0c;我们最难处理的就是正在运行中的流量&…

菜鸟+Hologres=智能物流

作者&#xff1a;阿里巴巴菜鸟物流团队&#xff08;弃疾&#xff0c;孝江&#xff0c;姜继忠&#xff09; 一、业务背景 菜鸟智能物流分析引擎是基于搜索架构建设的物流查询平台&#xff0c;日均处理包裹事件几十亿&#xff0c;承载了菜鸟物流数据的大部分处理任务。 智能物流…

这个宝藏工具,会给你一种黑客般的感觉

明天要交作业了&#xff0c;吴检正在宿舍熬夜爆肝拼命敲代码&#xff0c;劈里啪啦的键盘声和咔咔的鼠标声格外嘈杂&#xff0c;室友陈琛瞥了一眼&#xff0c;背过身&#xff0c;沉沉睡去&#xff0c;留下他一人在深夜无尽的黑暗中&#xff0c;断断续续却又没有尽头的咔咔声中凌…

全民加速节:解读CDN的应用场景与产品价值

8月12日&#xff0c;全民加速节第二次直播中&#xff0c;阿里云CDN产品专家寒丰进行了《阿里云CDN产品解读》的主题分享&#xff0c;从CDN的趋势、变迁、价值三个方面来阐述思考&#xff0c;并对阿里云CDN产品的业务架构和价值进行解读。 当下&#xff0c;互联网的应用服务已经…

抖音实战~评论数量同步更新

文章目录一、快速入门1. 子组件2. 父组件3. 子组件回调父页面4. 父组件接收回调5. 组件调用流程二、抖音评论数量2.1. 流程图2.2. 流程简述2.3. 流程图效果图鉴赏一、快速入门 1. 子组件 <view clickchildBackHome></view>2. 父组件 父组件说明&#xff1a; bac…