流程服务整合

注意

框架整合与被整合框架有很大关系,本文仅仅介绍整合思路,请不要期望 step by step就能搞定。
这是不可能的!
如果您不具备框架整合能力可以考虑有偿整合。

本节介绍了整合AgileBPM 几种常见模式 独立部署形式SpringBoot 工程的框架整合微服务框架集成传统web工程整合

AgileBPM 后端服务模块遵循 SOA 的架构模式,模块与模块间 依赖 API,每个模块都可以通过新增 API 实现的方式切换底层实现,您在整合之前,请确认拥有一定的框架整合能力,否则不建议浪费时间。

AgileBPM 流程服务依赖以下服务模块

  • SYS 系统服务:主要依赖 消息发送、系统缓存、脚本引擎 等【无需整合,直接依赖该模块】
  • ORG 组织用户服务:【可切换】
  • AUTH 鉴权服务:, 提供 Rest 资源访问控制,以及获取当前登录用户信息的服务【可切换】
  • BUS-FROM 业务表单: 提供业务表单服务【无需整合,建议直接依赖该模块】

一、独立部署形式

独立部署形式是让 AgileBPM 作为流程服务中心或者说门户平台,流程系统以远程调用的方式与其他业务系统交互。

整合的形式有:

  1. 多系统切换、子系统模式
    我们可以将 AgileBPM 作为门户平台, 不同的业务系统 作为子系统来管理,用户可以在门户平台中处理所有业务的 流程任务。在子系统中使用已有的业务管理功能
  1. 统一鉴权,整合菜单资源模式
    多个系统间统一风格样式、统一鉴权(单点登录)后,直接整合url资源即可。比如直接将个人办公菜单资源添加至现有系统中,让系统拥有流程办理的功能。
  1. 业务系统依赖流程服务的 Rest API,自行实现 个人办公的功能

整合步骤

一、切换组织服务实现

如果已有的业务系统已经存在组织架构,需要屏蔽掉 AgileBPM 的组织架构,那么您就需要切换组织服务的实现

  1. 移除 ab-org-core 的依赖 0.5h(预计耗时)
  2. 添加 xx-org-adaptor 模块,用来来实现 orgApi 接口,适配已有组织架构数据 3h
  3. 在 xx-org-adaptor 中创建 IGroup,IUser 实现类,UserService,GroupService 实现类(此处可以远程调用,并适配数据 )3d
  4. 移除 AgileBPM 前端 组织管理的功能(屏蔽菜单资源入口) 0.5h
  5. 修改系统中存在的组织、用户对话框,目前有:用户、组织、岗位、角色(自定义对话框支持多数据源) 5h

如此切换后,后端组织服务接口就会调用到 你们自身业务系统的组织服务,前端选择的用户、组织等数据也来自 你们自身的业务系统,那么就完成了组织服务的完整切换。

二、统一鉴权

鉴权依赖组织API的服务,所以前提必须先保证组织服务的有效性

AgileBPM 使用的 SpringSecurity 如果你们有 CAS 服务器的话,我们推荐使用单点登录来统一鉴权,具体整合请自行百度。

如果项目中有 App应用 或者已经在使用 JWT,那推荐使用 JWT,AgileBPM 的 token 是存在 cookie 中,所以建议使用 网关 或者 Nginx 将业务系统与 AgileBPM 的域名保持一致,这样前端 cookie就可以共享。
AgileBPM token 开启配置项

ab.jwt.enabled = false // 是否开启JWt
ab.jwt.header = Authorization // 存储 token 的 key值,后端会从 cookie 和 head中尝试获取该值

具体 token 解析以及免登 请阅读源码 JWTAuthenticationFilter.java JWTService.java

注意

鉴权是为了确认用户身份信息,以及判断当前用户是否拥有访问请求资源的权限,如果实现了新的鉴权需要一并实现“获取当前用户信息”的工具类 com.dstz.org.api.context.ICurrentContext,可以参考 LoginContext.java

三、流程业务对象数据持久化

  • 若 AgileBPM 与业务系统 【同库】
    没有任何问题

  • 若 【不同库】

  1. 实体使用多数据源形式(多数据源目前支持事物)
  2. 远程业务对象持久化
  3. url表单,然后通过 表单处理器接口远程调用去持久化,具体参考流程配置一节

难易说明

独立部署,统一鉴权的形式 算是比较常见的整合形式、相对也比较简单。

二、项目集成形式的整合

SpringBoot 工程的 整合

可以参考 agilebpm-app-simples 案例项目

1、依赖 BASE 模块服务【必须】

提供 动态数据源、ID 生成、agilebpm 相关模块的 mybatis SqlSessionFactory、分页插件等相关服务
添加依赖

<dependency>
<groupId>com.dstz</groupId>
<artifactId>agilebpm-base-spring-boot-starter</artifactId>
</dependency>

2、 依赖系统服务【必须】

执行 sys 模块相关sql,并添加依赖

<dependency>
<groupId>com.dstz</groupId>
<artifactId>ab-sys-spring-boot-starter</artifactId>
</dependency>

3、 依赖组织服务【可切换】

执行 org 模块相关sql并添加依赖

<dependency>
<groupId>com.dstz.agilebpm</groupId>
<artifactId>ab-org-core</artifactId>
</dependency>

若切换组织模块实现则需要依赖 org-api 并参考上文“切换组织服务实现” 的描述来 新增 模块 xx-org-adapter

4、 依赖鉴权模块【可切换】

auth 模块依赖 org 服务

注意

鉴权是为了确认用户身份信息,以及判断当前用户是否拥有访问请求资源链接的权限,如果切换了新的鉴权需要一并实现“获取当前用户信息”的工具类 com.dstz.org.api.context.ICurrentContext,可以参考 LoginContext.java

<dependency>
<groupId>com.dstz</groupId>
<artifactId>ab-security-spring-boot-starter</artifactId>
</dependency>

5、 依赖业务表单模块【必须】

<dependency>
<groupId>com.dstz.agilebpm</groupId>
<artifactId>bus-rest</artifactId>
</dependency>

<dependency>
<groupId>com.dstz.agilebpm</groupId>
<artifactId>form-rest</artifactId>
</dependency>

6、 依赖流程模块

<dependency> 
<groupId>com.dstz</groupId>
<artifactId>ab-bpm-spring-boot-starter</artifactId>
</dependency>

7、 依赖前端模块

<dependency> 
<groupId>com.dstz</groupId>
<artifactId>agilebpm-ui</artifactId>
</dependency>

8、 配置

参考 agilebpm-spring-boot-samples 案例项目的配置文件 进行配置,最后调试启动

访问:http://localhost:8080/agilebpm-ui/index.html 即可请求到 AgileBPM 的前端资源

难易说明

中等难读,整合需要拥有一定框架整合能力,否则不建议您浪费时间。

非 springboot 项目整合

AgileBPM 是完全模块化的一个项目,WEB模块仅仅为了整合各个模块,扫描 controller 提供 REST服务,仅此而已。所以您的整合过程其实是类似WEB模块一样,选择需要的服务模块,通过 spring 配置文件来整合的一个过程
前端的话,由于是前后端分离的项目,所以整合后,前端资源处理下风格样式,就可以完全被您所使用。

目前我们 spring 版本是4.3.17,请确认spring版本,可以在根目录pom中修改

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.framework.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

选择依赖

  • 系统服务模块 sys-rest
  • bpm模块依赖 wf-rest,bus-rest,form-rest
  • 组织模块依赖 org-rest,非必须 若不需要请自行实现 orgAPI 即可,具体请参考上文中 切换组织服务实现 的介绍
  • 鉴权模块依赖 http-security 非必须 若使用自身鉴权的话请务必实现并注入当前用户信息接口, com.dstz.org.api.context.ICurrentContext 这样系统中获取当前用户的工具类ContextUtil才能正常使用。

整合开源组件

主要是 base-db.xml,和 sys-core.xml 的整合改造动作

  • 参考base-db.xml 提供 DynamicDataSource(AbstractRoutingDataSource)的默认数据源 dataSourceDefault
  • 为数据源提供事物 参考app-tx.xml 相关配置
  • 参考base-db.xml 对系统的 持久化层进行配置,提供 sqlSessionFactoryjdbcTemplate 持久化Bean
  • 参考 sys-core.xml 对 redis,jms,freemarker,mq 进行整合

难易说明

难!您可能需要比较了解 AgileBPM 系统模块,并拥有较强的框架整合能力,否则建议您寻求商业支持

三、微服务版本集成

微服务版本简介

微服务版本依赖 springboot 版本的starters 目前有 三个微服务工程

  • gateway Zuul 网关工程 : 用于路由转发,请求鉴权
  • bpm-service 流程微服务: 流程以及相关的表单、业务对象、系统功能等服务
  • org-service 组织微服务: 组织架构,为网关、流程提供 组织服务

除了三个微服务工程外 还有 以下几个基础模块

  • commons-web: AgileBPM微服务项目公共模块,提供基础的依赖
  • commons-adapter-client: 用户服务、当前会话服务客户端, bpm-service 依赖该 client
  • commons-org-adapter-server: 适配用户微服务 服务端
  • commons-session-adapter-api: 用户会话服务的接口定义
  • commons-session-adapter-server: 提供当前用户会话服务
  • commons-session-resolve: 用来解析会话编号

微服务架构图

查看原图

微服务整合 AgileBPM

在微服务的整合中,各个业务库独立自治,整合业务系统基本都不允许 “数据源操作”的形式对业务数据进行保存,所以这时候我们 远程业务对象持久化 功能就派上用处了,除了业务系统整合,您可以需要整合用户服务、接入网关鉴权等工作。

微服务模块依赖关系

整合前请务必先搞清楚 AgileBPM 微服务各个模块的功能与关系

整合步骤

  1. 配置 bpm-service,org-service,gateway 的 eureka地址,配置 bpm-service ,org-service 数据库等地址
  2. 若不使用 AgileBPM 的网关 则需要参考 gateway 工程 配置文件 来配置 路由规则,并自行控制鉴权
  3. 若已有组织架构,则不需要 org-service 工程,则需要进行组织服务、会话服务的切换

最后启动相关微服务即可。

微服务切换组织实现

组织、会话服务的切换有两种方式:

一、侵入式

直接重新实现 commons-adapter-client 模块,调用自身的组织微服务,会话微服务,并适配

二、按以下步骤进行切换【推荐】
  1. “业务系统用户中心” 依赖 agileBPM 的 commons-org-adapter-server 模块

  2. 由于 commons-org-adapter-server 依赖 GroupService,UserService 两个接口的实现类, 所以 “业务系统用户中心” 的 spring 环境中需要注入该接口实现类

  3. “业务系统用户中心” 依赖 commons-session-adapter-server 模块

  4. commons-session-adapter-server 依赖 IWebSessionService 实现类,所以 “业务系统用户中心” 的 spring 容器中必须有该接口的实现类,用于提供 “用户票据解析” 服务

  5. 配置用户登录票据的位置

    commons-session-resolve 会对请求中的票据进行提取,配置如下

    ab:
    session-id:
    resolve-type: COOKIE
    resolve-key: JSESSIONID

    resolve-type: 默认值为cookie,支持从head 获取
    resolve-key : 默认为 JSESSIONID,可以根据具体情况设置具体key 的值

  6. 修改系统中存在的组织、用户对话框,目前有:用户、组织、岗位、角色(自定义对话框支持多数据源、接口形式获取数据)

难易说明

若本身已经是 springcloud 微服务架构 推荐该种整合方案,整合相对比较容易

远程业务对象持久化

远程业务对象持久化是在不允许使用多数据源操作业务库的场景时使用,他是针对微服务架构量身定制的

业务数据持久化支持 三种方式
  • 实体表多数据源形式
  • url表单的表单处理器(接口形式)
  • 远程业务对象持久化

本段就着重介绍 业务对象远程持久化功能

AgileBPM 业务对象能适应任意数据结构,业务对象可以直接配置成 与远程接口 java bean 相同的数据结构,这样可以利用 模型驱动 以 DTO 为入参接受请求数据

在 业务对象管理 - 编辑 - 持久化方式中 可以配置 持久化方式

  • Feign 接口 形式: 以Feign接口形式持久
  • REST 接口地址: 配置远程服务器的 rest 地址
远程业务对象持久化 业务交互图
远程业务对象接口说明

远程业务对象持久化,每个业务对象需要实现三个接口

获取数据接口
POST  ../../load

请求入参

Type Name Description Schema
FormData busKey
optional
业务对象KEY string
FormData mainId
optional
主表ID string

返回结果

HTTP Code Description Schema
200 OK ResultMsg<RemoteEntityData>
保存数据接口
POST  ../../save

请求入参

Type Name Description Schema
Body RemoteEntityData remoteEntityData RemoteEntityData

T 为具体业务对象、在业务系统方 直接模型驱动 转为具体的 java 对象

返回结果
会返回 mainId

HTTP Code Description Schema
200 OK ResultMsg«string»
删除数据接口
POST  ../../remove

请求入参

Type Name Description Schema
FormData busKey
optional
业务对象KEY string
FormData mainId
optional
主表ID string

返回操作结果

HTTP Code Description Schema
200 OK ResultMsg

  • RemoteEntityData 远程业务对象持久化 DTO
/**
* 远程业务数据 DTO
*/
public class RemoteBusinessData<T> implements java.io.Serializable {
private static final long serialVersionUID = -801014933612371616L;
/**
* 业务对象KEY
*/
private String busKey;

/**
* 业务对象 JSON,
* 在 agilebpm T 为业务对象的 JSON,
* 在 业务系统 T 可以直接利用模型驱动转换成 实体对象 eg:User
*/
private T data;


//非必须 流程key 若为流程持久化业务对象 则含该值
private String flowKey;
//非必须 流程实例ID 若为流程持久化业务对象 则含该值
private String instanceId;
//非必须 流程任务节点 若为任务提交业务对象 则含该值
private String nodeId;