新网银行微服务转型实践

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: Dubbo 开发者日活动成都站本文整理自谢延泽先生在 Dubbo 开发者日成都站活动中的演讲,主要分享关于微服务转型的内容,也总结一下这些年作者在微服务领域的一些经验。2012 年 James Lewis 在波兰第 33 次 Degree in Kraków 会议上分享了一个案例,名称是 “Micro Services - Java, the Unix Way”。

lADPDgQ9rPAlxufNAQ_NAmw_620_271_jpg_620x10000q90g

Dubbo 开发者日活动成都站

本文整理自谢延泽先生在 Dubbo 开发者日成都站活动中的演讲,主要分享关于微服务转型的内容,也总结一下这些年作者在微服务领域的一些经验。

lADPDgQ9rPAlxunNAtDNBQA_1280_720_jpg_620x10000q90g

2012 年 James Lewis 在波兰第 33 次 Degree in Kraków 会议上分享了一个案例,名称是 “Micro Services - Java, the Unix Way”。在这个分享里,James Lewis 分享了在 2011 年中参与的一个项目中所采用的一系列实践,以 UNIX 的哲学重新看待企业级 Java 应用程序,并且把其中的一部分称之为“ Micro-Services ”。总结了五大特征:
Small with a single responsibility —— “小到只有单一原则”

  • Containerless and installed as wellbehaved Unix services —— “去容器化并且作为 Unix Service 安装”
  • Located in different VCS roots ——“分布在不同的版本控制代码库里”
  • Provisioned automatically ——“自动初始化”
  • Status aware and auto-scaling ——“关注状态和自动扩展”

2014 Martin Fowler 试图将 James Lewis 的微服务定义进行一般化推广,使其不光可以在不同的语言架构和技术栈上使用。又可以兼顾敏捷、DevOps 等其它技术,成为一个架构的“最佳实践”集合。提出 9 大特征:通过服务组件化、围绕业务能力组织、是产品不是项目、智能端点和哑管道、去中心化治理、去中心化数据管理、基础设施自动化、为失效设计、演进式设计

2016年 Sam Newman 《Building Microservice》4个特征 7大原则。

4 大特征:可以独立部署。通过网络通信。对消费方的透明。尽可能降低耦合,使其自治。

7 大原则:围绕业务概念建模、接受自动化文化、隐藏内部实现细节、让一切都去中心化、可独立部署、隔离失败、高度可观察。

lADPDgQ9rPAlxurNAtDNBQA_1280_720_jpg_620x10000q90g

这里澄清一个观点,在工作过程中偶尔会听到某些同学说,我使用了 Dubbo ,使用了 spring-boot ,或者使用了 Spring-Cloud ,我开发出来的系统就是微服务。个人观点,微服务是一个架构风格或者架构原则,与实现系统的框架无关。比如:一个系统满足了上面的特征和原则,使用 WebService 通讯,难道就不是微服务吗?当然实际实施过程中应该选择一个轻量级的通讯框架。

lADPDgQ9rPAlxuvNAtDNBQA_1280_720_jpg_620x10000q90g

微服务从 2014 年在国内开始传播,到现在已经有 5 年时间里,关于微服务的优点论述的文章有很多,比如逻辑清晰、简化部署、可扩展、灵活组合、技术易购、故障隔离等等这就不做详细展开。

全面微服务化带来的挑战

lADPDgQ9rPAlxuzNAtDNBQA_1280_720_jpg_620x10000q90g

1. 可用率降低

全面微服务化之后,原先的单个应用可能会拆分为多个独立进程。为避免进程之间争用资源,一般公司都会独立部署,即单个虚拟机内只部署一个 jvm 进程。由此带来了更多服务器、网络设备、安全设备,这些硬件设备的可靠性都会影响到业务连续性。

服务跨进程间通讯,必然要选择一种通讯协议、序列化框架,额外引入的代码可靠性也会对整体的可用性造成影响。
因此,微服务的设计是需要面向故障进行设计,在设计要考虑重试、幂等、故障隔离、熔断、降级等等。

2. 事务复杂度

微服务拆分后,虽然按照领域模型做了解耦,但不可避免会带来分布式事务问题。目前分布式事务在社区也有一些解决方案和开源框架,方案有基于消息队列最终一致、TCC 分布式事务框架以及自动化的分布式事务框架,例如 Seata 等,但分布式事务的处理,对开发人员设计要求比较高,使用成本较高。

lADPDgQ9rPAlxu7NAtDNBQA_1280_720_jpg_620x10000q90g

在拆分的时候,建议还是尽可能避免分布式事务,引入分布式事务框架要评估成本和收益。

3. 运维复杂度

当一个单体应用拆分为多个微服务之后,应用数量会大幅增加。如果没有一个可靠稳定的运维平台或资源编排平台(如 k8s ),全面微服务化,对运维就是一个灾难,工作量的大幅增加,直接会影响系统稳定性进而影响到业务连续性。
lADPDgQ9rPAlxvHNAtDNBQA_1280_720_jpg_620x10000q90g

4. 调试优化复杂度

应用拆分后,业务调用关系变复杂,调用链整体变长。如果没有一套合适的调用链追踪平台,很难定位到整个系统的性能瓶颈,调优成本很高。另一个问题是,生产环境业务数据异常时,由于调用链过长,如果没有规范的 Request、Response 日志,很容易造成各服务之间相互甩锅,难以定位问题。全面微服务化之后,由于众多的服务节点,调优排查错误更加依赖于日志平台,高性能的日志平台也会提高效率。

lADPDgQ9rPAlxvPNAtDNBQA_1280_720_jpg_620x10000q90g

5. 测试难度

在单体应用的时候,调用链路短,一般都是做黑盒测试,测试人员无需了解复杂的业务实现。而进行微服务改造后,单个业务可能会由多个服务组合编排完成,如果继续做黑盒测试,意味着必须等待所有服务开发完成之后才能进行,导致测试周期边长、定位困难,做边界测试需要更多的测试用例才能覆盖,测试整体成本会变高。这种情况下,单元测试、单系统测试的重要性就凸显出来了。如果需要做单系统测试,可能需要 mock 被调用的服务,通讯协议使用 http 还好,社区有很多开源的框架可以使用。如果是 RPC 框架,意味着需要准备一套好用的 mock 测试系统才能支撑单系统测试。

lADPDgQ9rPAlxvbNAtDNBQA_1280_720_jpg_620x10000q90g

6. 聚合查询

在领域建模的时候,一般是按照用户角度去划分,而运营需求与用户需求天生不是一个维度的。举个例子:按用户维度领域建模,会划分用户服务、订单服务,用户和订单数据存储在不同的数据库,假设运营有一个需求是查询某个年龄段用户的订单,在用户达到千万级的时候,这种需求对微服务体系是个灾难。需要一个强大的大数据平台对数据按业务维度进行聚合,才能满足运营的查询需求和报表功能。
lADPDgQ9rPAlxvjNAtDNBQA_1280_720_jpg_620x10000q90g

微服务拆分原则

lADPDgQ9rPAlxvvNAtDNBQA_1280_720_jpg_620x10000q90g

微服务拆分原则中,特别需要提到的是康威定律。

康维定律简单来说就是系统设计(产品结构)等同组织形式,每个设计系统的组织,其产生的设计等同于组织之间的沟通结构。如果单个服务由不同组织管理,需求无法达成统一,面临着令出多头、需求干扰的风险。

伸缩需求,同一个进程之内的不同业务功能,有时在业务量方面会出现较大的差异,具体要求的进程数量会有较大差别,这样的模块锁定在同一进程之内,势必会造成资源的浪费。

部署频率,同一个交付物内不同的组件有着不同的上线频率,会大大的提高上线流程的发生频率,会造成较大的人员浪费。

修改的相关性,如果同一交付物内的不同组件,经常会被同步修改,这可能说明,如果发生拆分,这两个模块应该是”在一起“的。

领域建模,针对业务领域,引入限界上下文(Bounded Context)和上下文映射 (Context Map)对业务领域进行合理的分解,识别出核心领域(Core Domain) 与子领域(SubDomain),并确定领域的边界以及它们之间的关系。依据核心领域和子领域划分微服务边界。

对于一个单体应用,拆分过程应该是循序渐进、逐步拆分、由简到繁、由粗到细,是一个渐进的过程。例如先将有明显边界的业务拆分为独立服务,无法明细边界的先混在一起,等业务需求逐步清晰后再拆。拆分时先拆分为几个相对较粗粒度的服务,根据业务需求情况,逐步将粗粒度的服务中相对稳定,可以沉淀的业务拆分为独立服务。在这个过程中,原有的单体应用也可以承担部分兼容能力,在改造完成前,不对外部系统造成过大的影响。
lADPDgQ9rPAlxvzNAtDNBQA_1280_720_jpg_620x10000q90g

微服务的拆分是跟业务需求强相关的,如果业务需求变更不多、相对稳定,处理的请求并发量不高,单体应用的稳定性和可维护性更好,更加适用。

总结

微服务不是银弹,是用来处理海量用户、业务复杂和需求频繁变更场景下的一种架构风格。引用一句话“好的架构是演化出来的,而不是设计出来的”。任何一种架构的引入,都会带来利弊两个方面的影响,如何平衡才最重要。

四川新网银行是全国三家互联网银行之一,于 2016 年 12 月 28 日正式开业。新网银行注册资本 30 亿元,由新希望集团、小米、红旗连锁等股东发起设立,是银监会批准成立的全国第七家民营银行,也是四川省首家民营银行,同时也是全国第二家获得国家高新技术企业认定的银行。新网银行坚持“移动互联、普惠补位”的差异化定位,以及“数字普惠、开放连接”的特色化经营,着力打造成为一家数字科技普惠银行,依托领先的金融科技能力、稳健的大数据风控技术和高效的互联网开放平台运营模式,服务小微群体、支持实体经济、践行普惠金融。截止目前服务用户数 2900 多万,累计放款 9000 多万笔。
lADPDgQ9rPAlxv3NAtDNBQA_1280_720_jpg_620x10000q90g

作者信息:谢延泽,目前就职于新网银行,负责技术中台建设,核心系统技术架构设计。关注云原生领域,探索在金融行业实践思路。

相关文章
|
2天前
|
监控 持续交付 API
深入理解微服务架构:从设计原则到实践应用
深入理解微服务架构:从设计原则到实践应用
|
9天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
33 5
|
12天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
7天前
|
Kubernetes API Docker
构建高效后端服务:微服务架构的深度实践与优化####
本文深入探讨了微服务架构在现代后端开发中的应用,通过剖析其核心概念、设计原则及实施策略,结合具体案例分析,展示了如何有效提升系统的可扩展性、可靠性和维护性。文章还详细阐述了微服务拆分的方法论、服务间通信的最佳实践、以及容器化与编排工具(如Docker和Kubernetes)的应用技巧,为读者提供了一份全面的微服务架构落地指南。 ####
|
10天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
12天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
13天前
|
监控 API 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势、面临的挑战以及最佳实践策略。不同于传统的单体应用,微服务通过细粒度的服务划分促进了系统的可维护性、可扩展性和敏捷性。文章首先概述了微服务的核心概念及其与传统架构的区别,随后详细阐述了构建微服务时需考虑的关键技术要素,如服务发现、API网关、容器化部署及持续集成/持续部署(CI/CD)流程。此外,还讨论了微服务实施过程中常见的问题,如服务间通信复杂度增加、数据一致性保障等,并提供了相应的解决方案和优化建议。总之,本文旨在为开发者提供一份关于如何在现代后端系统中有效采用和优化微服务架构的实用指南。 ####
|
15天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
6天前
|
负载均衡 Cloud Native 持续交付
云原生时代的微服务架构:优势、挑战与实践
云原生时代的微服务架构:优势、挑战与实践
14 0
|
6天前
|
存储 监控 负载均衡
构建高效微服务架构:服务治理与监控的实践
构建高效微服务架构:服务治理与监控的实践