乐趣区

关于java:Kstry框架一种服务编排的实现

Kstry 能做什么?

如果您遇到了以下问题:

  • 业务含糊】代码简单、模型文档更新不及时,以致新同学和非技术同学不能短时间内理解业务现状。技术和非技术间对同一业务了解存在一致而不自知。甚至业务 Owner 也不能很晦涩的形容出本人所负责的业务
  • 代码芜杂】我的项目中波及到许多畛域对象,对象间不仅存在简单的前后依赖关系还互相掺杂没有显著边界,代码屡次迭代后更是凌乱不堪难以保护
  • 性能低下】某业务链路由一系列子工作组成,其中须要并行处理一些耗时长且数据间没有依赖的子工作,但苦于没有精简且无代码侵入的并发框架
  • 平台之殇】保护平台型产品,为泛滥上游业务线提供着根底服务,但在短时间内应对各个业务方的定制化需要顾此失彼,更不知如何做好平台与业务、业务与业务之间的隔离
  • 回溯艰难】业务流转数据状态追踪艰难,只存在于线上环境的偶现问题更是难以排查。须要一种能够通过简略操作就能将重要节点数据都保留下来的能力,此能力堪比对链路精细化梳理后的系统性日志打印
  • 测试简单】业务场景多样,不乏一些简单的链路难以被测试笼罩。或者三方数据 Mock 艰难,测试老本居高不下

那么能够尝试一下 Kstry 框架,因为其具备:

可视化

  • 框架引入了业界通用的 BPMN 流程编排语言
  • 应用事件节点、工作节点、网关节点等组件来形容业务动作和执行线路
  • 编排好的图示模型即为代码实在的执行链路,通过所见(图示模型 )即所得( 代码执行)的形式在技术和业务之间架起一道通用语言的桥梁,使彼此之间沟通更加顺畅

服务编排

  • 框架通过定义服务节点来划分畛域边界并实现业务性能,服务节点对应代码中 Class 的某个办法
  • 服务节点执行反对定义超时工夫、重试次数、失败降级
  • 一个独立的服务节点实践上只承当着一种业务动作或畛域能力
  • 输出实现工作所需参数的最小集,输入工作实现的后果或解决后的畛域对象
  • 节点间应用箭头符号这种可视化编排伎俩来保障彼此间的相互作用有序,通过并行网关、蕴含网关、排他网关等来丰盛节点间的执行依赖关系
  • 框架反对子流程的定义,能够为其设置超时工夫。反对指定非严格模式,非严格模式下的子流程执行失败后不影响外围流程的执行
  • 子流程反对拦截器的定义,能够在子流程执行前、执行后、执行异样、最终肯定执行四个阶段进行自定义操作

反对并发

  • 无需改变代码,仅仅在并行网关或蕴含网关上配置 open-async=true,即可将其后的子链路并行化

RBAC(Role-based access control)模式

  • 针对平台型服务,首先能够定义编排出通用的链路模型
  • 模型中的某个工作节点,应答不同业务场景或需求方的诉求时,能够扩大不同的服务能力(比方 A、B 两个业务方都须要抽佣的服务,那么就能够定义一个抽佣的工作节点,而后 A 业务须要比例抽佣,而 B 业务须要阶梯式抽佣,这时就能够在抽佣的工作节点上再扩大两个不同的抽佣能力
  • 扩大进去的能力可视作资源,所有的资源都有着举世无双的资源名称,携带着蕴含某个资源名称的权限对象即可拜访与之对应的资源(资源也可称为:扩大进去的服务能力
  • 一批独立的权限对象有着较高的保护老本,所以可顺次将某一业务场景所需的全副权限聚合起来组成角色对象
  • 提供平台能力时,依据参数标识判断出具体的业务场景或需求方,并找到与之对应的角色,携带该角色执行预设的链路模型,即可实现定制化的业务诉求

详见:RBAC 模式

流程回溯

流程回溯能够在链路执行完之后,拿到后果或者异样之前,打印节点执行日志或执行自定义回调办法,能够应答如下问题:

  • 查看运行过节点的信息如:执行程序、节点耗时、入参、出参、异样信息等重要数据
  • 自定义流程回溯日志,或者能够在出现异常时才打印详情日志
  • 查看节点执行、参数设置等是否合乎预期。因为有时后果的确没有报错,但并不代表过程肯定没有问题
  • 如果链路中有自定义角色的操作,查看最终角色是否合乎预期

简化测试

  • 不依赖业务方入参,而是通过 Mock 业务角色的形式。之后申请携带该角色即可实现对蕴含有待测试服务节点或者能力扩大点的个性化业务链路的测试

Kstry 如何应用?

上面步骤仅为简略介绍,具体细节请参考应用文档

  • Kstry 应用文档
  • Kstry 应用 demo
  • 功能测试

1、配置引入

<dependency>
    <groupId>cn.kstry.framework</groupId>
    <artifactId>kstry-core</artifactId>
    <version>1.0.6</version>
</dependency>

2、我的项目引入

@EnableKstry(bpmnPath = "./bpmn/*.bpmn")
@SpringBootApplication
public class KstryDemoApplication {public static void main(String[] args) {SpringApplication.run(KstryDemoApplication.class, args);
    }
}

3、编写组件代码

@TaskComponent(name = "goods")
public class GoodsService {
    
    @NoticeResult
    @TaskService(name = "init-base-info")
    public GoodsDetail initBaseInfo(@ReqTaskParam(reqSelf = true) GoodsDetailRequest request) {return GoodsDetail.builder().id(request.getId()).name("商品").build();}
}

4、定义 bpmn 配置文件

5、调用执行

@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Resource
    private StoryEngine storyEngine;

    @PostMapping("/show")
    public GoodsDetail showGoods(@RequestBody GoodsDetailRequest request) {StoryRequest<GoodsDetail> req = ReqBuilder.returnType(GoodsDetail.class)
                                                  .startId("kstry-demo-goods-show").request(request).build();
        TaskResponse<GoodsDetail> fire = storyEngine.fire(req);
        if (fire.isSuccess()) {return fire.getResult();
        }
        return null;
    }
}

6、申请测试

退出移动版