首页 > 其他分享 >Dubbo服务提供者如何优雅升级?

Dubbo服务提供者如何优雅升级?

时间:2023-03-31 14:33:21浏览次数:56  
标签:Dubbo 服务 IHelloService param 优雅 sayHello 服务提供者 入参 ModelParent

文章首发于公众号:BiggerBoy。欢迎关注。

往期文章推荐

大坑!隐式转换导致索引失效...
高性能分布式限流:Redis+Lua真香!
MySQL索引知识点&常见问题汇总联合索引在B+树上的存储结构及数据查找方式
Redis分布式锁实战Mybatis第三方PageHelper插件分页原理MySQL索引底层原理 

一、问题交代

当我们使用dubbo作为服务间通信的组件时,在后期的系统维护中可能会因为业务需要,服务提供者某些接口需要升级,对应的服务消费者配合作相应的修改,测试通过后一起发版上线即可。但是在这个过程中,有很多需要注意的点,不妨来梳理一下以作记录,希望对此不清楚的开发者有所帮助。
再次申明一下我们的需求吧。假设服务A提供了一个服务IHelloService,其中有一个方法sayHello,服务B、C、D...都对此有依赖,假设服务A提供的该接口已上线且被服务B、C、D正常消费,线上运行稳定。

 

 先将服务提供者和服务消费者分别启动,此时消费方正常消费服务。

api:

public interface IHelloService {
    Result sayHello(ModelParent param);
}

服务提供者:

@Component
public class HelloServiceImpl implements IHelloService {
    @Override
    public Result sayHello(ModelParent param) {
        MyDto dto = new MyDto();
        dto.setMsg("hello," + param.getName());
        return Result.success(dto);
    }
}

服务消费者:

@Service
public class MyService {
    @DubboReference(group = "test",version = "1.0",registry = "registry2")
    private IHelloService helloService;

    public Result test(ModelParent param) {
        return helloService.sayHello(param);
    }
}

 

 

二、接口迭代升级方案

 

过了几个月,服务B接到产品需求,为了满足需求,对服务A的IHelloService.sayHello提出新的要求,因为本次需求不涉及服务C、D的改动,所以服务A对该服务还需要满足服务C、D调用时保持老逻辑不变,因此服务A需要格外注意服务的兼容性。
注意:这里说的服务A、B、C...是一个个应用或系统。应用或系统对外提供多种服务,例如用户服务对外提供用户信息查询服务、用户注册服务等。

假设服务A和服务B的开发人员确认完需求后,服务A的开发人员想到的接口升级方案如下:

  1. 服务A新提供一个sayHelloV2方法或新服务IHelloServiceV2,提供新的业务逻辑,服务B调这个新方法或新服务,原来的sayHello保留,服务C、D继续调用且本次不用修改上线。
  2. 服务A修改IHelloService.sayHello,在原来的入参中新增字段,用于区分走新逻辑还是老逻辑。在这种方式下就需要特别注意了,因为入参增加了参数,要考虑是否会影响本次需求不涉及的服务C和服务D。

    2.1 在原入参对象中新增字段。服务C、D对于新增的字段肯定传的是null,所以可以用null标识走老逻辑,用其他值比如1标识走新逻辑。

    2.2 创建新的入参对象 ModelChildren 增加新字段,且该入参对象继承原入参对象。此时又分不同的情况。

      a.接口方法入参对象保持原入参对象不变,即,方法签名不变,仍然是Result sayHello(ModelParent param)。仅需改动有新需求的服务B的代码,将入参对象改为新入参对象,由于该对象继承了原入参对象,所以不会有问题,但服务A需要判断传的是父类 ModelParent 还是子类 ModelChildren,并从子类 ModelChildren 中获取新字段。

      b.接口方法入参对象改为新入参对象,即,方法签名修改,入参改为新对象Result sayHello(ModelChildren param)。此时,所有消费该服务的消费方均需要修改,如果消费方不改,消费方调用该方法时会抛异常org.apache.dubbo.remoting.RemotingException: Fail to decode request due to:java.lang.IllegalArgumentException:Service not found:com.biggerboy.api.IHelloService, sayHello

 三、 总结

 

 

 

方案 参数列表 优点 缺点
新增方法sayHelloV2 - 1.新老逻辑分开,兼容老版本2.对本次不涉及的服务消费者友好,因为可以不用改动代码继续使用老方法 1.额外创建新的服务方法,对内存消耗略微增加(可忽略)
新增服务IHelloServiceV2 - 1.新老逻辑分开,兼容老版本2.对本次不涉及的服务消费者友好,因为可以不用改动代码继续使用老服务 1.额外创建新的服务,对内存消耗略微增加(可忽略)
修改入参ModelParent增加字段 不变 1.兼容老版本,对不涉及的服务无影响2.不用新增服务,不会额外消费内存 1.程序中需使用新增的字段区分新老逻辑
新增入参子类ModelChildren增加字段并继承原入参ModelParent 不变 1.兼容老版本,对不涉及的服务无影响2.不用新增服务,不会额外消费内存3.新增加了入参不会影响其他同样使用ModelParent作为参数的服务 1.程序中需使用新增的字段区分新老逻辑2.额外创建新的类,对内存消耗略微增加(可忽略)
新增入参子类ModelChildren增加字段并继承原入参ModelParent 改为子类 1.不用新增服务,不会额外消费内存2.新增加了入参不会影响其他同样使用ModelParent作为参数的服务 1.程序中需使用新增的字段区分新老逻辑2.额外创建新的类,对内存消耗略微增加(可忽略)3.需修改参数列表,当方法调用链较长且使用入参对象作为参数列表时,需修改的方法较多4.不兼容老版本,本次不涉及的服务消费者也需修改,负责报错

你们公司是如何做的呢?欢迎评论区一起讨论~ 

End

标签:Dubbo,服务,IHelloService,param,优雅,sayHello,服务提供者,入参,ModelParent
From: https://www.cnblogs.com/ibigboy/p/17276181.html

相关文章

  • 更优雅的OrientDB Java API
    OrientDBAPIv1.0.0(OrientDB3.x)GiteeOrientDB介绍OrientDB是一个开源的NoSQL数据库管理系统,同时也是一款高性能的图数据库,支持ACID事务以及原子操作。官网图数据库介绍图数据库是以点、边为基础存储单元,以高效存储、查询图数据为设计原理的数据管理系统。图概念对于图数......
  • 优雅的接口防刷处理方案
     前言本文为描述通过Interceptor以及Redis实现接口访问防刷Demo这里会通过逐步找问题,逐步去完善的形式展示原理通过ip地址+uri拼接用以作为访问者访问接口区......
  • 如何使用责任链默认优雅地进行参数校验?
    前言项目中参数校验十分重要,它可以保护我们应用程序的安全性和合法性。我想大家通常的做法是像下面这样做的:@Overridepublicvoidvalidate(SignUpCommandcommand){......
  • IDEA 如何优雅的格式化代码
    快速格式化格式化代码是一个好习惯.IDEA提供了快速格式化的功能.快捷键为:Alt+Ctrl+L.设置格式化范围但是很多人不愿意使用这个快捷键,因为害怕这样会格式化......
  • 用netty实现dubboRPC
    Dubbo是一种基于Java的高性能RPC框架,使用Netty作为底层网络通信库。下面是使用Netty实现DubboRPC的示例代码:服务端代码:publicclassDubboRpcServer{privatefina......
  • 某大厂面试题:说一说Java、Spring、Dubbo三者SPI机制的原理和区别
    大家好,我是三友~~今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是......
  • 如何优雅的暴力——分块
    前言近期也是把hzwer的数列分块入门肝完了,感觉分块很玄学(什么是分块分块的基本思想是,通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算......
  • mysql如何优雅删除大表? 看这篇就够了
    MySQL大表删除有次线上用droptablexxx删除200G的大表,导致MySQL连接数暴涨,业务出现大量5XX,“喜提”一个事故报告。看来还是忽略了一行命令背后产生的“蝴蝶效应”,现在让......
  • Dubbo自定义扩展点
    当我们需要在Dubbo框架中添加一些自定义的逻辑时,可以通过扩展点的方式来实现。Dubbo框架中提供了很多的扩展点,比如Protocol、Filter、LoadBalance等等。我们可以通过实现这......
  • Dubbo概念与作用
    一、介绍Dubbo是一款高性能、轻量级的JavaRPC框架,它的目标是提供高性能和透明化的RPC远程服务调用方案,使得应用之间可以通过RPC协议相互调用,从而降低系统之间的耦合度,......