文献综述(或调研报告):
◆P2P借贷现状研究
近年来,互联网技术不断进步,搜索引擎、大数据、移动支付等互联网技术应用到金融领域,这使我国互联网金融蓬勃发展。其中,P2P借贷模式是互联网金融发展的主要模式,给传统金融信贷业务带来了一定程度的打击。P2P借贷加快了金融脱媒的进程,为社会上的一些闲散资金提供了使用的渠道,与传统金融信贷相比较,拓宽了中小微企业融资的途径,提高了融资效率[1]。
与传统信贷产品相比,P2P借贷有着很大的不同。首先,在传统的金融信贷业务中,拥有良好的资信和授信条件的企业才能得到银行发放贷款。一般中小微企业很难得到传统银行贷款,存在中小微企业融资困难的问题,所以 P2P借贷正好可以填补传统金融借贷的空缺。互联网 P2P借贷平台的出现,正为此类客户群体带来了便捷的融资渠道。P2P 借贷平台的参与者多为中小企业和个人投资者,金融服务的对象更加广泛,使普惠金融得到体现。其次,传统银行贷款具有审批慢、审批程序复杂等问题。而互联网借贷融资平台通过大数据平台、 及时通信、扁平化的结构组织,解决了供给双方信息不对称的问题,使资源持有者与融资者实现点对点的对接,大大缩短了融资时间,使融资变得高效快捷,迎合了小微企业及一些个人迫切的贷款需求[1]。P2P 网贷平台在起步之时自身的问题还有很多,缺乏法律保障,问题平台的频繁出现导致不少人对 P2P 网贷平台产生了信任危机[2]。由此可见,P2P 借贷强调简化繁杂琐碎的审批模式,手续简易,符合借款者的需要。然而相比于纯P2P借贷平台,这种大用户平台中介 多资金P2P渠道的合作方式,更能够吸引大基础app平台用户,挖掘潜在用户,更有产品期数灵活多样的优点。这些机构之间共同分享信息,共同利用基础设施,为 P2P 节约了成本[3]。同时,有app用户平台统一收集用户信息进行风控管理,只将少量用户信息透传给合作方进行借还款操作,能有效分担资金方平台压力。
◆资金平台技术研究
资金平台作为app平台的底层,主要负责与放款平台进行逻辑交互,主要包含的的就是内部逻辑的处理以及系统之间的http请求。伴随着Internet的飞速发展,Web技术正在影响当下社会的每个角落,新兴技术日新月异,对于界面交互较少的系统开发,使用B/S架构代替传统客户端C/S开发正成为趋势。C/S具有很高的业务处理能力,但是应用程序的过于复杂会使得扩展难度加大,安装部署成本过高,版本带来的兼容性要求等等问题。B/S(Browser/Server)结构即浏览器和服务器结构。B/S架构最大的优点是总体成本低、维护方便、分布性强、开发简单,可以不用安装任何专门的软件就能实现在任何地方进行操作,客户端零维护,系统的扩展非常容易,只要有一台能上网的电脑就能使用[4]。B/S改善了传统的C/S结构,对于原本需要复杂专用软件实现的功能,用户只需实名注册便可进行一系列操作[5]。对于资金平台这种负责连接appServer系统的中后台系统,只需要一个后台管理页面进行监控,不需要其他页面,主要进行的都是内部数据处理转化以及各个系统之间的HTTP请求通信,因此使用B/S架构进行系统开发更加适合。
Java是由Sun公司推出的Java程序设计语言和Java平台的总称,是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java语言的扩展性非常强,开发上限非常高。层出不穷的框架技术,使得开发人员只需要简单了解框架使用技巧就可以快速进行一些简单的开发。伴随着 Java Web 的技术革新也在不断进行,越来越多的 Java Web 开发人员逐渐从 SSH 开发过渡到 SSM 开发。Spring SpringMVC Mybatis对项目结构进行了充分的解耦,Spring简化了对象之间的依赖关系,能够对重复模块集中利用,并且包含了事物、日志、权限的控制。Spring 在新的版本中引入了使用 Java Config 进行配置的方式,这种配置方式使用 Java 类的形式来代替传统使用的 XML 文件,使用 Java 类进行配置编译器可以在编译期间检查错误,这大大提高了程序开发的效率,而且使用 Java 编程的方式进行 Spring 配置更符合程序员的编程风格。利用Java Config进行 Spring项目的配置是目前使用Spring的一个新的思路,相对于使用XML进行配置,使用Java Config的方式更加简化,程序员不需要频繁地在Java代码和 XML文件之间进行切换,而且也可以在一定程度上减少语法错误的可能性[6]。SpringMVC对web层进行解耦,使我们开发更简洁与Spring无缝衔接。Mybatis数据库的操作(sql)采用xml文件配置,解除了sql和代码的耦合。
在一个不断发展的大型app应用平台中,新的业务功能和需求不断增加,技术也在不断演进,不同团队构建的功能和子系统采用的技术构成五花八门,子系统之间开发、部署和运维也存在较大差异。如果企业内部没有统一的服务框架进行技术层面的拉通,开发和运维都将会受到很大的约束。传统垂直架构的核心就是要对应用进行服务化,服务化改造使用到的核心技术就是分布式服务框架。分布式服务框架包括服务提供者、服务消费者、服务注册发现、序列化、服务通信、负载均衡、日志管理等组件。服务提供端是分布式服务框架最重要的组成部分,通过将本地服务注册到服务注册中心上来发布可用的服务。序列化解决两个问题: 第一、使不共享内存通过网络连接的系统之间可以进行对象的传输。第二、解决远程接口调用JVM之间内存无法共享的问题。日志管理负责记录重要的框架层日志、异常链数据, 同时将日志的接口暴露出来,让业务层的程序员能根据日志来调试程序,解决潜在的问题。服务配置支持配置文件方式配置,能够集成主流框架,能够在框架运行时根据不同的业务场景来调整服务的参数和配置。服务通信提供NIO的同步请求响应模式和基于消息的一异步通信方式。主要流程为服务提供端启动服务器,框架将服务提供者信息(服务主机IP地址、端口号、提供的服务接口信息等)注册到服务注册中心。服务消费端将服务提供信息从服务注册中心读取到本地缓存中,同时将服务消费者的信息上传到服务注册中心去。服务消费端使用系统提供的几种软负载均衡算法的某一种来选择某一个服务提供者,发起服务调用命令。服务提供端收到来自服务消费端的请求,使用数据序列化方案将调用数据序列化为可以在网络中传输的字节数组,发送给服务消费端来完成服务的调用[7]。目前在小黑鱼研发内部,新开发的系统都统一由基础服务部门负责分布式服务器的搭建接入,使用Zookeeper框架。ZooKeeper 是一个开放源码的分布式应用程序协调服务,是 Hadoop 集群管理模块之一,其主要功能是控制集群中数据并对 Hadoop 集群中的NameNode进行管理和维护,及维护和监控存储数据状态的变化[8]。Zookeeper服务在设计实现上受paxos、raft等一系列一致性算法影响。分布共识算法对于服务容错至关重要。”Distributed consensus algorithms allow multiple partici-pants in a distributed system to agree on the values of the data they share. They are essential to the development of fault-tolerant services because they allow multiple servers to act as one. They are also notoriously complex because they have to handle both server crashes and communication failures of all kinds.”[9]
项目中使用redis主要是出于性能和并发的考虑,同时可以完成分布式锁等实现。redis是一个基于内存的高性能key-value数据库,对于需要比较耗时但是结果不频繁发生改动的SQL,在数据库前加redis进行缓冲,能够大大降低数据库访问压力。然而redis存储的数量受限于单台主机的内存和磁盘的容量,而单台主机的内存和存储是无法无限扩展。在系统生产的过程中,访问用户的不断增长,会持续不断地有新数据加入[10]。系统的存储将会遇到瓶颈,虽说在Redis的设计中有通过数据过期的机制来降低数据量存储,但是业务长期增长使得淘汰失效数据的机制无法长期适用。所以有必要对redis进行分布式存储设计。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。使得sql语句与代码分离,存放于xml配置文件中,便于维护管理。并且能够查询的结果集与java对象自动映射。Mybatis 相较于 hibernate 的全自动 ORM,也存在这开发人员需要手写 sql 这一现实问题[11]。
