概述
基础工程
wanxinp2p:这是整个项目的父工程,管理依赖环境
wanxinp2p-api : 存放整个项目的API( 接口+各种实体类 )
wanxinp2p-common: 存放整个项目的通用组件( 各种业务封装类+工具类 )
wanxinp2p-gateway-service :网关微服务,端口号 53010
wanxinp2p-consumer-service:用户中心微服务,端口号 53050
wanxinp2p-discover-server:服务注册中心(Eureka),端口号 53000
搭建
Apollo
- 每增加一个微服务,为了使前端能够通过网关访问到该微服务,都需要在Apollo的gateway-server上新增路由配置
功能开发
1. 注册
注册功能
1 )前端请求统一账户服务获取短信验证码
2 )前端校验手机号是否存在,校验验证码是否正确,如果不存在则说明未注册
3 )前端发起注册请求,请求用户中心服务
4 )用户中心服务请求统一账户服务保存注册信息 5 )用户中心服务保存用户信息 6 )注册成功
1.1 添加微服务——>wanxinp2p-account-service
wanxinp2p-account-service
1.2 实现发送短信验证码
1.3 校验手机号和验证码
1.4 保存
统一账户中心微服务
用户中心微服务
远程调用
2. 登录
前言
认证/授权/会话(退了就记录没了)
机密性(加密算法)
- 对称加密
- 加解密同一秘钥
- 非对称加密(更安全)
- 一对秘钥,公钥和私钥
完整性
身份验证
- 有人会篡改,程序以为完整’
2.1认证功能
session
- 在服务端生成用户相关的数据保存在session中(当前会话),而发给客户端的sesssion_id 存放到 cookie 中,这样用客户端请求时带上 session_id 就可以验证服务器端是否存在 session 数据,以此完成用户的合法校验。当用户登出或过期时把服务端session销毁,客户端的session_id也就无效了。
- 单点登录——分布式不行
- session机制方式基于cookie,在移动应用上无法有效使用,并且无法跨域,保持住会话的做法非常麻烦
2.1.1 UAA
- JWT(Json Web Token)
存到令牌里
- 当用户认证后,服务端生成一个token发给客户端,客户端可以放到 cookie 或 localStorage 等存储中,每次请求时带上 token,服务端收到token通过验证后即可确认用户身份
- 非对称加密算法+令牌+易扩展+json方便解析
- OAuth2.0第三方qq
- 密码模式
功能:
1)UAA服务给接入方提供了用户认证并返回令牌的接口。
2)UAA服务在认证过程中,它需要调用统一账号服务来完成c端以及b端用户的实际验证。
2.1.2功能实现(流程图1、2、3、4实现)
使用了Spring Security框架,按框架规定开发
UAA帮做了90%,后面还会生成令牌之类的操作我们不用管了
每做完一个功能就要测试——过网关测试
2.2认证拦截功能
校验令牌
校验接入方
同样涉及Spring Security OAuth2
功能实现(流程图5、6、7)
到不了后端,网关校验令牌
配置类拷贝到网关工程的config包
路由转发靠配置/业务逻辑靠过滤器
转账
分布式义务
主从数据库(io密集增删影响查)-数据要同步
cap理论 ca cp(强、一般一致性)
base理论 一般一致性 软实现
tcc补偿
- 事务协调器(启动提交回滚事务)
- 每个服务有try confirm cancel接口 3个接口2阶段
- 后两个出问题重试机制或人工处理/实现幂等
hmily框架实现TCC
配置,
ribbon序列化工具,hmily底层用到
实现注册功能,为common-template项目新建公共namespace,放到公共模版上,common-service关联
参与方省略
开户
跟银行打交道都要经过存管代理服务
生成开户数据
功能实现
判断当前用户是否开户
判断提交过来的银行卡是否绑定
保存银行卡信息
准备数据,发起远程调用,把数据发给存管代理服务
前端传来没手机号,要取手机号不能从session取了,用工具类
要导入securityUtil,获取上下文对象(过网关把信息放到上下文对象,也就是request里,转发到各个微服务)从里面取jsonToken,转换成当前用户登录的对象
导入loginUser(定义当前用户的基本信息)
存管代理生成开户数据
保存交易记录
签名/加密数据返回
银行回调