2 gwisoft GWIsoft 于 2016.09.07 13:34 提问

一个JAVA业务开发工程师的烦恼(业务系统平台化)

请问一下,同一个功能,不同客户有微小的需求不同,导致一个系统一个客户,或者同个系统里面为了区分不同客户if else一大堆,维护工作量非常大,怎么样优雅从业务平台架构去设计这个系统,
实现一个业务平台可根据不同业务需求做二次开发,公共业务出现差异化时,可扩展差异部分,实现完美平台化,请大家帮忙头脑风暴一下,或者是否有现成的系统已实现我的困扰。谢谢

目前我想到的有:
1、模块可插拔,把一个功能拆分成各个小模块,二次开发小模块可以替换,通过配置实现不同客户的需求,从技术上可以用java的spi机制。
2、实现小模板块拼装成大模块,但如果模块之间数据的流转,配置设计很复杂,A模块的输出要成为B模块的输入,配置没有好的方案,同一业务各小模块修改数据库同一条数据时,为了提高性能怎么保证只操作一次数据库。

7个回答

wangmeng951011
wangmeng951011   2016.09.08 11:33
已采纳

图片说明

更新了下,你看看

wangmeng951011
wangmeng951011   2016.09.07 20:17

1:你的系统有着不同的使用者,然后你说一大堆if-else,诚然,这样几乎和优雅与设计丝毫不沾边,借鉴现在的一般做法,应该是在请求接口的同时带上一个可以标示用户身份的字段,这个字段一定要能够标示用户的身份,确保用户调用到需要调用的接口。
2:上面提到了,用户的身份不同需要调用不同的服务,所以你在真正的服务层之前搞一个适配的东西,这样的话,保证服务能正确寻址。而常规做法一般采用nginx或者web应用。
3:你想到了数据的一致性问题,但我想,接口拆分的粒度不要太细小,否则你会疲于奔命。
一个数据库的一条数据最好只是一个接口操作,否则很难保证数据一致性。
4:落地点在哪里,就在底层的接口。底层接口该如何搭建呢?
底层的接口采取webservices使用http协议暴露出来,将所有的业务分拆开来,做好领域模型的划分。

能做好上述四点,你就基本能设计出来一个扩展性不错的系统,但是任何系统的进步都是不断演化的过程,不可能一次性成型。

wangmeng951011
wangmeng951011   2016.09.07 20:23

图片说明

最近在做关于webservices的项目,有兴趣的话可以看看:
https://github.com/wangmeng1314/BaseWebServices
我叫阿福,希望我的回答对你有帮助!

wangmeng951011
wangmeng951011 回复GWIsoft: 感谢
大约一年之前 回复
GWIsoft
GWIsoft 回复henry-hacker: 谢谢回答,星星已点。
大约一年之前 回复
wangmeng951011
wangmeng951011 1:你说的模块A、B、C的问题,我觉得可以采取将其做成三个比较轻量级的接口,之后在某一个应用上组装这三个接口的数据,这里可以采取服务化的思想来做,可以采用阿里巴巴开源的soa框架dubbo来开发。dubbo的更新好像停了,但是不影响使用。 2:你说的A模块和B模块有90的代码相同,想集合成一个接口,我觉得不好。 因为你知道的,如果这样,一旦A模块有问题,可能导致B模块出现一些无法解释的问题,就是给自己挖坑。 对于冗余代码你可以抽出来作为一个jar提供出去,反正maven如此方便。 举个例子来说: 你有两个函数A和B,他们的冗余代码很多,你用if-else这样的方式将其整合,实在是有点问题。 A和B不应相互耦合。 比较好的做法是抽出公共代码,在搞一个方法出来。 希望我的回答对你有帮助。 给我的github项目点个星星呗! 我叫阿福
大约一年之前 回复
wangmeng951011
wangmeng951011 你听说过服务化吗?
大约一年之前 回复
wangmeng951011
wangmeng951011 回复GWIsoft: 让我想想
大约一年之前 回复
GWIsoft
GWIsoft 目前是否有一种开源的框架,是工作流的模式,比如我写了三个小模块接口(A,B,C),通过框架平台把这三个模块已工作流的行式组成一个大的模块提供给客户使用,如果其它客户对小模块中的B有需求变动,我的平台提供给外包公司进行模块B的二次开发功能。
大约一年之前 回复
GWIsoft
GWIsoft 回复GWIsoft: 接口和用户B接口,有90%的代码是相同的,如果代码上分成两个接口,代码冗余太大,我本来想是模块化,模块粒尽量小,这样可以支持二次开发,实现基础业务平台化,但这个方案改造工作量太大,请帮忙再指点一下。谢谢
大约一年之前 回复
GWIsoft
GWIsoft 谢谢henry-hacker 的细心回答,你的回答对我帮忙很大,但我上面问题中还有一个比较主要的疑惑就是,用户A
大约一年之前 回复
wangmeng951011
wangmeng951011   2016.09.07 22:01

如果有精力可以搞搞服务化!

fu415037685
fu415037685   2016.09.07 13:37

将各种需求用借口写,需要什么连接什么

GWIsoft
GWIsoft 不是很听的懂你说的用接口写的意思,可以详细分析一下吗
大约一年之前 回复
wangmeng951011
wangmeng951011   2016.09.08 11:32

接口之间相互调用可以采用dubbo
当然,接口提供出外面采用webservices(spring-mvc)

wangmeng951011
wangmeng951011   2016.09.08 11:41

我的qq:943065465
可以加我详聊

Csdn user default icon
上传中...
上传图片
插入图片