• 001-dubbo基础-001-服务化最佳实践、异常处理逻辑


    1、参看地址

      http://dubbo.apache.org/zh-cn/

    2、服务化最佳实践

    分包

    建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。

    如果需要,也可以考虑在 API 包中放置一份 Spring 的引用配置,这样使用方只需在 Spring 加载过程中引用此配置即可。配置建议放在模块的包目录下,以免冲突,如:com/alibaba/china/xxx/dubbo-reference.xml

    粒度

    服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。

    服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。

    不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。

    版本

    每个接口都应定义版本号,为后续不兼容升级提供可能,如: <dubbo:service interface="com.xxx.XxxService" version="1.0" />

    建议使用两位版本号,因为第三位版本号通常表示兼容升级,只有不兼容时才需要变更服务版本。

    当不兼容时,先升级一半提供者为新版本,再将消费者全部升为新版本,然后将剩下的一半提供者升为新版本。

    兼容性

    服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。

    各协议的兼容性不同,参见:服务协议

    枚举值

    如果是完备集,可以用 Enum,比如:ENABLEDISABLE

    如果是业务种类,以后明显会有类型增加,不建议用 Enum,可以用 String 代替。

    如果是在返回值中用了 Enum,并新增了 Enum 值,建议先升级服务消费方,这样服务提供方不会返回新值。

    如果是在传入参数中用了 Enum,并新增了 Enum 值,建议先升级服务提供方,这样服务消费方不会传入新值。

    序列化

    服务参数及返回值建议使用 POJO 对象,即通过 settergetter 方法表示属性的对象。

    服务参数及返回值不建议使用接口,因为数据模型抽象的意义不大,并且序列化需要接口实现类的元信息,并不能起到隐藏实现的意图。

    服务参数及返回值都必需是传值调用,而不能是传引用调用,消费方和提供方的参数或返回值引用并不是同一个,只是值相同,Dubbo 不支持引用远程对象。

    异常

    建议使用异常汇报错误,而不是返回错误码,异常信息能携带更多信息,并且语义更友好。

    如果担心性能问题,在必要时,可以通过 override 掉异常类的 fillInStackTrace() 方法为空方法,使其不拷贝栈信息。

    查询方法不建议抛出 checked 异常,否则调用方在查询时将过多的 try...catch,并且不能进行有效处理。

    服务提供方不应将 DAO 或 SQL 等异常抛给消费方,应在服务实现中对消费方不关心的异常进行包装,否则可能出现消费方无法反序列化相应异常。

    调用

    不要只是因为是 Dubbo 调用,而把调用 try...catch 起来。try...catch 应该加上合适的回滚边界上。

    Provider 端需要对输入参数进行校验。如有性能上的考虑,服务实现者可以考虑在 API 包上加上服务 Stub 类来完成检验。

    3、异常处理逻辑

    dubbo的异常处理类是com.alibaba.dubbo.rpc.filter.ExceptionFilter 类,归纳下对异常的处理分为下面几类:

    1)如果provider实现了GenericService接口,直接抛出

    2)如果是checked异常,直接抛出

    3)在方法签名上有声明,直接抛出

    4)异常类和接口类在同一jar包里,直接抛出

    5)是JDK自带的异常,直接抛出

    6)是Dubbo本身的异常,直接抛出

    7)否则,包装成RuntimeException抛给客户端【为了防止客户端反序列化失败】



  • 相关阅读:
    Java如何编写自动售票机程序
    install windows service
    redis SERVER INSTALL WINDOWS SERVICE
    上传文件
    This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
    解决Uploadify上传控件加载导致的GET 404 Not Found问题
    OracleServiceORCL服务不见了怎么办
    Access to the temp directory is denied. Identity 'NT AUTHORITYNETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss
    MSSQL Server 2008 数据库安装失败
    数据库数据导出成XML文件
  • 原文地址:https://www.cnblogs.com/bjlhx/p/10096547.html
Copyright © 2020-2023  润新知