如何理解《阿里巴巴 Java 开发手册》中的 Manager 层? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
halk
V2EX    Java

如何理解《阿里巴巴 Java 开发手册》中的 Manager 层?

  •  2
     
  •   halk 2019-02-28 19:57:28 +08:00 14538 次点击
    这是一个创建于 2466 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在阿里巴巴 Java 开发手册里,建议的架构如下图: 建议架构

    - 开放接口层:可直接封装 Service 方法暴露成 RPC 接口;通过 Web 封装成 http 接口;进行网关安全控制、流控制等。 - 终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,JS 渲染,JSP 渲染,移动端展示等。 - Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。 - Service 层:相对具体的业务逻辑服务层。 - Manager 层:通用业务处理层,它有如下特征: <br>1 ) 对第三方平台封装的层,预处理返回结果及转化异常信息; <br>2 ) 对 Service 层通用能力的下沉,如缓存方案、中间件通用处理; <br>3 ) 与 DAO 层交互,对多个 DAO 的组合复用。 - DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase 等进行数据交互。 - 外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。 

    应当如何理解Manager层呢,特别是上文提到的第三点与 DAO 层交互,对多个 DAO 的组合复用

    例如用户进行购物操作, 分别记录一条订单记录和操作记录,按照手册应该如此实现:

    public class OrderService{ @Autowired private OrderDao orderDao; @Autowired private OrderManager orderManager; .. save(Order order){ orderManager.save(order); } .. detail(long orderId){ return orderDao.get(orderId) } } public class OrderManager{ @Autowired private OrderDao orderDao; @Autowired private LogDao logDao; .. save(Order order){ orderDao.save(order); logDao.save(order.getLog()) } } 
    第 1 条附言    2019-03-05 21:59:42 +08:00
    大家理解不一,举个更具体的业务例子:
    用户下单,进行扣款,进行了以下处理:
    a. 查询商品信息(不通过缓存)
    b. 查询用户信息(通过缓存)
    c. 查询优惠券信息(不通过缓存)
    d. 创建订单
    e. 更新优惠券使用
    f. 更新库存(通过 RPC )
    -----------------

    根据业务,可能有`Goods`\`Customer`\`Coupon`三个实体,DAO\Manager\Service 三层架构

    那么根据阿里的开发手册,应当如何处理?
    17 条回复    2021-11-16 10:39:50 +08:00
    pythonee
        1
    pythonee  
       2019-02-28 20:16:14 +08:00
    我理解是用于管理接口的,比如运维管理、可用性管理等
    halk
        2
    halk  
    OP
       2019-02-28 20:23:25 +08:00
    还有第二点又应该如何理解:`对 Service 层通用能力的下沉,如缓存方案、中间件通用处理`
    secondwtq
        3
    secondwtq  
       2019-02-28 21:03:24 +08:00
    讲个笑话:

    Of course we need managers in companies, otherwise where does all the profit go?
    huijiewei
        4
    huijiewei  
       2019-02-28 21:22:18 +08:00
    进化后应该是 AOP
    loryyang
        5
    loryyang  
       2019-02-28 21:43:57 +08:00
    我觉得这样理解:另外一个项目也需要使用到的一些通用的功能,不是本项目提供的服务,但是别的项目也能用的功能。是从 service 层往下沉淀的(从 service 层抽取出来的)
    个人认为,对于小项目,完全没必要建立 manager 层,一层 service 足够了
    huangdayu
        6
    huangdayu  
       2019-02-28 23:30:49 +08:00 via Android   2
    我的理解是:manager 是公用的 service
    Foxkeh
        7
    Foxkeh  
       2019-03-01 00:47:28 +08:00 via Android
    小弟认觉得此设计利于微服务架构,接口调用层次更清晰。具体看业务复杂程度和项目规模吧跟,小项目的话应该都不会细分 service 跟 manager
    qiyuey
        8
    qiyuey  
       2019-03-01 01:44:13 +08:00   1
    Manger 功能比较单一,如实体的增删改查,Service 是多个 Manger 的组合,实现一块相对独立的业务逻辑
    halk
        9
    halk  
    OP
       2019-03-01 02:06:53 +08:00 via Android
    @qiyuey 反了吧?
    specita
        10
    specita  
       2019-03-01 10:09:25 +08:00
    简单的 crud 不需要 manager 层的,如文档所说,比如我们项目有个 rpc 层,其实就是 manager 这个概念
    muzzy
        11
    muzzy  
       2019-03-01 10:31:10 +08:00
    @halk 他的意思应该是由 manger 提供基础服务,由 service 进行服务整合串联业务逻辑。
    cyspy
        12
    cyspy  
       2019-03-01 10:46:25 +08:00
    如果位于 Service 和 DAO 之间的话,处理的应该是类似热点缓存、外键约束这一类所有 service 通用的内容吧
    kanepan19
        13
    kanepan19  
       2019-03-01 14:10:50 +08:00
    事务在 manager 层,抛出异常。
    Service 往往捕获异常,return 通过 Result 返回,比如 Result<Ordergt;
    southsala
        14
    southsala  
       2019-03-01 16:29:18 +08:00
    举个栗子,如果你开发一个去掉 Manager 层和外部接口或第三方平台的教育 APP 后台,这个分层应该很容易理解。
    后续你加个天气功能,加了 Manager 和外部接口部分,天气接口限制访问次数,所以在 Manager 层加了缓存;还有教育后台的某些数据的缓存( 2 )
    之后要变现,买了个电商系统,于是 Manager 层对数据整理一下,比如异常提醒之类和本系统格式相左的,返回给上一级( 1 )
    ( 3 )的话大概是需要组合的通用数据,降低负责度
    halk
        15
    halk  
    OP
       2019-03-05 22:00:09 +08:00
    更新了一个例子,请大家补充
    谢谢
    HansCathy
        16
    HansCathy  
       2019-03-06 11:21:46 +08:00
    Manager 层 我理解是操作缓存 + 调用 DAO, 是一个综合的数据操作层
    YzSama
        17
    YzSama  
       2021-11-16 10:39:50 +08:00
    @halk
    OrderService 下单
    a. 查询 goodsManager 商品信息 ( 不缓存 )
    b. 查询 userManager 用户信息 (带缓存的方法 ,业务里面是通过 用户服务接口获取的用户信息。)
    c. 查询 couponManager 优惠券信息 (不缓存)
    d. create orderManager ( 通用的订单服务 )
    e. update couponManager (更新优惠信息)
    f. update by rpc.SKUManagerRPC 接口

    我想的大概是这样。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2587 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 09:44 PVG 17:44 LAX 01:44 JFK 04:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86