联席作者:谢璐 谢庆芳 伊安娜 任浩军
郑重鸣谢:Nacos – 彦林,Spring Cloud Alibaba – 小马哥、洛夜,Nacos 社区 – 张龙(pader)、春少(chuntaojun)
相干文章举荐:
- 掌门教育微服务体系 Solar | 阿里巴巴 Nacos 企业级落地上篇
- 掌门教育微服务体系 Solar | 阿里巴巴 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
介绍
Zookeeper
介绍
Consul
介绍
- 上述三个注册核心比拟
本文将围绕 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)
- 压测数据
- 压测后果图
Nacos Server
是 3 台 1C4G
集群,同时接受 1499 个服务和 12715 个实例注册,而且 CPU
和内存长期保持在一个适合的范畴内,果然 Nacos
性能是相当 OK
的。
Nacos 功能测试
① Nacos Server 接口测试
更多更详 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,同步服务数和实例数没有变动。
- 有无损调用
网关 Sync Server
挂掉,网关服务 Eureka
同步 Nacos
失败,不影响网关 -> A
-> B
调用。
- 主动创立同步
公布零碎第一次公布利用到 Eureka
/ Nacos
,会主动创立 Eureka
-> Nacos
的同步工作或 Nacos
-> Eureka
的同步工作
- 缩小
Sync Server
Sync Server
4C8G
,进行机器,逐台递加,论断:均匀 1 台 4C8G
机器最大可同步 100 个服务。
- 减少
Sync Server
2 台 Etcd
节点,停机一台,Etcd
读取超时,论断:600 个服务至多 2 台 Etcd
节点,这里重点强调,新增服务时,Hash
算法虚构节点数,务必和原有的保持一致,不然会呈现同步失败,影响跨注册核心调用。
- 重启
Sync Server
减少 Sync Server
个数,重启 Sync Server
,各节点同步数从新计算且平衡。
③ Nacos Client 功能测试
Nacos Client
界面重点测试集群治理,服务列表和权限管制。
Nacos Server
重启后,集群治理界面失常展现 3 台集群节点IP
。- 服务注册
Nacos Server
后,服务列表新增注册下来的服务名和实例个数,而且可查看详情。
- 服务高低线操作,衰弱状态和元数据等展现失常。
- 编辑,删除等操作只有具备
Admin
权限的人员才可操作。
④ Nacos Client 自动化测试
- 自动化测试链路
全链路测试门路
API 网关 -> 服务 A(两个实例)-> 服务 B(两个实例)
全链路服务部署
- 自动化测试入口
联合 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 {
@Autowired
private MyTestCases myTestCases;
private static long startTime;
@BeforeClass
public static void beforeTest() {startTime = System.currentTimeMillis();
}
@AfterClass
public static void afterTest() {LOG.info("* Finished automation test in {} seconds", (System.currentTimeMillis() - startTime) / 1000);
}
@Test
public void testNoGray() throws Exception {myTestCases.testNoGray(gatewayTestUrl);
myTestCases.testNoGray(zuulTestUrl);
}
@Test
public void testVersionStrategyGray() throws Exception {myTestCases.testVersionStrategyGray1(gatewayGroup, gatewayServiceId, gatewayTestUrl);
myTestCases.testVersionStrategyGray1(zuulGroup, zuulServiceId, zuulTestUrl);
}
}
@Configuration
public class MyTestConfiguration {
@Bean
public 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 {
@Autowired
private TestRestTemplate testRestTemplate;
@DTest
public 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 {
@Autowired
private 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
落地的基础架构部成员,包含:
- 童子龙,张彬彬,廖梦鸽,张金星,胡振建,谢璐,谢庆芳,伊安娜
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术畛域、聚焦云原生风行技术趋势、云原生大规模的落地实际,做最懂云原生开发者的公众号。”