服务中台
实际开发中经常有些业务逻辑相同,可以重用的逻辑。往高的概念是服务中台,向下理解就是服务调用
概念
重用逻辑一般是代码复制:直接复制代码;或者是jar引用:相同一jvm,相同的osgi容器的。更高级的逻辑重用就是服务重用(服务中台概念)。
服务调用分两种情况本地跨构件调用:相同jvm的构件调用,通过osgi隔离;远程模块:不同jvm间的服务调用。V平台插件的服务调用是指服务中台的概念,服务提供者是在不同容器间的调用,可能是相同jvm、也可能不同jvm。
规范
前提:不能传递对象,例如非java的基础对象、异常实例对传递不了。所以就引出很多规范细节
1、参数类型:只能是java的基本类型。例如String、Integer等。HashMap、ArrayList会考虑开放。
后期会提供工具,如果远程参数工具统一规范处理。
2、返回值类型也是一样。
3、服务提供的方法不能抛异常。代替方案是返回{success:true,message:xx,value:object}方式。
因为通过远程调用、跨容器调用抛出的异常都捕捉不精确,所以只能通过返回值判断是否处理成功。
服务提供方式
1.创建接口,接口需要继承 IOutService 接口
package com.yindangu.v3.business.plugin.business.api.service;
/**
* 外部服务<br/>
* 外部的定义是构件外面,不在同一构件内的类和接口都是外部服务<br/>
* 外部服务可以是相同jvm的构件提供的服务,也可能是远程的jvm提供的服务。
* @author jiqj
*
*/
public interface IOutService extends IPluginBase{}
导出接口包分发给使用者引用,接口包含的基本是接口,可以运行有少量的值对象ValueObject(Vo),只能包含get/set方法,但不能包含逻辑:是否空、取值范围都不要包含。依赖其他包尽量少。
2.实现接口的业务处理(这部分不需要公开)
3.按一般的插件发布。
定义插件的编码,这个很重要,消费者就是靠 groupId + 构件编码 + 插件编码 找到对应的服务。
消费者使用服务
1.引用服务的接口包
按java标准方式引用服务的接口包(maven、ant....)
2.引用API
通过groupId + 构件编码 + 插件编码 找到对应的服务
IMyServer service = VDS.getIntance().getService(IMyServer.class, "com.xx.yy.MyService");
取得对象后就和本地对象使用方式一样。只是服务的实现会通过代理,在另一个容器运行。
后记
服务中台未完善,目前只是雏形,未支持远程服务调用。还有很多规范和细节未完善