likes
comments
collection
share

模仿 mapstruct 实现一个微服务编排框架(中)

作者站长头像
站长
· 阅读数 15

起始原因 是 我们公司 分布式事务 使用的是 seate 分布式事务框架,现在只在一些小部分使用,因为考虑到seate 对性能 TCP的影响,对事务这块没有更多的选择。我就在想 是不是做一个 微服务 编排框架 来解决这个问题。这里就

微服务编排框架 开发背景

  1. 因为我们是saas 可能A企业要这个功能,B企业不要,通过服务编排就可以解决这种情况(还是要受制于业务的)
  2. 解决分布式 事务问题,我们涉及到钱的用seate ,其他的用这个框架,能提升性能和TPS

今天和 公司大佬的商量,我们现在 从业务上 解决了 分布式事务,暂时没有需要。但是我感觉 迟早能用上,不行 用不用 我都写

准备工作

写一个基础组件的 准备工作 基本就是从 create 开始,建立一个 pom文件 管理版本号

基本的规范 (不全,之后补充)

  1. 写代码的时候 请保证 按照 《阿里开发规范》 ,经过检查才允许提交
  2. version 请都放在parent pom.xml 进行指定
  3. 开发代码 之前 要经过技术评审(除非很小的改动不用)

建立一个目录,我这的目录是

yuye-parent -- 父项目,公共依赖
│  ├─yuye-process-engine 流程编排一级工程
│  │  ├─process-engine-wrapper 流程编排 wrapper
│  │─yuye-examples  例子pom
│  │  ├─process-engine-demo 流程编排例子
│  │  │  ├─process-engine-demo-springboot 流程编排例子-springboot 例子

组件开发基础知识

  1. 组件的类 往往需要 被spring 扫描,但是不能让业务系统 通过@MapperScan 来添加包名的扫描 来进行加载,因为 这样会导致 spring 加载一些没必要的文件,而且不好根据 属性来控制 加载哪几个 Service
  2. 有的人 会用 META-INF/spring.factories 来解决 ,但是也不行,但是这还是 那个问题,没有办法 根据属性控制 加载 **解决办法呢?**哪几个Service,@configuration注解 来用@Bean 控制记载哪些bean 就可以了

到这了 基本组件开发 容易错误的地方 就这些

流程编排组件 流程图

先来一版 简单版本,就是支持 正常流程 / 回滚流程 / 多节点选择

模仿 mapstruct 实现一个微服务编排框架(中)

代码 我不就粘贴了,之后 放码云上

README.cn.md

雨夜-微服务 编排框架 yuye-process-engine

yuye-process-engine 是一个分布式编排 平台,具有低延迟,高性能和可靠性,和灵活的可扩展性。

现在公司 暂时用不上,临时想法,做一个技术储备

背景:

1 因为我们是saas 可能A企业要这个功能,B企业不要,通过服务编排就可以解决这种情况(还是要受制于业务的)

2 解决分布式 事务问题,我们涉及到钱的用seate ,其他的用这个框架,能提升性能和TPS

它提供了多种功能:

    自定义流程

    流程修改 即时生效

    可以保证 异构数据的 事务一致性,保证 最终一致性

    TPS 基本无损耗,(TODO 还在完善,需要测试)

接下来要完成的功能:

    1 测试接入 现有项目 写starter (计划 2022-08-30 完成)
    2 优化反射那块
    3 出性能测试 结果
    4 node 可视化 可以动态拖动 修改
    5 流程可修改 即时生效

本段将指导您完成以不同方式安装yuye-process-engine的步骤。对于本地开发和测试,将为每个组件仅创建一个实例。

## 开始使用:

当前最新版本为 1.0-SNAPSHOT

pom.xml 添加

```
   <dependencies>
        <dependency>
            <groupId>com.xxx</groupId>
            <artifactId>xxx-process-engine-wrapper</artifactId>
        </dependency>
    </dependencies>
    
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.xxx</groupId>
                <artifactId>xxx-yuye</artifactId>
                <version>1.0-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
         </dependencies>
    </dependencyManagement>

```

Application 类添加
@EnableProcessEngine("process-demo.xml") xml名称可加 可不加 不加会从nacos 获取
默认命名为 项目名-${env}-process.xml

```
    @Bean
    public ProcessStateStore processStateStore() {
        return new DefaultProcessStateStore(redissonClient(), new ContinueProcessRefreshPolicy());
    }


    private static RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://xxx:6379")
            .setConnectionMinimumIdleSize(10)
            .setConnectionPoolSize(100)
            .setIdleConnectionTimeout(600000)
            .setSubscriptionConnectionMinimumIdleSize(10)
            .setSubscriptionConnectionPoolSize(100)
            .setTimeout(30000);
        config.setCodec(new StringCodec());
        config.setThreads(5);
        config.setNettyThreads(5);
        return Redisson.create(config);
    }
```

正常使用

```
ProcessContext process1 = processContextFactory.getContext("process1");
process1.set("nextId", "xxx");
process1.start();
```

技术参考
![img.png](img.png)

未来期望

![img_1.png](img_1.png)

### check whether CRDs is successfully installed

### check whether operator is running

# Learn it & Contact us

如果 想 一起开发 请联系我 各个位置 (前端 / 后台 / 测试 / 产品 都需要)

提交规范
1 写代码的时候 请保证 按照 《阿里开发规范》 ,经过检查才允许提交
2 version 请都放在parent pom.xml 进行指定
3 开发代码 之前 要经过技术评审(除非很小的改动不用)
4
贡献
我们始终欢迎新的贡献,无论是琐碎的清理,大的新功能还是其他物质奖励,更多细节请参阅此处。

下节

mapStruct 源码分析

慢慢迭代吧,其实说实话 网上也有很多 开源组件,但是我们现在不特意造造轮子,以后 更没有希望,用开源的 很多人都会,你怎么证明你的价值呢? 平时多写 在公司 使用,去逼着我们迭代,进行提升,这才是正道

如果 想 一起开发 可以联系 我 各个位置 (前端 / 后台 / 测试 / 产品 都需要)欢迎参与 可以加 wx yuyezhiji