技术栈是为了实现某个业务系统而采用的一系列子系统、技术框架、组件、方法、工具及配置的集合,其中的各个部分并不是孤立存在的,而是互相关联和有机整合的。
如图1所示是实现整个支付业务系统的常用技术栈。
图1
下面从下往上介绍如图1所示技术栈中各个框图中的内容。
1、操作系统层
如图1所示,操作系统层是整个支付技术栈的基石,市场上的主流服务器操作系统是Linux和Windows。
(1)Linux是目前线上服务器中被广泛使用的操作系统,有很多分支版本,目前大部分基于Debian(Ubuntu)与Red Hat这两大类Linux操作系统。Red Hat是付费操作系统,我们可以免费使用,但是如果要使用Red Hat的软件源并想得到技术支持,就需要付费。所以从另一个层面来讲,我们可以将Red Hat理解为Linux中的Windows,不过它也有开源和免费使用的版本。
CentOS是 Red Hat的开源操作系统版本,是由Red Hat Enterprise Linux依照GPL开源协议发布的源码编译而成的,由于出自同样的源码,因此有些要求高稳定性、高预测性、高管理性、高扩展性的服务器以CentOS代替商业版的Red HatEnterprise Linux进行使用。
一般在Red Hat更新之后,CentOS会把源码中含有Red Hat专利的部分去掉,同时去掉的有其他服务器设置工具,在重新将源码编译之后就形成了CentOS操作系统,目前最新的CentOS版本为81版本。
(2)在Windows中:可作为服务器的常见版本有Sever 2003SP2 Sever 2008 R2、Sever 2019 ,这些操作系统又被分为32位和64位。32位系统相比64位系统的最主要体现为对内存的大小限制,其中32位仅支持4GB内存,一般在做技术选型和采购时都会推荐采用64位的操作系统作为服务器版本,亚马逊阿里云等服务器提供商也提供了大量的Mindows版本的服务器。Windows较Linux来讲有更加简单、安全、高效而且易用。
2、虚拟层
虚拟层用于在Linux或Windows操作系统上提供一个额外的操作系统和软件抽象层的自动管理机制给上层应用程序使用,还用于解决环境配置问题及计算资源的动态扩容问题,在支付系统中提供了各个微服务核心架构的运行基础。
Dacker是一个开源的虚拟化软件项目, 提供了可伸缩的容器应用管理功能,让应用程序的部署操作类似于在集装货柜下装货物一样简单,还能打包应用程序及其虚拟容器,在任意Linux、Windows服务器上运行依赖性工具,这有助于提高应用部署的灵活性和便携性, 这样一来应用程序就可以在任意地方运行,无论是在公用云、私有云还是在单机上,等等。
尽管Docker拥有上面提到的种种优点,但是对于有文件读写、执行性能、网络、数据恢复或安全性等诸多要求的数据库管理系统来说,一般不建议在Docker上部署。
3、Web服务层
Web服务层主要提供Web服务和业务应用,也称之 为Web伺服。Web服务层响应来自对端的服务请求并进行处理,提供保障安全机制的互联网计算服务。下面对如图3一2所示的4 个Web服务器进行讲解。
(1)Tomcat。 Tomcat是Apache软件基金会下的一个开源Servlet(服务端程序)容器,实现了对Servlet和JavaServerPage(JSP)的支持,并提供了Web服务器的一些特有功能,例如Tomcat管理和控制平台、安全管理和Tomcat阀[1]等。Tomcat运行在Java虚拟机(JVM)之上,管理Servlet程序的生命周期并将URL映射到指定的Servlet进行处理,与Servlet程序 合作处理HTTP请求,根据HTTP请求生成HttpServletResponse对象并传递给Servlet处理,将Servlet中的HttpServletResponse对象生成的内容返回给客户端或浏览器。Tomcat是目前Java服务器中应用最为广泛的动态Web服务器。
(2)Nginx。Nginx是一 个采用了异步框架的网页服务器,通常用作反向代理、负载均衡器和HTTP缓存,是免费的开源软件,根据类BSD许可证的条款发布。现在有一大部分服务 器都采用了Nginx作为负载均衡器。类似的软件有Robbin和Spring Cloud,也能起到负载均衡作用,只不过Nginx更适用于在服务端实现网络请求的负载均衡,例如Tomcat和Jetty服务器。Robbin适 用于通过RPC远程调用实现本地服务负载均衡,Spring Cloud采用的就是本地服务负载均衡。
这里只选择Nginx作为负载均衡器进行讲解。
Tomcat和Nginx通常被混合使用,来实现动静态资源分离:运用Nginx的反向代理功能分发请求,所有动态请求则被提交给Tomcat服务器,静态资源请求如图片、CSS、JS、 ZIP、 PDF及其他文件等则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
在支付系统中也使用Nginx实现负载均衡,当业务压力增大时,可能一个Tomcat实例不足以处理,这时就可以启动多个Tomcat实例进行动态扩展,而Nginx的负载均衡功能可以把请求通过服务分配算法分发到各个不同的Tomcat实例进行相关支付业务的处理。
(3)FTP(File Transfer Protocol Server,FTP服务器)。FTP是依照FTP在互联网上提供文件存储和访问服务的服务终端。在Linux中推荐将vsftpd作为FTP服务器。vsftpd是 一个开源的FTP服务器,相当成熟、可靠。在支付系统中使用FTP服务器存储对账文件,以及提供给商户对账文件,商户自行使用支付系统的FTP账号和密码登录,定期(一般是日终[2])获取对账文件。支付系统对FTP有读写权限,商户只有读权限。
4、数据存储层
数据存储层主要用于建立、使用和维护、管理支付相关数据,除此之外维护着数据之间的关系,保障关联数据之间的逻辑关系正确和完整(数据一致性)、存储系统和数据使用者之间的一致性(存储一致性)、存储在数据库中的所有数值均为正确的状态(数据完整性),并提供安全环境不让数据泄露和安全存储(数据安全性)。
下面对数据存储层的MySQL、Redis、 HDFS、 MongoDB 等存储组件分别进行讲解,这四种数据存储选型在支付系统的各个不同模块均有用到。
(1)MySQL。 MySQL是一个开源的关系数据库管理系统,目前已成为Oracle旗下的产品,现在依然维护有社区版本,并由于其高性能、低成本和高可靠性,成为最流行的开源数据库之一,被应用于更多的大规模网站和应用,比如维基百科、Google和Facebook等。 目前非常流行的开源软件组合LAMP中的"M" 指的就是MySQL,当然,还有相当一部分公司采用Oracle和Microsoft SQL Server。Oracle是目前为止最成熟的商用数据库,在金融支付行业占有相当大的比例。与MySQL数据库相比,Oracle数据库能提供完善的客户和售后服务支持,并有更大型的商业应用成功案例,例如TOYOTA、中国建设银行等。目前,第三方支付机构的支付系统相关管理子系统和账务系统采用MySQL作为数据库,主要存放关系数据,例如渠道管理数据、商户及应用基础数据、账户数据及账务相关数据。
(2)Redis。 Redis是一 个开源的基于键值对的高性能存储系统,支持主从复制(Master Slave Replication), 并且有非常快速的非阻塞优先同步(Non一Blockingfirst Synchronization)和网络断开自动重连等功能,以及简单的check一and一set机制、pub/sub 和配置等,使Redis表现得更像网络内存缓存(Cache)系统,并且绝大多数主流编程语言都能接入和使用Redis客户端。Redis在 整个支付系统里面主要被用作内部缓存模块,同时被用作服务应用间的消息队列和任务队列。
(3)HDFS。 HDFS(Hadoop Distributed File System)是Hadoop的分布式文件系统,和现有的分布式文件系统有很多共同点,但区别也很明显:它是一个具有高度容错性的系统,适给被部署在廉价机器上,除了具有高度容错性, HDFS还能提供一个高吞吐 量的数据访问,非常适合在大规模数据集上应用。HDFS在支付系统里面主要负责离线数据的存储计算,以及利用自身的数据存储和归集运算功能与Spark系统一起完成支付经营大数据的分析功能。例如:历史订单数据和交易日志数据都有非常大的数据量,大部分是GB甚至TB级别,HDFS可以非常好地支持这些大数据文件。
(4)MongoDB。 MongoDB是一 个基于分布式文件存储的数据库,由C++编写而成,旨在为支付的Web应用提供可扩展的高性能数据存储解决方案,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富、最像关系数据库的。但目前MongoDB不支持事务,无法支持交易相关的数据,由于索引和搜索优化得非常好,所以主要用于数据检索或信息存储。
支付系统通常采用MongoDB与MySQL保障存储服务的高可用性和强一致性;后端运营系统则采用MongoDB应对后端的大数据量查询及多样化报表查询的需求,MongoDB同时具备良好的扩展性,支持对海量支付历史订单数据的存储和检索。
5、服务端技术
服务端技术主要是支付业务流程逻辑实现的基础,其主要技术选型如下。
(1)Spring Boot。 Spring Boot是由Pivotal团队提供的全新Spring框架,是支付后端微服务架构的基础,其设计初衷是简化旧版本Spring应用的初始搭建、配置及开发过程。与Spring之 前版本的框架相比,Spring Boot使用了特定的方式进行配置,使开发人员不再需要定义烦琐、样板化的配置文件,与此同时, Spring Boot整合了很多优秀框架,不用我们自己手写XML配置文件再进行配置,这大大提升了Web应用和微服务的开发效率。
(2)Log4J。 Log4J是Apache 下的一个非常流行的开源日志组件,具备高性能日志记录和安全传输的功能,组支持异步输出日志到不同的终端。我们可以使用Log4J将应用运行的日志信息输送到目的地,例如控制台、文件、GUI组件,甚至套接口服务器、NT的事件记绿器、UNIX Syslog守护进程等(用另一个日志组件Logback也是相当不错的选择)。
在整个支付系统中,日志组件是非常重要的基础模块,主要用于定位和解决以下问题。
·跟踪、记录支付系统运行日志。
·每当出现异常时,都可以根据日志操作记录还原异常出现时的操作步骤。
·记录异常堆栈信息,判断问题出现的位置。
·记录各个操作员之间的系统操作记录。
(3)Logback。Logback是Log4J的升级版本,有着对开发者更友好、实现更快、成熟度更高、性能更优等特点。新版本的支付系统对日志组件的选型多采用Logback代替Log4J组件。
(4)Kafka。Kafka是Apache 下的开源数据流处理平台,由Scala和Java编写而成,是一种高吞吐的分布式发布订阅消息系统,可以处理用户在网站和应用中的所有动作流数据,例如:支付收银台界面的一些动作(不同支付方式的网页浏览、单击、搜索和其他用户的动作)。利用Kafka可以在将这些用户的数据流处理之后,通过经营分析系统形成数据报表和波动监控告警,分析用户在收银台上的社会行为,并帮助产品经理进行数据分析。它除了用于实时日志分析,还被当作分布式数据流系统,被诸如New Relic(数据智能平台)、Uber、Square(移动支付公司)等大型公司用来构建可扩展的、高吞吐量的、高可靠的实时数据流系统。Kafka在 支付系统里面主要用于支付行为、支付订单相关的消息传递与消费,同时作为支付系统中经营分析子系统的实时分析和监控模块。
(5)ZooKeeper。ZooKeeper是 一种分布式应用程序之间的开源协调服务,是Google的Chubby(一个面向松耦合的分布式系统的锁服务)的一个开源实现,同时是Hadoop和HBase系统的重要组件。
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。它的目标就是封装复杂、易出错的关键服务,将有简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper 在支付系统里面主要用于构建支付会员和账户的注册中心,进行不同服务器的支付日志和运营分析数据的协调,以及主备支付服务器间的流量控制和工作协同。
(6)MyBatis。 MyBatis是优秀的开源持久层框架,支持定制化SQL、存储及高级映射。MyBatis 省去了几乎所有JDBC代码,省去了手动设置参数及获取结果集的工作量,可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain OrdinaryJava Objects,普通的Java对象)映射成数据库中的记录。在支付系统里面, MySQL、MongoDB数据连 接及事务控制都是由MyBatis数据组件提供的。
(7)QuartZ。 QuartZ是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行日程作业调度提供了简单而强大的机制,实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。在支付系统里面,QuartZ主要用于作业调度、定时处理对账清算和定时通知商户应用等。
(8)Zuul。 Zul是在云平台上提供动态路由、监控、弹性、安全等边缘服务的框架,相当于设备、Web站点和流应用后端所有请求的前门。客户端若想请求到服务,则首先得请求ZuI网关,然后由Zuul网关将请求路由分发到对应的真实服务接口。在支付系统里面, Zuul主要用于通过配置路由规则进行支付渠道服务路由、微服务引导和收银台页面流量分发。
6、终端层
终端层存在的意义在于触达终端用户,也是用户体验最直接的一层,触达方式有PC、Web站点移动设备、POS机和专业设备等,在PC时代用得最多的就是Web网站和浏览器,浏览器采用HTML页面渲染引擎将支付系统展现出来。在移动互联网时代,操作系统基本由Android和iOS二分天下。
目前,在支付系统中一般采用原生的Java、Kotlin或者 Objective一C包装成SDK或钱包应用给用户使用,也有一部分采用HTM 5或其他WAP技术提供移动支付收银台页面给用户使用。
以下主要简单介绍终端层的Weex、Flutter和桌面动态库DLL技术,其中API是支付服务端提供的接口服务。
(1)Weex。Weex致力于使开发者基于通用跨平台的Web开发语言和开发经验,来构建Android、iOS 和Web等三方共同应用。简单来说,在集成了WeexSDK之后,我们可以使用JavaScript开发移动支付应用,对于商业产品设计来讲,无论在哪种设备终端上都能有统一的支付用户体验。
Weex渲染引擎与DSL语法层是分开的,并不强依赖任何特定的前端框架,目前Vuejs和Rax这两个前端框架被广泛应用于Weex页面开发,同时Weex对这两个前端框架都提供了完善的支持。Weex的另一个主要目标是跟进流行的Web开发技术,将其与原生开发技术结合,实现开发效率和运行性能的高度统一,使开发一个Weex页面就像开发普通网页一样;在运行时,Weex页面充分利用了各种操作系统的原生组件能力。
(2)Flutter。 Flutter是 Google开源的移动UI框架,可以与现有的代码一起工作,快速在iOS和Android上构建高质量的原生用户界面。Flutter正在被 全世界越来越多的开发者和组织者所使用,并且 是完全免费、开源的,也是构建Google Fuchsia应 用的主要方式。
Flutter组件采用现代响应式框架构建,这是从React中获得的灵感,其中心思想是用组件(Widget)构建U。该组件描述了在给定其当前配置和状态时显示的样子。当组件状态改变时,组件会重构它的描述(Description), Flutter会对比之前的描述,确定底层渲染树从当前状态转换到下一状态所需要的最小更改。目前,阿里巴巴的闲鱼App和京东App都在使用Flutter技术,在现有设备的用户体验上感受不到与原生应用有什么不同。
(3)API。通常指Web API或RESTfulAPI ,是一些预先定义的公共函数和衔接部分的约定。这样做的好处在于,外部系统无须访问内部源码或理解内部的业务流程和工作机制等细节,直接通过调用API就可以访问内部系统提供的功能(例如:对于下单API ,商户系统应用开发人员在拿到这个API之后,不需要了解和实现内部收银台、交易引擎、风控系统相关的业务流程和逻辑实现)。
(4)DLLA。 DLL指Windows 上的动态链接库(Dynamic LinkLibrary),A指静态链接库(Static Library)。DLL(在Linux上为so文件)包含多个功能模块的内部代码和数据,主要出现在PC端的商业应用产品中,一般为Windows桌面应用程序和Linux应用程序。目前该类型的对外提供方式较少,所以市场上较为少见!