枣庄住房和城乡建设厅网站广州微信网站建设报价表
2026/4/14 14:45:44 网站建设 项目流程
枣庄住房和城乡建设厅网站,广州微信网站建设报价表,做建材的网站有哪些,以绿色为主色调的网站作为一个优秀的程序员#xff0c;要守住职业的底线。能简单快速的完成的一件事#xff0c;就一定要用简单的方案快速完成。不可过度的设计#xff0c;始终保持系统的简洁#xff01; 曾几何时#xff0c;我对于流程编排这件事 嗤之以鼻#xff0c;为什么呢#xff1f;我…作为一个优秀的程序员要守住职业的底线。能简单快速的完成的一件事就一定要用简单的方案快速完成。不可过度的设计始终保持系统的简洁曾几何时我对于流程编排这件事 嗤之以鼻为什么呢我认为流程编排是典型地过度设计。在我看来代码越直观越可靠我不喜欢看代码的时候跳来跳去。但是流程编排后要把各个方法放到扩展类通过组合各个扩展类新建一个流程实现业务功能这能有什么好处呢业务中台要接入很多的业务方每个业务方并不是完全相同。很多时候无法完全复用需要改造系统适应新的业务。新增业务代码时务必要保证原有业务不受影响如果没有流程编排能力就会充斥大量的 if else 。if (biz BizA || biz BizB) { //do some thing //这部分逻辑相同 if (biz BizA) { //差异化处理 } if(biz BizB) { //差异化逻辑 } }例如上面的代码不同的业务线若有差异化逻辑需要新增分支单独处理。想象一下当有 10 多个业务接入了你的系统那么一定让人抓狂……任何一个人都无法保证对 10 多种业务完全熟悉每个人可能只负责 1 个业务然而如果没有代码逻辑的隔离维护者只能在千丝万缕中才能找到目标代码逻辑。更可怕的是每次新增一个业务需要在原有的屎山中继续不断新增 if else。直到有一天有一个倒霉蛋改错了代码导致其他重要业务受影响引发线上故障。想象一下当你改了几行代码以后要求测试同学回归10 多个业务线的全部逻辑这显然不现实。以上的问题和痛点可归纳为代码隔离性和业务扩展点问题。解决这两类问题有如下手段使用流程引擎为不同的业务配置不同的流程执行链使用插件扩展引擎不同的业务实现差异化部分。MemberClub 中大量使用流程引擎和插件扩展引擎解决业务隔离性和扩展性 问题。MemberClub是托管在Gitee平台的开源项目提供了付费会员的交易解决方案在各类购买场景下提供各类会员形态的履约及售后结算能力具体介绍可参见https://gitee.com/juejinwuyang/memberclub配置流程执行链考虑到不同的会员产品交易提单流程不同不同的产品应配置不同的流程DemoMemberPurchaseExtension实现了购买扩展点并且定义了三个流程执行链的配置方式。如截图所示~定义流程节点流程节点中的方法包括process、success、rollback和callback方法。流程执行流程执行时 需提供流程上下文对象。调用FlowChain.execute方法即可实际执行阶段各个流程节点被流程引擎串联起来依次执行类似于责任链的设计模式具体执行顺序如下图所示。依次执行每个流程节点的process方法若process方法出现异常则执行rollback方法。若所有的process方法执行成功则倒序依次执行success方法。流程引擎执行原理以下是FlowChain.execute方法执行原理。public T void execute(FlowChainT chain, T context) { Exception exception null; int index -1; for (FlowNodeT node : chain.getNodes()) { try { node.process(context); index; } catch (Exception e) { if (e instanceof SkipException) { CommonLog.warn(当前流程:{} 发出 Skip请求,后续流程不再执行, node.getClass().getSimpleName()); break; } exception e; break; } } if (exception ! null) { for (int i index; i 0; i--) { FlowNodeT node chain.getNodes().get(i); try { node.rollback(context, exception); } catch (Exception e) { CommonLog.error(rollback执行异常,忽略 name:{}, node.getClass().getSimpleName(), e); } } } else { for (int i index; i 0; i--) { FlowNodeT node chain.getNodes().get(i); try { node.success(context); } catch (Exception e) { CommonLog.error(success 执行异常,忽略 name:{}, node.getClass().getSimpleName(), e); } } } for (int i index; i 0; i--) { FlowNodeT node chain.getNodes().get(i); try { node.callback(context, exception); } catch (Exception e) { CommonLog.error(callback执行异常,忽略 name:{}, node.getClass().getSimpleName(), e); } } if (exception ! null) { throw exception; } }以上全部代码地址可以参见 MemberClubhttps://gitee.com/-/ide/project/juejinwuyang/memberclub/edit/master/-/memberclub.common/src/main/java/com/memberclub/common/flow/FlowChainService.javaMemberClub是托管在Gitee平台的开源项目提供了付费会员的交易解决方案在各类购买场景下提供各类会员形态的履约及售后结算能力一个非常好的项目适合用来学习业务中台系统具体介绍可参见Gitee开源地址https://gitee.com/juejinwuyang/memberclubGitHub开源地址:https://github.com/juejin-wuyang/memberclub在这个项目中你可以学习到 SpringBoot 集成 以下框架或组件。Mybatis-plusSharding-sphere 多数据源分库分表Redis/redissonApolloSpringcloudfeign/enrekaRabbitMQH2 内存数据库SwaggerLombokMapStruct同时你也可以学习到以下组件的实现原理流程引擎扩展点引擎分布式重试组件通用日志组件商品库存分布式锁组件Redis Lua的使用Spring 上下文工具类

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询