一、微服务的划分与架构设计
1. 需求梳理
根据上面的需求分析可以整理出如下需求:
(1)转账付款相关的功能:电子账单支付服务,实现汇款功能;提前安排付款;个人帐户之间转账;查看已支付账单;网上订购旅行支票
(2)个人帐户管理相关功能:个人账户转账;管理你所有的账户;查看最新的帐户报表和余额;查看自动更新的支出报告;查看付款历史;将数据与个人理财程序整合;修改联系方式;核实条款和条件;信息反馈
(3)贷款相关功能:申请贷款或信用卡;网上增加透支额度
(4)投资帐户相关微服务:购买和管理投资账户;查看使用投资研究;网上投资推荐.
2. 微服务的划分
基于微服务的网上银行系统是融合微服务架构思想和软件三层架构设计思想进行构造。首先,在整体架构层面,在满足系统非功能性需求的前提下进行两级拆分,将整个系统功能模块拆分为多个颗粒度尽可能小的微服务子系统,分别是个人帐户管理微服务、转账微服务、贷款微服务和投资微服务。其次,在代码层面,按照软件三层架构设计思想,将每个功能模块内的代码层级分为展现层、业务逻辑层和数据访问层,三层之间通过微服务包装成独立的系统级应用并通过接口和网络向外提供服务。基于微服务的网上银行系统的总体架构图如图所示。
如图所以,我们可以大概将微服务进行划分。
(1)帐户管理微服务,我们主要是实现用户对个人帐户的管理,包括个人账户转账;管理你所有的账户;查看最新的帐户报表和余额;查看自动更新的支出报告;查看付款历史;将数据与个人理财程序整合;修改联系方式;核实条款和条件;信息反馈,他需要与用户相关的数据库进行交互。
(2)转账微服务是要实现付款转账等操作,主要包括:电子账单支付服务,实现汇款功能;提前安排付款;个人帐户之间转账;查看已支付账单;网上订购旅行支票,它需要保存用户的信息,并且存储在转账的相关数据库。
(3)贷款微服务,主要帮助用户实现贷款以及信用卡的相关操作,包括申请贷款或信用卡;网上增加透支额度,需要和支付相关的数据库交互。
(4)投资微服务,主要是帮助用户完成投资相关功能,包括购买和管理投资账户;查看使用投资研究;网上投资推荐,也需要和数据库交互。
(5)其他微服务,还要实现的相关微服务有注册发现微服务、配置微服务、网关微服务等。
二、使用的技术以及分析
微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
微服务的优点在于:每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求。微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。微服务能使用不同的语言开发。微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
实现本电子银行系统会使用到的技术栈:
- 服务注册发现: eureka
- 服务开发:Springboot、Spring、SpringMVC
- 配置管理:spring config , spring security
- 服务调用 REST
- API网关: Spring Cloud Gateway
- 分布式锁: redis
- 安全认证: JWT
- 服务监控: spring-boot-admin
1. sping cloud
Spring Cloud是一个基于Spring Boot实现的云原生应用开发工具,它为基于JVM的云原生应用开发中涉及的配置管理、服务发现、熔断器、智能路由、微代理、控制总线、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
考虑 Spring Cloud 的原因有如下几点:
(1)Spring Cloud 来源于 Spring,质量、稳定性、持续性都可以得到保证。
(2)Spirng Cloud 天然支持 Spring Boot,更加便于业务落地。
(3)Spring Cloud 是 Java 领域最适合做微服务的框架。
(4)相比于其它框架,Spring Cloud 对微服务周边环境的支持力度最大。
(5)对于中小企业来讲,使用门槛较低。
(6)Spring Cloud 是微服务架构的最佳落地方案。
2. 服务注册发现
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,一实现SpringCloud的服务发现功能。
3. REST
REST提供了一组架构约束,当作为一个整体来应用时,强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互延迟、增强安全性、封装遗留系统的中间组件。
几年的由于移动互联网流行使得前端设备多样化,业界急需一种统一的机制来规范API设计,使得API适用于各种各样的前端设备,REST符合这种需求。并且行为和资源分离,更容易理解。
4. Redis
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它的优势在于:
(1)性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
(2)丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
(3)原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
(4)丰富的特性 – Redis还支持 publish/subscribe特性。
5. Spring boot admin
Spring Boot 有一个非常好用的监控和管理的源软件,这个软件就是 Spring Boot Admin。该软件能够将 Actuator 中的信息进行界面化的展示,也可以监控所有 Spring Boot 应用的健康状况,提供实时警报功能。
主要的功能点有:显示应用程序的监控状态;应用程序上下线监控;查看 JVM,线程信息;可视化的查看日志以及下载日志文件;动态切换日志级别;Http 请求信息跟踪
6. Spring cloud gateway
Spring Cloud Gateway 是 Spring Cloud Finchley 版推出来的新组件,用来代替服务网关:Zuul。Spring Cloud Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成,开发体验相对来说十分不错。Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。SpringCloud Gateway 特征介绍如下:
(1)基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
(2)集成 Hystrix 断路器
(3)集成 Spring Cloud DiscoveryClient
(4)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
(5)具备一些网关的高级功能:动态路由、限流、路径重写
三、防止欺诈功能的实现
在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光。当然,你可能会采用加密算法来加密数据,但是这仍然不够。微服务常见安全认证方案有:HTTP 基本认证、基于 Session 的认证、基于 Token 的认证、JWT认证、OAuth 2.0
对于需要添加防止“网络欺诈” 和“恶意骗贷” 功能,我们可以添加一个“用户身份认证模块”。可以考虑的技术如下:
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
RSA算法是目前最流行的公钥密码算法,它使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,这也是RSA最大的缺陷,因此它通常只能用于加密少量数据或者加密密钥。需要注意的是,RSA算法的安全性只是一种计算安全性,绝不是无条件的安全性,这是由它的理论基础决定的。因此,在实现RSA算法的过程中,每一步都应尽量从安全性方面考虑。
JWT 的优点:跨语言,JSON 的格式保证了跨语言的支撑;;基于 Token,无状态占用字节小,便于传输;Token 存储在 Cookie 中,这样客户端注销时,自然可以清空掉,注销时,将 Token 存放到分布式缓存中,每次校验 Token 时区检查下该 Token 是否已注销。不过这样也就失去了快速校验 Token 的优点。多采用短期令牌,比如令牌有效期是 20 分钟,这样可以一定程度上降低注销后 Token 可用性的风险。