背景介绍
富融银⾏是⼀家⽴⾜于⾹港,⾯向全球业务的虚拟银⾏,创立以来先后斩获 2021 年 - 杰出虚拟银行服务大奖、2022 年 -[领航 9+2 粤港澳大湾区奖项] 粤港澳大湾区最佳银行 等荣誉。
富融银⾏以⼤数据、云计算等技术为驱动,为用户提供存款、贷款、转账、理财、营销等⼀站式的⾦融服务。
富融银行的核⼼系统是处理银⾏业务存款、贷款和中间件业务等最基本业务的 IT 系统。为了⽀持银⾏业务的⾼速发展,核⼼系统涵盖了外购、⾃研 2 ⼤类系统,其中外购系统不具备⼆次开发能⼒,需要供应商⽀持。
为了保障业务的持续发展,需要改进核⼼系统服务治理⽔平,来应对业务挑战和⾦融监管,因此核⼼业务需要引入服务治理组件,能够平滑顺利地解决容灾、系统集成、流控、服务发现、服务治理、故障容错等问题。接下来,我们来看看富融银行是如何应对挑战,实现业务系统升级的。
挑战重重,迎难而上
随着业务不断扩展,自研系统 + 外购系统带来了一定的挑战:通讯协议上的多样性,报文格式的差异,云上的安全机制,混合云的容灾机制等,北极星的到来,帮助核心研发团队低成本高效率应对上述各种挑战。
挑战一:异构系统,集成难度高
上面提到过,为了⽀撑银⾏业务发展,核心系统涵盖了外购、⾃研 2 ⼤类系统,外购系统不具备⼆次开发能⼒,需要供应商⽀持。
核⼼服务供应商 A 适配各种银⾏的集成需求,提供私有化 RPC 协议解决模块之间的调⽤,提供服务⽹关解决外部系统的调⽤问题。核⼼服务供应商 B,基于 Spring 体系,提供基于 Http+Json 的通讯协议,并基于 Netty 定制 Http 组件,便于配置。
但不同供应商系统再加上⾃建系统,增加系统集成难度:
● 通讯协议:为了⽀持多种协议接⼊,需要引⼊各种组件库,⾯临依赖冲突,版本冲突等问题。
● 报⽂格式:不同⼚商使⽤的报文格式有差异,给验签、加密带来额外的复杂度。
解决方案:集成北极星,提高效能
接入方式和版本选择
北极星社区提供多种数据面,能够很好地兼容现在主流的技术栈,目前富融银行核心系统使用的是 Spring Cloud Tencent、Spring Boot Polaris 和 Polaris Java SDK。
● Spring Cloud Tencent
基于 Spring Boot 体系开发的服务全部使⽤ Spring Cloud Tencent,其中,Spring Boot 选用 2.4.5 版本,Spring Cloud Tecent 选用 2020.5 版本。统⼀版本,可维护性⾼。
● Polaris Java SDK
没有使用 Spring Boot 体系的服务,需要在开发框架中集成 Polaris Java SDK。我们参考 Spring Boot Polaris 实现了服务和 Polaris Java SDK 的集成插件,必须通过插件进行服务发现和路由,选择性进行服务注册,低成本地接⼊北极星体系。⽆法使⽤ SDK 进行服务注册的服务,可以在北极星控制台上注册。
北极星集成
使⽤统⼀的 polaris.yml,统⼀北极星服务接⼊、就近路由、降级措施和主动探测机制。
引⼊统⼀的 pom 依赖,管理⾃定义组件和北极星版本。
系统集成
● 传输协议强制使⽤ https,⼀来保证云上数据安全,⼆来在⽆论⽹络策略多复杂,https 是主流协议,不受影响。
● 使⽤ OpenFegin 组件统⼀接⼝外调、⽇志打印、脱敏和签名。
● 引入网关收拢流量。
● 封装 api ⼯程,包含 DTO 定义和 FeignClient 定义。⼀次定义,多处复⽤。通过 DTO 约束,有效解决 json 弱类型的问题。
改造结果如下:
挑战二:容灾机制依赖内部负载服务,手段单⼀
⾹港银⾏同业结算有限公司 (HKICL) 要求所有接⼊转数快 (FPS) 的⾦融机构实现 MQ 队列的⾃动容灾。在主队列出现异常时,能在 5 分钟之内切换到备⽤队列。
早期设计思路是⽆法做到⾃动切换队列的场景。
● 依赖业务系统的端⼝探测进⾏切换,只能应对运维发布场景。
● 接⼊服务不感知队列是否正常,⽆法将调⽤结果上报到负载均衡服务 (L5),只能让运维通过告警发现。
解决方案:前置接入服务改造
● 利⽤上报机制,能根据调⽤结果,及时熔断不可⽤服务。
● 通过探测机制,扩展 MQ 探测插件,在流量不⾜的情况下,及时熔断异常队列。
● 基于路由功能,根据权重将流量分配到不同的队列上。
● 通过运维控制台,主动切换流量。在不影响客户的情况下,进⾏系统加固、容灾演习和专线升级。
新服务的架构变为:
默认情况下同机房 80% 流量、跨机房 20% 流量。保证在队列异常、专线异常、转发服务异常时,服务不中断。
玩法探索
北极星丰富的服务和流量管理能⼒,给了我们更多的选择。
● ⽹关增强:SpringCloudGateway + 北极星
⾦融业务上公有云,需要考虑后云上安全,需要加密传输、数字签名等机制,直接修改外购系统不现实。折中⽅案是将这些系统,放在严格管理的区域,然后开放有限⼊⼝对外提供服务。⽹关可以作为服务⼊⼝承担此任务。北极星提供 spring-cloud-tencent-gateway-plugin 插件打通 SpringCloudGateway (简称 SCG) 和北极星,将北极星的服务治理能力与⽹关集成在⼀起。⼀旦服务能注册到北极星上,SCG 就可路由到对应服务。如果外购系统不⽀持⾃动注册到北极星,可使⽤⼿动注册 + 北极星主动探测的机制,及时熔断异常服务。
北极星维护服务对应的 IP 列表,可以借此做授权管理。通过 服务名 ->[⽩名单 URL]、服务名 ->[⿊名单 URL],可有效控制流量。IP 地址的变更与服务注册完美绑定在⼀起,⽆需再⽹关⼿动维护。
● 公⽹服务治理:Http 代理 + HttpClient+SCT + 北极星
默认情况下,北极星服务中的 IpPort 就是被调⽅地址。
在特定业务中,需要与公⽹服务进行通讯。服务方或者提供 IpPort 或者 URL。如果 IpPort,可直接使⽤北极星负载均衡。但如果是 URL 则需要引⼊ Http 代理服务器。
内网的主调⽅通过代理服务访问被调⽅。容灾可在主调⽅处理,也可以通过 http 代理服务应对。考虑到运维统⼀性,选择通过北极星进⾏管理。默认情况下北极星路由地址是 http 代理地址,因此需要重写访问地址。利⽤ ApacheHttpClient 提供的 DefaultRoutePlanner,可解决此问题。通过重写 DefaultRoutePlanner 的 determineProxy 接⼝,达到 返回实际代理 (proxyHost) 并重写⽬标地址 (targetHost)。
此外利⽤北极星 SDK ⾃带的探活机制,定期检查链路,在链路 (Http 代理 -> 专线 -> 被调⽅) 出现任何异常时,都可切换到可⽤链路。
总结
北极星是腾讯新⼀代服务治理的核⼼组件,它的到来极⼤改善了富融银⾏核⼼业务的服务治理⽔平。促使富融银行逐步摆脱了私有化的⼚商 RPC 协议,以统⼀的 Https/Http+Json+Fegin 模式降低系统间的集成难度,北极星灵活可靠的路由规则,低成本的⽀持银⾏容灾演练,上报与探测功能,也保证了服务的可⽤性。
借由这个机会,向北极星开源团队表示感谢。当我们摸索北极星,开源团队积极耐⼼回答我们的疑惑。我们提出的建议,也能得到团队回应。
从 2011 年到现在,⻅证了开源北极星的诸多变化,基础功能不断优化,⽂档质量逐步提升,企业级功能逐步完善,对运维⼈员也越来越友好,开源的道路上,愿它乘⻛破浪。