編排功能方法

解決的問題

  • 人員迭代致使的代碼冗餘,你我他都有本身的實現spring

  • 不能動態的改變業務邏輯,可能在關鍵地方會使用開關json

  • 需求迭代排期時間長,須要大量的人力app

  • 產品基本不直掉現有能力,不能給甲方一個預估且較的時間atom

解決的思路

  • 在現有的能力下,組合各種服務以完成相應業務spa

  • 業務邏輯能夠動態的調整變動,亦可實現不回滾完成邏輯切換debug

  • 一個業務就是一個調用鏈,使用者只需關注入參和返回xml

實現目標&原理

目標

編排已有功能,進行組合,造成調用鏈,肯定入參後執行獲取結果,實現搭積木式的開發模式。 對象

原理

  1. 加載 功能&業務 配置 到內存內存

  2. 解析配置造成以業務key爲主鍵,功能調用鏈爲值的模型開發

  3. 提供 runBiz 開啓業務 和 獲取返回 的入口

實現示例

功能&業務定義

一個業務造成一個調用功能或者業務的鏈。即業務中可嵌套業務。

功能的核心要素

  • 功能的id即key

  • 功能的描述

  • 是否須要保存參數和返回

  • 功能類的獲取方式,經過spring容器或者反射

  • 功能類中的具體功能,即類中方法

  • 當前只支持一個入參或者沒有入參,即入參必須用一個自定義對象包裹,如有多個入參複雜度過高

  • 入參對象中的哪些屬性做爲輸入

  • 肯定從入參中仍是返回中的屬性做爲下一個功能的入參屬性

  • 肯定哪些屬性做爲下一個功能的入參屬性

 

functions_define:
 # 功能 key
test_function:
   # 功能 描述
  function_desc: 對輸入的參數進行疊加 返回 計算數字out2 和 總和out1
   # 是否保存輸入和返回
  function_in_keep: true
  function_out_keep: true
   # 功能 類 優先使用 function_clazz_by_spring,次之 function_clazz_by_reflect
  function_clazz_by_spring: functionClazz
  function_clazz_by_reflect: collect.debug.arrange.FunctionClazz
   # 功能 方法
  function_method: testFunction
   # 功能 方法 入參少於等於 1
  function_method_type: inputLessEqualOne
  function_method_in_clazz: collect.debug.arrange.FunctionTestContext
   # 入參 關鍵屬性 可爲空 必須是 function_method_clazz 的 field
  function_method_in_fields:
    - in
   # 導出來自 入參 input | 返回 output
  function_method_out_from: input
   # 返回 關鍵屬性 可爲空 必須是 function_method_clazz 的 field,生成 json 做爲 下一個 function_name 的 function_method_in_json
  function_method_out_fields:
    - out1
    - out2

業務的核心要素

  • 業務key即業務名稱

  • 調用的功能或者業務的key

  • 定義功能或者業務的第一個功能的入參是從上一個返回的哪一個屬性中來


biz_define:
compose_biz_1:
  arranges:
    - type: function
      name: test_function
     # 類型是 biz 的 input 不能爲空
    - type: biz
      name: sub_biz
      input: [out2->in]
    - type: function
      name: test_function
      input: [out2->in]
    - type: biz
      name: sub_biz
      input: [out2->in]
    - type: biz
      name: sub_biz
      input: [out2->in]
sub_biz:
  arranges:
    - type: function
      name: test_function
compose_biz_2:
  arranges:
    - type: function
      name: test_function
     # 類型是 biz 的 input 不能爲空
    - type: biz
      name: sub_biz
      input: [out2->in]
    - type: function
      name: test_function
      input: [out2->in]
    - type: biz
      name: compose_biz_1
      input: [out2->in]

開始一個調用

能夠動態加載功能&業務定義,覆蓋已有定義,動態改變調用業務邏輯

@Slf4j
public class ArrangeTest {

   public static void main(String[] args) throws IOException {
       // 啓動 spring 容器
       ApplicationContext applicationContext = new ClassPathXmlApplicationContext("context-spring.xml");

       // 加載配置文件
       ArrangeContext.load(new ClassPathResource("arrange/function-define.yml").getInputStream());

    // 定義第一個入參
       FunctionTestContext param = new FunctionTestContext();
       param.setIn(Lists.newArrayList(0));

    // 啓動一個業務調用鏈並傳入入參
//       ArrangeRetContext context = ArrangeContext.runBiz("compose_biz_2", null);
       ArrangeRetContext context = ArrangeContext.runBiz("compose_biz_2", JsonUtil.bean2json(param));

    // 返回最後一個功能的返回
       log.info(JsonUtil.bean2jsonPretty(context));
       FunctionTestContext ret = context.getLastRet();
       log.info(LogConstant.getObjString(ret));

       // 返回隨意一個功能返回
       ret = context.getByIndexFromMap(1, context.getOutputMap());
       log.info(LogConstant.getObjString(ret));

  }

}
相關文章
相關標籤/搜索