客户中心梳理
2019-09-29
客户数据分散在多个系统之间,而这多个系统中又有三个最为主要的系统:365、Y、E。
客户中心的目的是实现客户维度的账户数据统一,以替换掉目前客户多套账户数据,系统之间通过数据表同步实现账户数据同步的现状。
从客户中心的名称中就可以知道,该部分对应的主体是客户,而非平常To C的用户。
这里的客户账号主要是公司的经销商、各级门店的员工。
客户与To C用户两者之间最大的区别在于:账号注册、账户管理的不同。客户账号的注册主要是通过分配,而非自己注册。
服务主要拆分为以下几部分:
更新细致的描述如下图:
OAuth部分主要是熟悉下面这个图,只是有时扮演OAuth Server、有时扮演OAuth Client而已。
比如微信登陆,OpenApi就是微信OAuth Server的client。
OAuth涉及的点有:
OAuth Server需要做以下事情:
code分为两种情况:一种是通过浏览器传递给接入方后端;一种是通过移动端获取到code后,通过调用接入方后端接口传递给接入方后端。
redirect_uri、post_logout_redirect_uri 需要校验是否与配置的一样。
OAuth Client对接OAuth Server需要做以下事情:
从服务架构图中可以看出,业务逻辑最复杂的是账户服务。
账户服务的复杂的地方主要在:
下面简单说一下多系统账户合并的逻辑:
这部分开发的时候,有个坑就是业务人员本身不熟悉自己的业务,合并的细节基本都是开发人员通过数据库数据自己梳理,再与业务人员确认。
系统很多,但登陆用到的主要有两部分:
初始的计划是在一期将所有系统客户登陆统一替换掉,后来由于Y、E系统自身业务优先级的原因,无法参与这次切换,又将替换范围调整为替换CAS。
业务范围调整造成了两个影响:
这就引入了另一个问题,虽然最复杂的多系统账户合并不要了,但很多的功能点在CAS替换与多系统统一替换中基本都是一样的(由于需要合并多个系统间的账户数据,而多个系统目前的账户数据又是千奇百怪,所以根据账户数据来源的不同,分别存储在不同的表中,所以对于账户数据的操作这部分需要再次开发)。简单的CTRL+C CTRL+V再复制一份,再在公共部分加一些if else?还是通过别的方式实现?
主要的重复点在:
基本上都是输入一样,但最终处理的时候校验、操作的表都有所不同,这个可以通过命令模式来处理。
将统一账户的处理逻辑、CAS账户的处理逻辑分别放置到Receiver中,通过不同的Command来起到隔离而又不会重复代码的作用。
命令模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
对接之前未对接的Y、E系统,这时E系统已经合并到Y系统了,所以这时只需要对接Y系统就好。
对接Y系统主要是根据各种业务规则进行账号清洗、合并。
1、线程池发送(以防短信服务不稳,造成OOM,设定BlockingQueue长度)
2、抽象短信服务基类BaseVerificationCodeSender,因为有可能对接多个短信服务,但线程池及需要做的事是一样的。
由于集团短信服务不太稳定,所以每类(登陆、忘记密码、修改手机号等)验证码缓存最多三个未过期的短信验证码。
只要验证了一个,该手机号缓存某类的验证码,均失效。
略
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+