基于统一开发平台的微服务架构转型升级之路 | 某国有大型银行案例

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

引言:

某银行是一家国有大型银行,从2016年开始采用了我们的SOA开发平台作为基础Java开发平台。

2018年,我们发布了新一代微服务开发平台EOS Platform 8,而其正在谋求技术架构转型升级,正好借助我们的新一代微服务开发平台,对已有的SOA架构技术平台进行升级。

作为该银行Java开发平台项目的架构师,本文我为大家分享其统一开发平台技术架构转型升级的历程,并结合银行重点项目——公司客户营销系统的案例,向大家讲述微服务项目建设的一些实践经验,希望给正在或即将进行微服务架构转型的企业得到一些启发。

目录:

1、统一开发平台建设历程

2、微服务架构落地的关键点

3、基于平台应用实践

4、总结

1.统一开发平台建设历程

建设背景

ac89ab2841dc79a13e39ba0062e513c4dd4111fa

在经济新常态下,国内商业银行正面临持续加深的市场化改革和互联网金融大潮的双重挑战。同时,国家日益重视银行业信息科技风险防范和管理工作,提出信息系统“安全、可控”的战略目标。为应对新经济形势下的新挑战和“自主、可控”的新任务,银行业需要从以下两方面来提高自身IT建设能力:

第一,在IT管理层面,银行需要建立统一管控体系,实现项目集中化管理、提升自主掌控能力,降低系统运行和维护风险;

第二,在架构层面,银行需要统一的技术路线、技术架构和数据标准,不断积累可复用的企业资产,提升系统快速交付能力。

建设过程

ac28a850896700b2a6e35e1e48ecc7a705973aa5

该银行在自主创新上起步很早,长期以来一直坚持走国产化和开源软件的道路。

该银行自2016年开始围绕普元EOS+BPS+BIIP进行SOA架构Java开发平台建设;2017年初发布Java开发平台1.0版本,截止到2018年,已经由40多个系统基于Java开发平台建设和上线运行; 2017~2018年,围绕Java开发平台,建设开发运维标准规范、技术可研标准规范、开源技术选型标准规范、培训及考试认证体系。

但是传统的SOA项目开发周期长,弹性伸缩能力弱,系统内外间耦合程度高,无法从根本架构上满足银行向互联网银行转变的需求。作为银行自主创新的核心,Java开发平台技术架构亟待转型。所以从2018年起,借助我们的新一代微服务开发平台,实现技术架构升级,并引入Devops提升系统开发运维一体化能力。

2.微服务架构落地的关键点

微服务落地关键技术选型

9613eb6d9a52e85da1d58f4bf509d98ffe9a455f

在当前市面上存在多个流行的微服务框架,要在框架中选择一款适合自己的微服务框架。在普元,通过对多个微服务框架进行比较,最终选择了SpringCloud作为基础的微服务框架。

其中以

 ●  Eureka作为服务注册中心
 ●  SpringBoot作为服务容器
 ●  SWAGGER作为在线文档自动生成+功能测试
 ●  Apollo作为配置中心,来提供配置的热更新功能
 ●  使用Vue+IviewUI来支撑前端工程模块化的开发

 ●  使用Skywaking作为微服务的监控

前后端分离明确分工

35b3e00118d00b6a7e7f77792c90564d982a5886

在开发方式上,使用前后端分离的开发模式。在传统的开发模式中,开发人员极需要关注后端逻辑的开发,还需要关注前端页面的开发,开发职责比较混乱。

前后端分离的开发模式:前端倾向于呈现,着重处理用户体验相关的问题;后端则倾向于业务逻辑、数据处理和持久化等。在设计清晰的情况下,后端只需要以数据为中心对业务处理算法负责,并按约定为前端提供 API 接口;而前端使用这些接口对用户体验负责。

与此同时,前端可以根据用户不同时期的体验需求迅速改版,后端对此毫无压力。同理,后端进行的业务逻辑升级,数据持久方案变更,只要不影响到接口,前端可以毫不知情。

在前后端分离的开发模式下,前端和后端应该以前端为主导。为什么呢?因为前端开发人员会受到项目/产品经理或客户的直接影响:这个地方应该放个按钮,那个操作应该这么进行等等。前端还要与美工对接:这样的设计不好实现,是否可以改成那样。客户要求必须这么操作,但是这个设计做不到,所以前端还要跟后端对接:对于某些应用,甚至是多个后端。因此前端可以成为项目沟通的中心,比后端更合适承担主导的角色。

高可靠高可用确保服务稳定

caece2fafddd957d5d0fa36851451c8979fe48e3

在微服务架构下,所有的服务均为无状态的。所谓的无状态是指对单次请求的处理,不依赖其他请求;也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息。使用无状态的服务, 服务实例可以进行多节点的实例的部署。

在我们的微服务架构中所有的服务节点均使用MM双节点配置,并可以进行多节点扩展,来达到服务的高可用高可靠。

持续发布,快速发布微服务应用

7477e3703fe7e5a244800d2b2ee7987837b40f57

在微服务的架构下,持续发布我们面临的两大问题:

1、部署流程的多样性

2、应用会被拆分成多个微服务,部署到多n个节点。如何做到微服务的持续发布,快速响应

首先我们将任务进行原子化(如:组件的编译、打包、数据初始化、部署等每一项定义为一个任务),这些任务可进行任意的编排。

其次我们通过定义发布流水线,用户进行发布流程编排,直接设置环境中部署任务(在部署任务中设置具体的组件部署方式,部署配置)、编排环境的顺序等进行自由的持续发布。

多策略部署,实现应用快速切换

087ade086970ca356f5cf514907863c57d9216bb

针对微服务应用的快速切换,我们提供多策略的部署方式:

1、滚动升级做灰度发布,对外接口保持不变

2、蓝绿切换,对外接口不变

3、API多版本,对外接口发生变化

3.基于平台应用实践

Yes Or No, 微服务架构的优势与挑战?

b3a4ac9689cf078c536d12211fd01cc4fae3f4f0

第一个需要思考的问题,就是我该不该采用微服务架构来实施这个项目。回答该不该,首先来看看微服务架构有那些优势,对我提出了哪些要求,我需不需要它的这个优势,又能否解决它的问题

微服务的优势很明显,显著的有以下几点:

1、微服务业务功能简单,功能边界清晰,易于开发、理解和维护

2、每个服务可以由专门的开发团队开发,自由选择技术栈,如数据库、编程语言

3、服务间调用采用的API接口,只要接口不变,内部调整对其他微服务透明

4、微服务无状态部署,通过注册中心自动发现,可以新增或者移除服务实例按需弹性伸缩,横向扩展很容易

5、单个微服务十分轻量,启停速度很快,且便于持续自动化部署

6、每个微服务都是独立部署,技术栈选择自由,所以可以独立演进

但同样的它也给项目实施和运维人员提出了更高了要求:

1、开发测试阶段,因为涉及服务依赖,而依赖服务如果没有就绪,需要编写Mock或者挡板

2、微服务架构是天生的分布式架构,而分布式有它固有的复杂性,如网络延迟、分布式事务、容错等

3、微服务数量多,分散在众多节点上,对他们的运维监控成本大幅提升

4、虽然发布单个微服务很容易,但是一个微服务项目往往包含众多微服务实例,且服务依赖对服务启动顺序有要求,整个应用的发布相比单体应用反而要复杂

5、一个业务请求牵涉多个服务间调用,出现问题后,如果没有集中日志收集、调用链路跟踪,定位问题相比单体应用要困难的多

Yes Or No, 那些系统适合采用微服务架构?

ca87c965d1ad0fd687918f9cbee5424b395ff0eb

根据上述微服务架构的优点和要求,我们可以知道微服务架构并不是万能的,有它适合采用的系统,这些系统包括:

1、对于业务流程较为复杂,且业务会逐渐变得更加复杂的系统,单体应用将十分庞大,后期难以修改和维护,应考虑使用微服务架构。

2、为了满足业务需求,项目中引入了众多的技术栈,中间件,单体应用会给开发者带来很大的困扰,应考虑将应用拆分成多个独立部署的采用最优技术栈实施的微服务。

3、高并发的,有高可用和弹性伸缩需求的系统,往往是那些面向庞大数量互联网用户的平台类、交易类系统,应考虑利用微服务架构便于横向扩展和弹性伸缩的特性。

4、单体应用版本发布成本高,而单个微服务的变更和发布都很容易,那些有高频率版本发布需求的系统,应使用微服务架构。

5、没有数据实时强一致要求,可接受数据最终一致的系统,可使用微服务架构。

How,单体到微服务怎么拆?

e468235426272cade3babff6f5c28c95acbe80c5

经过一番比对,这个项目适合采用微服务架构。那么该怎么对项目进行服务拆分呢,拆分到什么粒度为止呢?

18年初,某银行使用微服务开发平台建设公司客户营销项目,首先面临的问题就是微服务如何拆分,结合我们的经验,提出了以下5个拆分原则:

1、按照业务拆分

按照业务来拆分微服务是很自然的,将同类业务划归一个微服务,有利于开发人员理解需求和开发(不同的业务由不同的开发人员来开发),同时清晰的功能边界天生具有高内聚的优点,避免了微服务间频繁的远程调用,提升了性能和稳定性。

2、按照请求数拆分

某些服务被频繁调用,而某些服务很少被调用,频繁调用的服务可考虑与很少被调用的服务隔离出来独立部署。

3、常变与不变

某些服务可能很频繁的因需求的变更而频繁发布新版本和上线,为避免影响那些不变的服务,这些频繁变化的服务应当隔离出来独立部署。

4、避免过度拆分

如果发现某些服务频繁的相互调用,说明这两个服务所属的业务由很紧密的耦合关系,考虑合并为一个服务。

5、避免分布式事务

如果服务间存在多方更新的情况,即A调用B,A又调用C或者B又调用C,B和C均要更新数据库,且B和C要求同时成功或者同时失败,则出现了多方更新,应考虑合并B和C。

How,微服务怎么开发?

7a37c6fc0bea7fcfb0a4dcb9fe50bfd3f1cc6b4e

微服务划分完了,是不是可以进入开发了呢? 进入开发前,首先要看一看平台提供了那些基础能力,这些是不需要重复去开发的。

我们目前在这家银行正在建设的微服务开发平台,建设有包括微服务开发IDE、服务注册中心、配置中心、API网关、认证鉴权中心、日志中心、管理监控中心等基础服务组件,项目组只需关心自身业务微服务的开发。

采用敏捷开发模式,每个微服务组件开发由1到2人负责,每日通过持续集成日构建,快速迭代开发。

公司客户营销项目也是基于微服务开发平台进行建设,建设中做了以下约定:

1、前后端分离+Rest通信,前端采用Vue,后端采用Spring Boot,Rest+Json通信;

2、使用平台提供的API网关统一接入,前后端通信、系统间的服务调用都要经过API网关,网关上做负载、限流、调用认证鉴权中心服务做用户身份认证和权限校验;

3、Rest服务返回的对象统一,包含Http Status状态码和消息体,Service和Ctroller直接抛出业务异常,业务异常统一为一种类型的运行时异常,通过Spring MVC的统一异常处理机制,向前端返回状态为200包含异常提示信息的结果(之所以返回200,是因为业务异常属于用户输入导致的,服务正常工作,避免熔断计数和降级);

4、采用JWT+Redis做身份认证和权限校验,JWT token在HTTP Header中传递,Redis中存放注销后的token,解决用户注销后Token未过期的问题。 并且在网关上增加拦截器,对用户Token做过半刷新;

5、对数据库做了拆分,微服务访问自己的数据库。 数据源配置存在配置中心集中管理,但是不做热更新,需要微服务重启后才能生效。

How,微服务怎么测试?

098369b9b26702f783cc05dab02936a407aeb44b

开发伴随着测试,没有经过测试的代码等于是无效代码。微服务的测试与单体应用不同,前后端、服务间都是Rest接口,如果A服务依赖了服务B,而服务B还没有开发完成怎么办?

公司客户营销项目时,微服务之间有依赖关系,为了不受依赖服务的制约,在双方商定好Rest接口后,由服务提供方开发Mock服务,供消费方使用, Mock服务同样注册到注册中心。

开发人员使用Postman自测自己开发的服务。

版本发布人员专人负责每日构建,利用Jekins+Maven+SonaQube自动执行单元测试和代码检查。

开发后期,测试人员利用LoadRunner和Jmeter做压力测试。

How,微服务怎么发布?

46aed27d4e9ef9c51ca418f4a0c4366b9a77106d

在该银行公司客户营销项目建设过程中,使用我们的Devops平台,对微服务做每日构建和自动发布。

Devops平台在开发测试环境上搭建一套,为不同项目组开通租户即可使用。Devops持续集成的技术栈使用的是Jenkins+Maven+Nexus+SonarQube。在Devops前端页面上创建自动部署计划,利用Ansible脚本,将打出的部署包自动部署在目标机器上,自动启动。

前端项目自动发布在Nginx,后端微服务打包成Fatjar发布到目标服务器上,利用Spring Boot内置容器Tomcat启动。

#目前这套环境仅在开发测试环境上使用。

How,微服务怎么监控?

46aed27d4e9ef9c51ca418f4a0c4366b9a77106d

公司客户营销项目利用平台提供的日志中心(ELK技术栈)做日志集中收集和分析。 平台自动记录全局流水号、请求流水号和响应流水号到日志文件,Filebeat与微服务部署在一起,收集到的日志首先发送到Kafka集群,Logstash从Kafka获取日志记录,经过过滤、加工(补充了几个索引字段,如类型)后发送到ElasticSearch,最后从Kibana上呈现。

采用开源软件Skywalking实现微服务调用链路跟踪、服务进程JVM、线程和负载的监控。平台提供了管理监控页面,从ElasticSearch中获取监控信息,在Governor页面呈现。

对于项目中自定义的一些业务监控,项目组自行组装消息发送到MQ,利用该银行自有的业务监控平台,集中展示。

4.总结

微服务架构是当前互联网公司普遍采用的技术架构,且正在快速地延伸到互联网金融行业。微服务架构技术优势明显,但技术门槛较高,我们的新一代微服务开发平台整合一系列优秀开源技术,形成一套微服务架构落地的最佳实践,帮助某银行安全快速地实现了技术架构的一次转型升级。

精选提问:

问1:Eureka不更新了,为什么还选这个?

Eureka 用的是1.x版本,2.x的版本不再开源,但是我们目前不需要他。

问2:选择Skywalking有做过选型评估吗?

答:Skywalking与Pinpoint做过技术选型,在功能上Skywalking更强,比如Skywalking可以做到方法级的调用链路跟踪,Pinpoint只能做到系统级。

问3:Devops平台与技术开发平台是如何有机结合的?

答:DevOps平台与技术开发平台并没有直接的关联关系。技术开发平台更多关注的是开发阶段,而DevOps是关注整个软件生命周期。DevOps平台可以使用技术开发平台的相关资源(比如使用源代码、相关文档等),将这些成果进行后续操作(比如源代码的的编译打包,进行持续发布等等)。

问4:不要logstash直接用Filebeat可以吗?

答:用Logstash是为了使用Logstash上丰富的插件,没有日志过滤需求的话,可以不使用。

问5:日志的索引和调用链监控的traceid是怎么关联的?

答:目前全局流水号记录在了日志里,业务调用链路里的所有微服务的日志统一发往同一个MQ队列,由Logstash生成索引日志名。


原文发布时间为:2018-10-22

本文作者:田健

本文来自云栖社区合作伙伴“EAWorld”,了解相关信息可以关注“EAWorld”。

相关文章
|
6天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
7天前
|
消息中间件 监控 持续交付
构建高效微服务架构:后端开发的进阶之路
【4月更文挑战第20天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。微服务架构作为一种新兴的分布式系统设计方式,以其独立部署、易于扩展和维护的特点,成为解决这一问题的关键。本文将深入探讨微服务的核心概念、设计原则以及在后端开发实践中如何构建一个高效的微服务架构。我们将从服务划分、通信机制、数据一致性、服务发现与注册等方面入手,提供一系列实用的策略和建议,帮助开发者优化后端系统的性能和可维护性。
|
1天前
|
监控 测试技术 持续交付
探索现代微服务架构的最佳实践
【4月更文挑战第25天】 随着软件开发领域不断演进,微服务架构已成为设计灵活、可扩展且高度可维护系统的首选方案。本文将深入探讨构建和部署微服务时的关键最佳实践,涵盖从服务划分原则到持续集成/持续部署(CI/CD)的流程,再到监控与日志记录的策略。我们的目标是为开发者提供一套实用的指南,帮助他们在构建未来的应用程序时做出明智的架构选择,并确保这些系统能够快速响应市场和技术的变化。
|
1天前
|
消息中间件 负载均衡 持续交付
构建高效微服务架构:后端开发者的终极指南
【4月更文挑战第25天】在当今软件工程领域,微服务架构已经成为实现可扩展、灵活且容错的系统的首选模式。本文将探讨如何从零开始构建一个高效的微服务系统,涵盖关键组件的选择、通信机制、数据管理以及持续集成和部署策略。通过深入分析与案例研究,我们旨在为后端开发者提供一个全面的微服务实践指南,帮助他们在构建现代化应用时做出明智的架构决策。
|
2天前
|
消息中间件 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【4月更文挑战第25天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。本文深入探讨了如何构建一个高效且可靠的微服务架构,包括关键的设计原则、技术选型以及实践中的挑战和应对策略。通过分析多个成功案例,我们总结了一系列最佳实践,并提出了一套可量化的性能优化方法。文章不仅为开发者提供了具体的技术指导,同时也强调了团队协作和持续学习在微服务转型过程中的重要性。
|
2天前
|
持续交付 API 开发者
构建高效微服务架构:后端开发的新范式
【4月更文挑战第24天】 随着现代软件系统的复杂性日益增加,传统的单体应用已难以满足快速迭代与灵活扩展的需求。微服务架构作为一种新兴的软件开发模式,以其服务的细粒度、独立部署和弹性伸缩等优势,正在逐渐成为后端开发的重要趋势。本文将深入探讨微服务架构的设计原则、关键技术以及在实际业务中的应用实践,旨在为后端开发者提供构建和维护高效微服务架构的参考指南。
|
4天前
|
监控 API 持续交付
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第23天】 随着现代软件开发实践的不断演进,微服务架构已经成为企业追求敏捷、可扩展和弹性解决方案的首选。本文深入探讨了如何构建一个高效的微服务架构,涵盖了关键的设计原则、技术选型以及实践建议。通过分析微服务的独立性、分布式特性和容错机制,我们将揭示如何利用容器化、服务网格和API网关等技术手段,来优化后端系统的可维护性和性能。文章旨在为后端开发人员提供一套全面的指南,以应对不断变化的业务需求和技术挑战。
|
18天前
|
API 数据库 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第8天】 随着现代软件开发的复杂性日益增加,传统的单体应用架构面临着可扩展性、维护性和敏捷性的挑战。为了解决这些问题,微服务架构应运而生,并迅速成为后端开发领域的一股清流。本文将深入探讨微服务架构的设计原则、实施策略及其带来的优势与挑战,为后端开发者提供一种全新视角,以实现更加灵活、高效和稳定的系统构建。
23 0
|
17天前
|
Kubernetes 安全 Java
构建高效微服务架构:从理论到实践
【4月更文挑战第9天】 在当今快速迭代与竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性及容错性,成为众多企业转型的首选。本文将深入探讨如何从零开始构建一个高效的微服务系统,覆盖从概念理解、设计原则、技术选型到部署维护的各个阶段。通过实际案例分析与最佳实践分享,旨在为后端工程师提供一套全面的微服务构建指南,帮助读者在面对复杂系统设计时能够做出明智的决策,并提升系统的可靠性与维护效率。
|
9天前
|
机器学习/深度学习 运维 Prometheus
探索微服务架构下的系统监控策略
【4月更文挑战第18天】在当今快速迭代和持续部署盛行的软件工程实践中,微服务架构因其灵活性和可扩展性受到企业青睐。然而,随着服务的细粒度拆分和网络通信的增加,传统的监控手段已不再适用。本文将探讨在微服务环境中实施有效系统监控的策略,包括日志聚合、性能指标收集、分布式追踪以及异常检测等关键技术实践,旨在为读者提供构建稳定、可靠且易于维护的微服务系统的参考指南。
16 0