工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇
导读:Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构。重启开源后,我们不仅看到 ,而且还看到阿里在自身电商开始推进 ,并在 双11 上开始使用 Dubbo 3.0。本文是工商银行基于 Dubbo 构建金融微服务架构的分享,主要讲述了服务发现的应对策略和成果,后续将发布工行大规模服务监控治理的实践,以及从企业角度怎么去对 Dubbo 二次开发等内容。欢迎关注。
背景及概览
基础设施方面,不管是业务系统的服务节点,还是微服务平台自身的工作节点,都已部署在工行的云平台。
服务注册发现方面,除了常规的服务注册中心外,还配合部署了元数据中心,用于实现服务的按节点注册发现。
服务配置方面,通过外部的分布式配置中心,以实现各类动态参数的统一管理和下发。
服务监控方面,实现对服务各类运行指标的统一采集和存储,并与企业的监控平台对接。
服务跟踪方面,主要是用于实时跟踪服务的整体链路,帮助业务系统快速定位故障点,并准确评估故障的影响范围。
服务网关是为了满足传统业务系统访问服务需求,在 Dubbo 服务订阅及 RPC 能力之上,实现了新服务、新版本的自动发现、自动订阅和协议转换能力(HTTP 协议转 RPC 协议),实现 7×24 小时不间断运行。
服务治理平台,提供给运维人员和开发测试人员一个一站式的管理、监控、查询的平台,提升日常服务治理的效率。
最大的挑战
性能容量方面,目前线上服务数(即 Dubbo 概念中的服务接口数),已超 2 万,每个注册中心上的提供者条目数(即每个服务的所有提供者累计),已超 70 万。根据评估,未来需要能支撑 10 万级别的服务数,以及每个注册中心 500 万级的提供者条目数。
高可用方面,工行的目标是:微服务平台任何节点故障都不能影响线上交易。银行的业务系统 7×24 小时运行,即使在版本投产时间窗内,各业务系统的投产时间也是相互错开的,平台自身节点要做升级,如何避免对线上交易带来影响,特别是注册中心的自身的版本更新。
服务发现难点和优化
1. 入门
providers 临时节点:记录该服务提供者清单。提供方下线子节点就自动删除,通过 Zookeeper 的 watch 机制,消费者可以第一时间知道提供者清单发生了变化。
consumers 临时节点:记录消费者的清单,主要用于服务治理时查询消费者。
configurations 持久节点:主要保存服务治理时需要调整的服务参数。
routers:子节点为持久节点,主要用于配置服务的动态路由策略。
分流网络压力:随着服务节点的增多,如果客户端都连接选举节点,对选举节点来说需要消耗大量的 CPU 去处理网络连接和请求。但是选举节点又无法任意水平扩容,选举节点越多,事务投票过程就越长,对高并发写性能是不利的。
降低跨城跨 DC 的注册订阅流量:当有 100 个消费者需要跨城订阅同一个服务,Observer 可以统一处理这部分跨城网络流量,避免对城际间的网络带宽带来压力。
客户端隔离:可以将几个 Observer 节点专门分配给某个重点应用使用,保障其网络流量隔离。
2. 问题分析
随着服务数量以及服务提供者节点的增加,服务推送的数据量会呈爆炸式增长。举个例子,一个服务有 100 个提供者,当提供者启动的时候,因为 Zookeeper 的 CP 特性,每上线一个提供者,消费者都会收到事件通知,并从 Zookeeper 来读取这个服务的当前全部提供者的列表,然后刷新本地缓存。这个场景下,理论上每个消费者总共收到了 100 次事件通知,并从 Zookeeper 读取了 100 次服务提供者列表,1+2+3+...+100,总计 5050 条提供者数据。这在业务系统投产高峰期问题尤为突出,容易导致 Zookeeper 集群的网络被打满,造成服务订阅效率极其低下,并进一步影响了服务注册的性能。
随着写在 Zookeeper 上节点数量的增多,Zookeeper 的 snapshot 文件也不断变大,每次 snapshot 写入磁盘,会出现一次磁盘 IO 冲高。投产高峰期,因为事务量大,写 snapshot 文件的频率也非常高,这对基础设施带来了较大的风险。同时 snapshot 文件越大,也预示着 Zookeeper 节点故障后恢复的时间越长。
当 Zookeeper 选举节点发生重新选举后,Observer 节点都要从新的 Leader 节点同步全量事务,这个阶段如果耗时过长,就很容易导致连接在 Observer 节点上的客户端 session 超时,使对应 providers 节点下的临时节点全部被删除,即从注册中心角度看,这些服务都下线了,消费者端则出现无提供方的异常报错。紧接着,这些提供者会重新连接 Zookeeper 并重新注册服务,这种短时间内大批量服务的注册翻转现象,往往带来更为严重的服务注册推送的性能问题。
3. 优化方案
1)订阅延迟更新
2)Multiple 模式
3)按节点注册
配置中心:主要用来存储节点级别的动态参数,以及服务的原来写在 Zookeeper 上的 configurations 和 routers 这些持久节点的数据。
元数据中心:存储节点元数据,也就是每个服务节点名称(也就是 applicaiton-name)和其提供的服务的映射关系,以及每个服务的类定义信息,比如每个方法的输入输出参数信息。
注册中心:此时注册中心则只需要存储服务提供者节点名称和实际 ip 端口的关系。
未来的规划
更多企业落地实践内容,可下载云原生架构白皮书了解详情!点击【阅读原文】即可下载!