Skip to content

服务引擎

钟勋 edited this page Jun 22, 2021 · 6 revisions

简介

服务引擎用于规范服务执行步骤,解决服务执行中常见公共性痛点。当一个系统需要提供服务给其他系统调用时,往往服务会进行一些固定步骤操作,比如:入参校验(像JSR303)、业务参数校验、开启事务(如果有必要)、执行业务、异常捕获、构建应答等。如果每个服务都需要自己来完成这些操作,那么众多服务中就会存在很多重复的操作。采用服务引擎你可以一次性的完成这些步骤,简化你的代码。

1. 引入服务引擎

<dependency>
    <groupId>org.bekit</groupId>
    <artifactId>service</artifactId>
    <version>1.3.0.RELEASE</version>
</dependency>

2. 配置

  • 如果是spring-boot项目则不需要进行任何配置。
  • 如果是非spring-boot项目则需要手动引入服务引擎配置类ServiceEngineConfiguration。比如:
@Configuration
@Import(org.bekit.service.boot.ServiceEngineConfiguration.class)
public class MyImport {
}

3. 使用服务引擎

使用服务引擎的步骤:1、定义服务,2、定义服务监听器,3、调用服务。

3.1 定义服务

// 转账交易服务
@org.bekit.service.annotation.service.Service(enableTx = true)
@Slf4j
public class AddUserService {

    // 服务前置处理(可以进行业务参数检查,比如校验账号存不存),本方法执行前不会主动开始事务
    @ServiceBefore
    public void before(ServiceContext<AddUserOrder, AddUserResult> context) {
        log.info("执行AddUserService.before");
        // 具体校验逻辑
    }

    // 服务执行,真正开始执行业务(如果@Service的enableTx=true,则会主动开启事务,本方法执行结束后会提交事务)
    @ServiceExecute
    public void execute(ServiceContext<AddUserOrder, AddUserResult> context) throws TimeoutException {
        log.info("执行AddUserService.execute");
        AddUserOrder order = context.getOrder();
        AddUserResult result = context.getResult();

        // 具体业务逻辑
    }

    // 服务后置处理(本方法执行前不会主动开始事务)
    @ServiceAfter
    public void after(ServiceContext<AddUserOrder, AddUserResult> context) {
        log.info("执行AddUserService.after");
        // 具体业务逻辑
    }
}

3.2 定义服务监听器

服务监听器可以监听服务引擎发出的事件,监听到事件后可以进行入参校验(像JSR303)、业务参数校验、开启事务(如果有必要)、执行业务、异常捕获、构建应答等。它监听的是所有服务的事件,所以只需定义一次,而不是每个服务都定义一次。

@ServiceListener(priority = 1)  // 服务监听器注解(监听服务引擎发出的事件),priority属性表示监听器优先级(具体使用方式请查看“事件总线”功能模块)
public class MyServiceListener {
    // 监听服务申请事件
    @Listen
    public void listenServiceApplyEvent(ServiceApplyEvent event) {
        // 监听到这个事件后,可以进行一些初始化,比如:打印日志、JSR303校验等
    }

    // 监听服务异常事件
    @Listen(priorityType = PriorityType.DESC)
    public void listenServiceExceptionEvent(ServiceExceptionEvent event) {
        // 监听这个事件后可以执行一些操作,比如:打印异常日志。
    }

    // 监听服务完成时间
    @Listen(priorityType = PriorityType.DESC)
    public void listenServiceFinishEvent(ServiceFinishEvent event) {
        // 监听这个事件后可以进行一些结尾性操作,比如:打印日志。
    }
}

3.3 执行服务

在需要执行服务的地方注入服务引擎ServiceEngine

@Autowired
private ServiceEngine serviceEngine;

然后就可以执行服务

AddUserOrder order = new AddUserOrder();
order.setUsername("zhangsan");
order.setAge(20);
// 执行服务
AddUserResult result = serviceEngine.execute("addUserService", order);