1.背景
目前当前底层RPC通信是采用thrift的方式,通过编写TSServiceImpl类来实现thrift生成的TSIService.Iface的接口。很多可以抽象出来的底层函数没有办法复用,比如需要实现一套InfluxDB适配的Service类,有关的Session Open和Close操作,仍然需要重新编写。需要实现的RestOpenApi的Service,仍然需要重新编写当前TSServiceImpl里面的功能函数。因此为了使代码能够复用,同时为以后其他数据库的适配器Service开发提供便利,便打算提出Service模块的重构方案。
2.重构目标
把当前TSServiceImpl中的功能代码抽象成一个BasicServiceProvider,其他的Service只需要继承这个类即可。这个类提供的参数不再是某个指定的RPC参数请求,而是具体的某些实际参数。如OpenSession函数的参数不再是原本TSServiceImpl的TSOpenSessionReq类型,而是具体的username,password,zoneId这种参数。这样做的目的是为了解耦,方便其他Service直接调取对应的函数。新的Service的类里只需要进行组装参数,调用BasicServiceProvider的公用函数即可。
3.改造方案
(图一:UML类图)
我们把原先的TSServiceImpl的类拆成了两个类,分别是BasicServiceProvider和NativeServiceProvider类。其中NativeServiceProvider类仍然需要实现rpc.thrift生成的接口,这个类里的主要代码就是把rpc参数进行拆包,组装调用BasicServiceProvider的函数。
新拓展的服务如:influxdb适配器服务,只需要实现InfluxDBServiceProvider类,这个类需要实现influxdb.thrift生成的接口,同样对参数进行拆包,再次组装调用BasicServiceProvider的函数。
新拓展的服务如:OpenAPI服务也是同理。同时我们可以发现每个服务类,也就是NativeServiceProvider、InfluxDBServiceProvider和OpenApiServiceProvider会继承BasicServiceProvider这个基础类,这样做的作用是可以直接调用BasicServiceProvider的函数,而不用再次使用RPC通信增加时延。
...