迁移到微服务架构

在这篇文章中,我将介绍我对于一些微服务相关问题的看法。第一个问题是为什么金融科技公司应当把遗留的传统架构应用迁移到现代的架构风格上;其次,如何在这一范式迁移过程中重用现有的应用资产;最后是这种迁移将以何种方式解决这一领域中包括代码质量和重用性在内的一系列令人望而生畏的问题。

一个典型的金融科技公司往往都处于尽早走向市场的压力中,这种压力来源于股东和其他利益相关者。因而类似的公司在早期并不会给予应用架构足够的重视。他们往往采用单体架构建立应用程序。这一架构易于实现,但在增加功能时会形成紧密的依赖关系。这一领域法规、税收结构、许可证和资本要求的频繁变动也加剧了这种混乱状况。为了满足新的相关要求,已经有大量的时间和努力消耗在了重新修改已有应用上。而这经常会引入新的错误并打断现有的功能。在这一应对挑战的过程中,这些公司最终会创建出乱麻一般的代码,并由此导致代码质量的恶化,以及维护噩梦。对于难以适应变化的单体架构而言这种问题会更加严重。

单体架构

单体应用的架构是单层结构,用户接口和数据访问代码都集成在一个平台中。

这种架构的简单性使得最初构建和部署至生产环境的时间消耗非常少。相较于现代的web应用架构,这种架构会提供更高的性能(响应时间),因为在数据库和应用接口之间的层次很少。但即使这样,单体架构仍然缺少一些关键的特性,例如:

  • 敏捷性和可维护性 - 程序单元和代码行数会随着功能的增加而增长。一切都集中在一个程序中。这同样会为业务功能的实现带来巨大的挑战,因为每次修改都必须对应用进行完整的测试。
  • 可用性 - 单体应用程序有更高的风险。因为即使应用程序的一部分发生中断,它也可能会影响整个应用程序并可能导致应用程序崩溃。
  • 可重用性 - 可重用性仅局限于同一层内和同一程序单元中的方法和函数重用。尽管原则上可以在单体应用程序中创建独立模块,但鲜有实现。
  • 可扩展性 - 大多数金融科技公司都从一个细分产品起步,而这只会影响金融业务流程中的一个小环节。即使用户起初并不能快速适应,然而他们一旦开始从这种细分产品中获益,用户数就会逐渐增加。人们非常期望应用程序具有高度的可扩展性以及能够支持高并发使用,同时又不需与最初的用户吞吐量相妥协。
  • 可测试性 - 由于不同程序单元之间存在着复杂的相互依赖性,即使一个微小的功能变化测试,在这种单体应用中都会是一个挑战。

微服务架构

微服务是一种以业务功能为中心的架构风格,而非基于UI,中间件和数据库等技术因素。一个微服务就是一个独立的单元,代表一个模块端到端的功能。一个应用程序包含一个或多个模块。因此,一组微服务就代表了一个应用程序。该体系结构推荐为每个服务设置独立的数据库(基于业务逻辑)。

这种架构的一些主要优点是:

统一团队

它带来了团队组织范式的转变。每一个模块都有一组中间件和数据库开发者以及质量保证(QA)测试员负责端到端的功能开发、测试和服务交付。又因为团队成员会利用不同的技术为同一个模块工作,这种组织方式增强了团队凝聚力、主人翁意识和责任感。

敏捷性

微服务架构能够为构建和管理银行业和金融业应用提供更强的敏捷性。这些应用在本质上具有复杂的设计,需要持续的进化和扩容,能与多种外部和内部系统相集成以及达到多种层次的高安全要求。

维护

相较于维护一个包含了所有功能的大型单一应用,维护独立的微服务要容易得多。每个微服务在源代码库中都是独立开发和维护的。这种分离的架构允许以更快,更高效的方式实现对应用程序的功能更改。这是因为开发一个全新的微服务并不需要很长时间。单元测试和代码审阅也变得非常简单。这种方法最终有助于提高应用程序的质量并减少缺陷。

可用性

在大多数情况下,应用程序对于终端用户都是可用的。因为在单个微服务出现问题的情况下,可以卸载单独的服务,并且可以安装新版本,同时不会导致整个应用程序在维护时段内停机。

可重用性

可重用性有两个方面

  • 服务可重用性 -这是可能的,因为每个微服务设计目的是体现应用程序的一个功能。这为重用不同的功能模块提供了更高的灵活性。例如:证券的定价可以被开发为一个Web服务(模块A,我们称之为PriceService)。它将支持插入或更新证券最新价格的操作。价格可以feed的形式每日从诸如Bloomberg等市场信息来源获取。交易流程处理可以被开发为另一个Web服务(模块B,我们称它为TradeProcessingService)。为了处理已经投资于证券的基金的交易,它需要最新的价格数据。因此,TradeProcessingService服务将在交易处理期间使用PriceService。
  • 代码可重用性 - 服务体系结构本质上消除了代码冗余。现有的遗留技术可以进行逻辑分割,并且每个逻辑单元都能转换为可重用的服务。这样,我们不仅可以提高代码质量,还可以重用我们现有的核心资产,并节省用现代语言重新编写它们所付出的巨大努力。因为基于同一种语言构建所有服务并非必要,所以微服务架构中的单个服务可以用适合他们的语言编写。这种架构的关键优势之一是互操作性,因为微服务是技术无关的。

可扩展性

与传统架构不同,微服务架构天然支持横向扩展,以满足并发用户和交易量的增加。现代微服务平台 - 例如基于Spring引导,Zuul和Eureka组合的平台 - 支持以简单高效的方式水平扩展服务。

可测试性

可测试性会在更大程度上得到改善。行业标准指出,在有良好工程设计的应用程序中,测试占据了成本的40%。如果软件架构师可以降低这个成本,那么回报就会很大。要使应用程序得以适当地测试,必须能够控制每个服务的内部状态和输入,然后观察其输出。基于微服务的体系结构支持这种方法。每个微服务都可以独立于其他部分进行完整的测试。这大大减少了全功能单体应用程序达到可测试状态的等待时间。在上面的例子中,TradeProcessingServicePriceService服务都可以独立开发和测试。

构建微服务架构的成本

基于以上所有观点,我们能否假设微服务架构是未来的方向?事实上,两种架构各有所长。在决定采用这条道路之前,有几个因素需要考虑。其中一些是:

  • 分析现有的复杂混乱的代码,从中分离出业务逻辑,并将他们构建成可重用的,有清晰、严格边界的微服务,完成这些任务的成本非常高昂。你需要一批对当前代码非常了解,并且具有不同技能专长的的开发者协助完成这一转换过程。
  • 从某种意义上说,基于微服务的体系结构的维护比较简单,但它带来了额外的挑战,例如监视单个服务的正常运行时间,管理每个微服务的不同版本(包括运行时和源代码库)。
  • 与基于微服务的体系结构相比,单体应用程序的故障排除相当容易,因为技术层的数量非常有限。现在,在新的架构体系中,服务集群遍布于不同的
  • 因而我们需要构建一个集中的日志记录和审计平台来识别有问题的服务,然后对其进行故障排除。这为今天单体应用支持团队的工作方式带来了变化。
  • 我们应该制定交付政策,定期提供不同版本的微服务。
  • 我们需要应对个别服务故障导致整体微服务组所提供的功能失效的情况
  • 与单体应用相比,微服务需要更多的硬件和计算资源。

未来之路

事实上,迁移到微服务牵涉到风险,努力和成本。但是,如果我们能制定正确的策略,那么从长远来看,应用程序的整体质量将会增加。这是无可否认的。如果没有架构的范式转变,无论我们投入多少资金改进单体应用的质量,投资回报率和收益率将非常小。为了消除这种迁移风险,公司可以考虑先用微服务架构完成新需求的开发,并逐渐将传统模块转变为基于微服务的体系结构。

腾讯云分布式微服务来啦!

腾讯分布式微服务TSF围绕应用和微服务的PaaS平台,提供服务全生命周期管理能力和数据化运营支持,提供多维度应用、服务、机器的监控数据,助力服务性能优化;拥抱 Spring Cloud 开源社区技术更新和K8s容器化部署。

(详见 https://cloud.tencent.com/product/tsf

本文的版权归 所有,如需转载请联系作者。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【编程基础】 linux基础入门--linux为何物?

接触linux是在大二的时候,那时候迷上了嵌入式linux,把电脑换成了linux系统,学习linux基础知识,学习linux命令,学习shell,泡论坛,就这...

393140
来自专栏Java架构

架构的演进,阿里资深Java工程师表述架构的腐化之谜

新技术层出不穷。过去十年时间里,我们经历了许多激动人心的新技术,包括那些新的框架、语言、平台、编程模型等等。这些新技术极大地改善了开发人员的工作环境,缩短了产品...

456100
来自专栏微服务生态

关于分布式调度框架的一些优秀资源总结

http://www.cnblogs.com/zuoxiaolong/p/niubi-job-3.html niubi-job 社区资料少,群(包含作者)活跃...

12820
来自专栏韩伟的专栏

缓存系统在游戏业务中的特异性

本文主要从以下几个方面:电子商务/一般互联网类业务的数据处理流程、游戏类业务的数据处理流程、一般的缓存系统的特点在游戏中的问题、本地分布式缓存服务的特点和优势介...

1.7K00
来自专栏ThoughtWorks

软件测试新趋势 | TW洞见

今日洞见 文章作者/图片来自ThoughtWorks:林冰玉。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网...

442100
来自专栏JAVA技术zhai

架构的演进,阿里资深Java工程师表述架构的腐化之谜

新技术层出不穷。过去十年时间里,我们经历了许多激动人心的新技术,包括那些新的框架、语言、平台、编程模型等等。这些新技术极大地改善了开发人员的工作环境,缩短了产品...

510120
来自专栏Java后端技术栈

新的一年来自一个程序员的反思!

程序员大军鱼龙混杂,水平的高低无法简单的从一个功能完成情况来评定,同样一个需求,功能都可以完成,但是不同程序员完成质量会不一样,完成质量的好坏需要从多方面评定,...

10720
来自专栏Java架构

架构的演进, 阿里资深Java工程师表述架构的腐化之谜

21550
来自专栏小巫技术博客

如何开发一个App

47430
来自专栏云计算

信“云”你就输了,它不仅仅是安全问题

随着亚马逊的网络服务收入在去年达到了50亿美元(正如亚马逊的财务报表所报告的)和Bessimer公司在 2014年170亿美元的云计算收入,可以看出很多公司都...

22500

扫码关注云+社区

领取腾讯云代金券