spider-node 快速入门

  • 本章节介绍运行spider-node的系统要求,如何安装,启动一个集群,然后运行一个简单的HelloWorld示例

1:环境要求

  • jdk 8:

  • Elasticsearch 5.7/7~8

  • redis 不局限版本

  • MySQL 不限版本

  • 硬件配置(最低2核心4G,系统支持epoll模型)

  • 下载启动包 点击访问 spider-nodeopen in new window

2: spider架构

2.1:架构图

VuePress Logo

2.1:架构讲解

gateway
  • 作为访问spider能力的入口
ui
  • 提供spider-node的页面访问能力(默认端口6140)
broker
  • 作为spider-node的核心部分,他由多个角色组成 主要承载spider对业务功能,与业务功能实例的,全生命周期管理。
flow-node
  • 执行实例的生命周期管理,流程引擎管理

scheduler

  • 注册中心(服务端worker注册到scheduler中),跟worker进行通信,提供给 flow-node执行实例过程中,与服务端的worker进行通信

transaction

  • 分布式事务管理-提供spider-node实例中需要事务的节点,进行对事务的 commit,rollback

controller

  • 控制集群中的节点状态,提供选举leader,follower, 提供broker之前副本的规则,leader与follower的通信

area

  • 领域功能生命周期的管理,提供给spider-node在执行流程实例过程中需要的领域信息

param-manger

  • spider-node执行流程实例过程中,实例参数的生命周期管理。

log-manger

  • 对spider-node执行过程中的节点,入参,返回参数,执行状态等信息,进行存储,主要提供给日志业务进行搜索,与重试功能。

3:spider-配置

spiderConf.properties

# 启动环境
environment = local
# 集群模式(zk/hazelcast)建议使用zk
cluster-type = hazelcast

spiderConf-local.properties redis

# 最大空闲连接数
redis-minIdle = 1

# 链接初始化新增连接心跳的配置
redis-pingConnectionInterval = 60000

# 核心连接数
redis-core = 15

# 最大等待时间
redis-maxWait = 3000

# redis连接地址
redis-host-name = xxxx,xxxx,xxxx

# redis-密码
redis-password = newhope

# redis-端口
redis-port =26379

# redis执行超时配置
redis-timeout =10000

# redis 集群模式(standAlone(单机)/sentinel(哨兵)/masterSlave(主从)/cluster(集群))
redis-type = sentinel
# redis的 master-name
redis-master-name = redisMaster

spiderConf-local.properties mysql

# mysql 的连接地址
mysql-host = xxxx

# 密码
mysql-password = xxxx

# 用户名
mysql-user = xxxx

# 端口号
mysql-port = 3306

# 库名
mysql-database = xxxx

spiderConf-local.properties 文件存储配置


### file type config MINIO/OSS(阿里云的OSS)
file_server_type = MINIO

# minio (spider-node提供玩的配置,可以选择自己公司的配置)
minio_url = http://47.109.67.130:1026

minio_access_key = s6ycDmJoFu7Y2nbDhJ9R

minio_secret_key = CHlubXwEhPSb0E9LkOLmgmrSa943pXEIGHtnWLPw

minio_bucket_name = spider-node


### 阿里云 oss配置
oss_endpoint = xxxxxx

oss_keyId = xxxxxx

oss_keySecret = xxxxxxx

oss_bucketName = xxxxxx

bpmn_path = bpmn

sdk_path = sdk

spiderConf-local.properties spider角色启动配置

# broker 包含 flow-node,gateway指的访问spider的入口,ui指的启动spider的访问界面
role = broker,gateway,ui

spiderConf-local.properties 限流配置

# 间隙
limitation-interval = 20

# 并发数
limitation-number = 600

spiderConf-local.properties zk配置(集群模式选择zk时需要配置)

zk-addr = xxxx(域名地址或者ip即可,不需要添加端口)

spiderConf-local.properties rocksdb路径配置(可自定义)

rocksdb_path =/usr/local/rocksdb/ 

spiderConf-local.properties es配置

# 日志使用的类型(es 8以下使用/esx 8包括8以上使用)
log_type = esx

# es的连接地址是否为https
https_credit = true

# es集群名称
es-cluster-name = elasticsearch

# es连接地址
es-ip-addr = xxxx:9200

# es连接名称
es-username = bms-spider

# es连接密码
es-password = gSqWkvnkV4lO1h0skOLG

spiderConf-local.properties 公共配置


# 该配置不能改- spider-node与业务服务之前的通信方式
rpc-type = grpc

# 界面访问端口
ui-port = 6140

# soider-node服务端口号
function-port = 8080

# 启动每个角色的实例数,默认使用1(尽量别动)
instance-number = 1

引入依赖

<!-- spider-worker端 mvn 依赖 -->
		<dependency>
			<groupId>cn.spider-node</groupId>
			<artifactId>client</artifactId>
			<version>1.0.2.2</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-tx</artifactId>
				</exclusion>

				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-oxm</artifactId>
				</exclusion>
				<exclusion>

					<groupId>org.springframework</groupId>
					<artifactId>spring-aop</artifactId>
				</exclusion>

				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-context-support</artifactId>
				</exclusion>

				<exclusion>
					<groupId>cn.spider-node</groupId>
					<artifactId>spider-mybatis-plugin</artifactId>
				</exclusion>

				<exclusion>
					<groupId>cn.spider-node</groupId>
					<artifactId>spider-transaction</artifactId>
				</exclusion>

				<exclusion>
					<groupId>com.google.api.grpc</groupId>
					<artifactId>proto-google-common-protos</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-hazelcast</artifactId>
				</exclusion>

				<exclusion>
					<groupId>com.hazelcast</groupId>
					<artifactId>hazelcast</artifactId>

				</exclusion>

				<exclusion>
					<groupId>com.hazelcast</groupId>
					<artifactId>hazelcast-kubernetes</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-web-client</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-core</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-codegen</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-service-proxy</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-grpc</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-web</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-bridge-common</artifactId>
				</exclusion>

				<exclusion>
					<groupId>io.vertx</groupId>
					<artifactId>vertx-auth-common</artifactId>
				</exclusion>

				<exclusion>
					<groupId>org.redisson</groupId>
					<artifactId>redisson</artifactId>
				</exclusion>

			</exclusions>
		</dependency>

		<dependency>
			<groupId>io.vertx</groupId>
			<artifactId>vertx-grpc</artifactId>
			<version>4.3.7</version>

		</dependency>


		<dependency>
			<groupId>io.vertx</groupId>
			<artifactId>vertx-core</artifactId>
			<version>4.3.7</version>
		</dependency>

		<dependency>
			<groupId>io.vertx</groupId>
			<artifactId>vertx-web-client</artifactId>
			<version>4.3.7</version>
		</dependency>

<!-- spider-sdk mvn 依赖 -->  

        <dependency>
			<groupId>cn.spider-node</groupId>
			<artifactId>annotation</artifactId>
			<version>1.0.2</version>
		</dependency>

worker服务的yaml新增spider配置

spider:
  server:
    ip: spider-node.spider-node
    port: 8080
  worker:
    name: bms-plus
    rpc-port: 9972

spider-node 启停

  • 启动命令/停止命令
cd /spider-node/bin ./start.sh
cd /spider-node/bin ./stop.sh

spider-node sdk

  • sdk包含 方法的入参 出参 接口 三个要素

接口

  • 接口示例
@TaskComponent(name = "test_service", workerName = "bms_middle_platform")
public interface TestService {
    @NoticeScope(scope = {ScopeTypeEnum.VARIABLE},target = "bill")
    @TaskService(name = "query_bill_status")
    Bill queryBill();

    @TaskService(name = "update_bill_status")
    UpdateBillStatusResult updateBillStatus();

    @TaskService(name = "test_update_status")
    void testUpdateStatus(TestBillStatusUpdateParam param);
}

入参

@Data
public class BuildPricingFailParam {
    /**
     * 基础信息
     */
    @StaTaskField("sortInfo")
    private InitSortInfoResult sortInfoResult;

    /**
     * 节点类型
     */
    @ReqTaskField("checkpointEnum")
    private String checkpointEnum;

    /**
     * 计费信息
     */
    @ReqTaskField("input")
    private WarehouseInput input;

    @ReqTaskField("checkpoint")
    private String checkpoint;
}

出参

@Data
public class UpdateBillStatusResult {

    @NoticeVar(target = "bill.billStatus")
    private String billStatus;
}

@Data
public class InitSortInfoResult {
    /**
     * 项目id
     */
    private String projectId;

    /**
     * 项目名称
     */
    private String projectName;

    /**
     * 应收结算主体
     */
    private String payeeInfo;

    /**
     * 应付结算主体
     */
    private String payerInfo;

    /**
     * 应收公司
     */
    private String payee;

    /**
     * 应付公司
     */
    private String payer;

    /**
     * 应收租户id
     */
    private String payeeTenantId;

    /**
     * 应付租户id
     */
    private String payerTenantId;

    /**
     * 合同编码
     */
    private String contractCode;

    /**
     * 应付项目id
     */
    private String payerProjectId;

    /**
     * 应付项目名称
     */
    private String payerProjectName;
}

spider-node 注解

@TaskComponent 域组件的注解

@TaskComponent(name = "pricing_warehouse", workerName = "bms_middle_platform")
name 指的组件名称 
workerName 指提供组件的服务名称

@TaskService 域组件中的-域功能注解

@TaskService(name = "pricing")
name 指的域功能名称

@NoticeSta 通知返回 sta域对象注解

@NoticeSta(target = "pricing_result")
target 指定返回到某个域对象
设置后,不允许修改-修改会抛出异常
返回到 sta参数域
作用于 接口的方法

@NoticeVar 通知返回 var域对象注解

@NoticeVar(target = "bill")
target 指定返回到某个域对象
设置后允许修改
返回到 var参数域
作用于 接口的方法

@NoticeVar

@NoticeVar(target = "bill.billStatus")
target 指定返回 bill域对象中,对billStatus进行修改
var 域允许修改
作用域 返回的参数实体字段上面

@NoticeSta

@NoticeSta(target = "bill.billStatus")
target 指定返回 bill域对象中,对billStatus进行修改
var域 不允许修改
作用域 返回的参数实体字段上面

@VarTaskField

@VarTaskField("bill.billStatus")

指定获取 sta域里面 bill域对象中的billStatus字段

作用域 接口入参的参数实体字段上面

@StaTaskField

@StaTaskField("pricing_result.costs")

指定获取 sta域里面 pricing_result域对象中的costs 字段

作用域 接口入参的参数实体字段上面

@ReqTaskField(执行域业务功能的入参)

@ReqTaskField("checkpointEnum")

指定获取 req域里面 checkpointEnum 字段

作用域 接口入参的参数实体字段上面

@NoticeResult

指定执行结果将被通知到StoryBus中的哪些作用域中,@NoticeResult说明,该方法执行结果将被通知到result域,最终作为Story的执行结果返回给调用方
作用于字段/方法

spider-node 参数映射

  • 参数映射的设计初衷,当B域里面有个b1字段,在某个场景下,是A域中的 a1字段,在某个域业务功能执行过程中可以通过B.b1 = A.a1做隐射,自动获取a1的
  • 示例
{"user.id":"req.userId","user.name":"req.userName","payBill.adjustedAmount":"req.adjustCostValue","payBill.cost":"adjustInfo.shippingOrderCosts"}

spider-node 数据流转

  • spider中存在 1个数据域(为每个执行流程实例分配一个域)

  • req 该域作为执行域业务功能的入参 (取请求参数值的时候,使用req.xxxx)

  • 过程对象域 (取域对象值的时候使用,类似order.status 取到订单中的状态值)

spider-node 配置流程返回数据

spider_business_function_version 表中的字段 result_mapping 进行返回值配置

类似 {"result":"syncOilResp.result","msg":"syncOilResp.msg"}
解释 功能执行后,需要返回给调用者的字段为 result,msg ,result 的值来自于syncOilResp对象域中的 result值

spider-node bpmn模型

包含网关 + 判断网关

VuePress Logo

延迟节点

VuePress Logo

service_task_type = DELAY
delay_time = 15

轮询节点

VuePress Logo

service_task_type = POLL
poll_count = 10/10S

异步

VuePress Logo

参数转换

VuePress Logo

conversion_param = {"1":"AWAIT_VERIFY","0":"NOT_NEED_VERIFY"} 解释 把值为1的转成AWAIT_VERIFY