美文网首页
app和web后台共用service以及动态切换环境配置的思考

app和web后台共用service以及动态切换环境配置的思考

作者: 无聊之园 | 来源:发表于2020-01-12 16:44 被阅读0次

因为今天,整理配置文件,测试环境切换到正式环境,发现一些问题。
首先这是个单机小项目,不会牵扯到rpc、拆分服务等问题。

一、app和web后台共用service
问题
很常见的场景:
app,web,都会使用,getById等method,又有一些接口,是app和web,独有的。

为了复用逻辑,有些项目的结构是这样的。


image.png

当这些独有的和共有的都放在一个class类里,就会存在。
1、耦合性太大,部署一个app,因为,service层加载了所有配置,因为,service层加载了所有配置,我需要关注web的配置。逻辑是否正确。同理,部署一个web,也有这种问题。
2、一个类里耦合了太多的东西,显得臃肿。
3、web和app耦合在一起,维护起来麻烦,一不小心修改错误web的东西,结构导致app出问题了。

这里设计到一个问题:复用、隔离。
复用和隔离,看起来好像是一种矛盾的东西。以上的结构,虽然做到了复用,但是,没有比较好的隔离,或者说,违反了单一职责原则。

那么,我觉得,应该这样来。
把共有的和独有的分开。

app层
app.controller
app.service
app.dao
maven依赖base层

web层
web.controller
web.service
web.dao
maven依赖base层

base层
base.service
base.dao
base.mapper

各个模块自己维护自己的配置,自己的代码。共有的业务逻辑,下沉到base层,独有的业务逻辑各自维护,然后以继承的方式继承base层抽象类或接口,使得隔离和复用达到一种良好的平衡。
比如:
base类:AbstractBusinessADao、AbstractBusinessAService
app类:AppBusinessADao、AppBusinessAService
web类:WebBusinessADao、WebBusinessAService

然后,目前的场景是,移动端,还有小程序接口和app接口。
那么应该则么拆分呢?
base类:
appMini类:继承base类
appWeb类:继承base类
miniWeb类:继承base类
app类:继承appMini类, 继承appWeb类:
miniapp类:类appMini类、继承miniWeb类
web层:继承appWeb类、继承miniWeb类。
但是因为java没有多继承的机制。

所以还是得冗余一部分:
base类:
app类:继承base类。
miniapp类:继承base类。
web类:继承base类。
如果app和miniapp、或app和web、或miniapp和web共用得,则抽象到base类。
(如果看dubbo得源码,也存在类似这种事情得冗余,比如service.setInterface,reference.setInterface,就重复了代码,就是因为java只能单继承)

问题一:有人会说共有的独有的难以界限清除。比如,有些method,开发的时候,你不知道这两个模块会不会同时使用。
答:其实,不会的,如果有分开的意识,开发的过程中,几乎就可以确定这个方法是不是共有的方法。或者,在开发过程中,如果发现比如app独有的代码,web层也要使用,则把这个代码,下称到base层,但是,最好还是在开发的时候,就能做到共有的逻辑下沉,因为,后期,别人不敢把你的代码擅自下沉到base层,下沉之后,还有一定的风险需要进行测试。

二、切换环境配置。
maven的filter 结合profile、resource。达到各种环境的问题。
参考:https://blog.csdn.net/fengchao2016/article/details/72726101

碰到几个问题:
1、filter true,include的问题,加了include,导致只加载include的文件,其他文件打包不进来的小问题。

<resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>configure.properties</include>
                    <include>application-db.yml</include>
                    <include>application-wxpay.yml</include>
                </includes>
            </resource>
<resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <excludes>
                    <exclude>configure.properties</exclude>
                    <exclude>application-db.yml</exclude>
                    <exclude>application-wxpay.yml</exclude>
                </excludes>
            </resource>

2、spring boot读取变量使用的符号是@@,而不是${}。

相关文章

网友评论

      本文标题:app和web后台共用service以及动态切换环境配置的思考

      本文链接:https://www.haomeiwen.com/subject/gvtwactx.html