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

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

联席作者:谢璐 谢庆芳 伊安娜 任浩军<br />郑重鸣谢:Nacos - 彦林,Spring Cloud Alibaba - 小马哥、洛夜,Nacos 社区 - 张龙(pader)、春少(chuntaoj} U g R 9un)

相关文章推荐:

前言

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

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

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

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

背景故事

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

Spring CloQ h k k _ ! :ud 技术栈官方支持 Netflix EurekaHashq F [ M 5 N 7 $iCorp C/ 4 F 1 2 P +onsulZookeeperf B m j S 三个注册中心,它们可以相互间实现无缝迁移,Alibaba Nacos 是新加盟 Sn a fpring Cl0 d U y couT q g L 3d 技术栈的新成员。测试组的同学们对上述四个注册中心做了9 n q 4 J i B一一研究和分析,鉴于时间紧迫,除了 EurekaNacos 之外,其它两个中间件未做深入的功能测试和性能测试。下面提供来自阿里巴j c _ J j 2Nacos 官方某次业界宣讲的资料截图以供大H o Y ~ + F家参考:

  • Eureka 介绍

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

  • Zookeeper 介绍

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

  • Consul 介绍

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

  • 上述三个注册中心比较

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

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

Nacos 测试篇

Nacos 性能测试

= : 9 7 @ ( { Nacos Server 性能测试

开发部署了 UATNacos ,测试亲自压测。

  • 核心脚本
def reH X I + U !gistry(ip):
fo = open("service_name.txt", "r")
s7 N 1 ytr = fo.read()1 ] 2 * n A 2 o #
serF ) [ - 7 / s )vice_name_list = str.split(";")
service_name = service_name_list[random.randint(0,len(service_name_list) - 1)]
fo.close()
client =u B q N nacos.NacosClientJ { B C t F x(nacos_host, namespace='')
print(cq J dlient.A & E Hadd_naming_instance(service_name,ip,333,"default",1g ] ] 0 6 l v O.0,{'preserved.ip.0 L s 4 delete.timeoutC P . 2 f':86400000},Trur J W : 8e,True))
while True:
print(t [ / 3 R Z 0 y iclient.send_heartbeat$ R y t /(service_name,ip,333,"default",1.0,"{}"))
time.sleep(5)
  • 压测数据

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

  • ) ! ] d T R测结果图

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

Nacos Server 是3台 1C4G 集群,同时) m :承受14 % J B ] h99个服务和12L ? e 8 c e715个实例注册,而且 CPU 和内存长期保持在一个合% D ~ & Q v P %适的 = W范围内,r * d . c果真 Nacos 性能是相当 OK 的。

Nacos 功能测试

① Nacos Server 接口测试

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

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

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

② Nacos Eureka Sync 测试

  • 交叉注册

网关,服务 A ,服务 B 各10台实例,网关注册 Eurek: F p a d 8aA 注册 NacosB 注册 Eureka ,同步正常,可调用。

  • 压力测试

请求大于100万次,查看 Sync Server 会不会受到影响,结果| X h x } : s ErrorRequest = 0,同步服务数和实r B T G Z I x 0 =例数没有变化。

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

  • 有无损调用

网关 Sync Sr v Kerver 挂掉,网关服务 Eurek0 C - w H @ x ia 同步 Nacos 失败,不影a 7 ! k r响网关 -> A -> B 调用。

  • 自动创建同步

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

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

  • 减少 Sync Server

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

  • 增加 Sync Server

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

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

  • 重启 Sync Server[ Y & 9 7 A

增加 Sync Server 个数,重启 Sync Sev T : ! W / L K ,rver ,各节点同步数重新计算且均衡。

③ Nacos Client 功能测试

Nacos Clieb l P U B | ] nt 界面重点测试集群管理,服务列表和权限控制。

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

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

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

④ Nacos Client 自动化测试

  • 0 s h动化测试链路

全链路测试路径

API网w - # r Y 0 Y ) L关 -> 服务A(两个实例) -> 服务B(两个实_ u ^ ! } l $ e O例)

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

全链路服务部署

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

  • 自动化测试入口

结合 Spring Boot JunitTestApplication.class 为测试框a * n p +架内置应用启动程序, MyTestConfiguration= Q k { L于初始化所有测试用例类。在测试方法上面加入 JUnit@Test注解

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { TestApplication.class, MyTestConfiguration.class }, webEnvironment = SpringBootTest.WebEnvironme, K 4 @ dnt.RANDOM_PORT)
public class MyTest {
@Autowired
private MyTestCases myTestCases;
private static long startTime;
@Beforef % r y x p w cClas8 I 4 A ys
public static void beforeTest() {
startTime = Sys{ u ~ d g s 9tem.cu& e X M !rrentTimeMillis();
}
@AfterClass
public static voG O , t ~ Uid afterTest() {
LOG.info("* Finished automatu } .ion test in {} seconds", (System.currentTimeMillis() - startTime) / 1000);
}
@Test
publ& - 6 0 S Xic void t1 T y |   _estNoGray() throws Exception {
myTestCases.- q G G ! O K TtestI Z @ kNoGray(gatewayTestUrl);
myTestCases.testNoGray(zuulTestUrl);
}
@Test
pK D l 6 U z I + tublic void testVersionStrategyGray() throws Exception {
myTestCases.testVersionStrategyGray1(gatewayGro[ } Z j % 8up[ , q , T | J . V, gatewayServiceId, gatewayTeq H C N AstUrl)A U ) $ _ Z d;
myTestCases.testVersionStrategyGray1(zuulGroup, zuulServiceId, zuulTestUrl);
}
}
@Configuration
public class MyTestConfiguration {
@Bean
public MyTestCases myTeg k { 5 M BstCases() {
return new MyTestCases();
}
}
  • 基于 Nacos Client 的普通调用自动化测试

在测试方法上面增加注解 @DTest ,通过断言 Assert 来判断测试F f v E ]结果。注解; [ t p _ @DTest 内容如下:

@Ta/ I # -rget({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@InS J K w K 9herited
@Documented
public @inteC K prface DTest {
}

代码如下:

public class MyTestCases {
@Autowired
private TestRestTemplate ter , ! r ~ U { wstRestTemplate;
@DTest
public void testNoGray(String testUrl) {
id . s w h y b ,nt noRepeatCo} B  Uunt = 0;
List<String> resuH ) CltList = new Array5 f W w 6 AList<String>();
foG r O ~ o ] q G [r (int i = 0; i < 4; i++) {
Sx * s - 2 % 6 /tring result = testRestTemplate.ge. a F C Z F YtForEntiA 6 @ O + [ @ty(testU_ w C f 4  ] ! 2rl, String.class).getBodx S _ - @ K $ %y();
LOG.info("Result{} : {}", i + 1, result);
if (!resultList.contains(result)) {
noRepeatCount++;
}
resultList.ae R wdd(result);
}
Assert.assertEquals(noRepe{ s 3 = A _atCount, 4);
}
}
  • 基于 Nacos Client 的灰度蓝绿调用自动化测试

在测试方法上面增加注解 @DTe: H i L G 7stConfig ,通过断言 Assert 来判断测试结果。注解C ` 8 z d U i 2 4 DTestConfig 注解内容如下:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retentioz . fn(RetentiP ] ? u e 6 !onPolicy.RUNTIME)
@Inherited
@Documented
puV R r n ] ! g `blic @interface DTestConfig {
// 组名
String group();
// 服务名
String serviceId();
/* g %/ 组名-服务名组合键值的前缀
String prefix() default StringUtils.EMx F Z } ~ @ 3 N YPTY;
// 组名-服务名组合键值的后缀
Stri; ] d W 6ng suffix() default StriK 0 x N # q [ jngUtils.EMPTY;
/q 7 S q/ 执行配置的文件路径。测试用例运行前% # q V Q ,,会把该文件里的内5 _ * W [容推送到远程配置中心或者服务
Stri/ * % s Fng executePath(% N 8);
// 重置配置的文件路径。测试用例运行后,会把该文件里的内容推送到远程配置中心或者服务。该文件内容是最初的默认配置
// 如果该注解属性为空,则直接删除从f s Q `配置中心删除组Q 6 U J a d名-服务名组合键值
Sl J ; K Y j ~ [ ntring resetPath() default StringUtils.EMPTY;
}

代码如下:

public class MyTestCases {
@Q Q D ` ? CAutowired
private TestRestTemplate testRestTemplate;
@Dh C u a ~ 3 5TestConfig(group = "#group", servicef E 3 f F ) v . SId = "#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 =C & ) S v P R p G resul6 ` f T ; @ x o Rt.lastIndexOf("[VV i a m M M=1.0]");
Assert.asserj r F $tNotEqualsA 0 #(index, -1);
Assert.assertNotb N I JEquals(lastIndex, -1);
Assert.assertNotp w hEquals(iO 8 F E Z r Index, lastIndex);
}
}
}

初始默认无灰度蓝绿的配置文件 gray-defaulO S v c g u 0 kt.xml

<?xml version="1.0" encoding="UTFW w V `-8"?>
<rule>
</rule>

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

<?xml version="1 g Z L O y ] K {.0" encoding="UTF-8"?>
<rule>
&l( : e H 0 # Lt;strategy>
<version>1.0</version&p a z Ngt;
</s} ~ t  3 ] 1 )trategy>
</rule>
  • 基于 Nacos Client 的自动化测试报告样例
--------S M } 6 w-- Run automation testcase :: testStrategyCustomizationGray() -------] * % $ s X Y-g G n--
Header : [a:"1", b:"2"]
Result1 : zuul -> solar-service-a[192.1g q g i Z m 868.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 -D 0 s $ S 3 > solar-ser. 9 u g ~ w ( Mvice-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]G J R[R=dev][G=solar-group]
Result3 : zuul -> solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group]; ) w ^ -> solarM b k q = z-service-b[192.168.0.107:4002][V=1.1][R=dev J {v][G=solar-group]
Result4 : zuul -> solar-service-a[192.168.0.107i s h %:3002][V=1.1][R=qa][G=solar-group] -> sol( n t v : N c 6 car-service-~ _ Y Vb[192.168.0.107:4002][V=1.E E e F & n 1 B1][} M lR=dev][G=solar-group]
*T & h K Passed
---------- Run automation testcase :: testVersionRuleGray() ----------
Result1 : zuul -> solar-serviceB + 1-a[192.168.0.107:3002][Vq ! H h t u w f C=1.1][R=qa][W V b Z 5 F kG=solar-group] -> solar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solarC - a O-group]
Result2 : zuul -> solar-service-a[192.168.0.107:3001][V=1.0][R=dev][G=solar-group] -> sos P = @ s ]lar-service-b[192.168.0.107:4001][V=1.0][R=qa][G=soM 5  ) N Xlar-group]
Result3 : zuul -&gk l L g J 0 C 4t; solar-service-a[192.168.0.107:3002][V=1.1][R=qa][G=solar-group] -> solF C , G qar-service-b[192.168.0.107:4002][V=1.1][R=dev][G=solarN K L - 4-group]
Result4 : zuul -> solar-service-a[192.168.0.107:3001][V=1.0][R=dev][= = x ! J % $ U MG=d & c C f q b ;solar-group] -> solar-service-0 & l Y Y ` w gb[192.168.0.107:4001][V=1.0][R=qa][G=solar-group]
* Passed

Nacos 测试总结

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

作者介绍

  • 吴毅挺,掌门技术副总裁,负责技术中台和少儿技术团队。曾就: W } & f J f (职于百度、eBai 3 M my 、携程,曾任携程高级研发总监,负责从零打造携程私有云、} } %容器云、桌面云和 PaaS 平台。
  • 任浩军,掌门基础架构部负责人。曾就职于平Z P 3安银行、万达、惠普,曾负责平安银行平台架构部 PaaS 平台 Halo 基础服务框架研发。10 多年开源经历,Git~ ; i S N Nhub ID:@HaojunRen,Nepxion 开源社区创始人,Nacos GP v k - 3 8roup Membes % $ a g 0 + m Ir,Spring Cloud AliJ ` $ # 8 baba & Nacos & Sentinel & OpenTracing Committer。

参与 Nacos 落地的基 + 5 ! r = a础架构部成员,包括:

  • 童子龙,张彬彬,廖梦鸽,张金星,胡振建,谢r i x T S 7 d ! Q璐,谢庆芳,伊安娜

M V ` ; e N I ;阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云6 s 1 . d原生流行技术趋势、云原生大规模的落地实践,T g y ,做最懂云原生开发者的公众号。”