如何设计一种网关类型的服务端架构

系统设计时经常会遇到类似的需求:设计一个系统,为公司内(外)的其它系统提供XX服务(登录、支付等,为了表述方便,下面以支付为例),这个系统需要对接其它若干支付系统,如:对接支付宝,对接微信支付,对接网银等。此处,我们把要设计的系统叫做XX网关系统。

一般设计方案

最直接的方法是,每对接一个新的支付,创建一套对应代码,从service、manager到dao完全写一套,然后把新支付需要的参数直接暴露给调用方。
  或者是对系统调用方提供一个请求参数的聚合体,同时增加一个支付类型参数,每新增加一种支付,就把请求参数放到这个聚合体中。系统根据请求类型不同来筛选请求参数与处理方法。

一般设计

存在的问题

上面的方案其实只是一种简单的封装,它存在以下问题:
1、每当新增加一种支付,系统调用方都需要增加对应的额外的参数与对应的代码,而且每个系统调用方都需要去实现一遍
2、在系统中存在大量冗余代码,涉及到变更,很可能需求修改多处
总的来说就是难以维护,维护工作量大

我们希望的是

一种扩展灵活,易于维护的系统,对于新的支付的接入,不需要开发大量的重复代码,系统调用方也不需要做大量的改动,只需要少量改动即可(或者不改动)。

另一种设计

下面我来说一说另一种方案以及其实现步骤,大家仔细体会一下区别。
对外只提供一个调用接口,通过参数类型来区分不同的支付处理类,提取出支付必须的通用参数创建请求参数,并增加支付类型参数,提取公共实现类,设计模板方案,实现具体的支付类。

步骤

下面的代码,只是为了对步骤进行说明,没有参数校验与异常检测,不能直接用于线上系统。

一、设计接口层

接口的目的之一就是定义外部通信的协议。
1、提供模块调用的服务,如,pay
2、提取支付的必须(公共)参数作为请求参数
3、提供支付类型参数,用于区分交易类型(此类型可以作为查询参数返回到客户端侧,这样的话,调用方就完全不用关心新增类型的事情了,读者请自行思考)

接口设计
支付请求参数

二、提取抽象基类,完成公共代码

1、完成公共代码开发,生成模板方法
类似如下:
abstract doSomethingA(); 抽象方法,需要子类实现
common method(); 通用的代码逻辑,比如更新DB
abstract doSomethingB(); 抽象方法,需要子类实现

公共接口定义,如保存支付记录,发起支付请求,为service层提供调用,其中getPayTpe是为工厂提供调用的。


公共支付接口定义

提取抽象方法,编写公共代码。注意此处泛型的使用。


公共支付接口实现类

支付工厂类实现,通过getBeansOfType来加载所有实现了BasePayManager的类,放到内存中。


支付工厂类实现

三、编写具体子类实现

定义具体支付的接口,用于编写支付类特有方法。支付接口特有的参数在具体子类中隐藏掉,不对外暴露。


具体支付类接口定义

实现具体的支付功能


具体支付类实现

四、编写PayService实现类

从工厂类获取具体的支付处理类。调用BasePayManager的doPay方法。


入口实现方法

类图:

类图

总结

此处我们使用了开闭原则,面向接口编程,模板方法等技巧,后续再增加新的支付,只需要编写具体的实现类即可(XXManager),不会因为新的加入而影响原有功能。
  最后说一点感悟,作为一个开发人员,我们要主动的去提高自己的竞争力,如果已经写了3年以上代码了,还只停留在service,manager,dao层面上,这是很危险的,慢慢的就会被淘汰。因为这些即使是一个1年工作经验的人,只要做的足够多,那么他也可以熟练掌握。而如果我们还只停留在这个层面上,没有基类与进步,那用不了多久就会失去竞争力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容