Skip to main content

服务中台

实际开发中经常有些业务逻辑相同,可以重用的逻辑。往高的概念是服务中台,向下理解就是服务调用

概念

重用逻辑一般是代码复制:直接复制代码;或者是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");

取得对象后就和本地对象使用方式一样。只是服务的实现会通过代理,在另一个容器运行。

后记

服务中台未完善,目前只是雏形,未支持远程服务调用。还有很多规范和细节未完善