精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MetrAutoAPI系統架構設計

開發 前端
商用數據庫不是開發者的玩具,而是要被用戶長期使用的,不斷升級的技術不應該讓使用者的知識不斷的過期,保持知識與接口的兼容性方面,我們的國產數據庫還是有很多地方要多學學Oracle。?

1.背景

公司正在進行數據戰略轉型,因此我們面臨的數據需求越來越多,而我們擁有的指標數據越來越豐富。不過,僅僅擁有數據并不夠,我們需要能夠更加靈活高效的使用這些數據,以應對頻繁多變的數據需求。傳統的數據業務開發流程效率低下,無法及時響應變化的需求。因此,我們必須找到一種快速、靈活的解決方案,以滿足我們快速變化的需求。

2.MetrAutoAPI設計

2.1平臺介紹

MetrAutoAPI(Metric Automate API即指標自動化API)將指標數據與應用層做分離,MetrAutoAPI僅負責管理和處理數據信息,對外提供了一個通用的API接口,所有的數據請求和響應都通過這個接口進行傳輸和處理。

MetrAutoAPI支持多個數據源集成,其API建模功能靈活可配置,可通過頁面拖拽和配置生成SQL查詢語句,幫助用戶快速準確地獲取所需數據。此外,規則引擎服務可以對查詢結果進行靈活的運算,幫助用戶實現自動化計算和分析,從而提高效率。

2.2架構設計

圖片圖片

物理查詢層:通過統一查詢引擎,實現對不同來源數據庫的查詢

語義模型層:負責指標元數據的管理,并對API-SQL模型進行管理。

統一服務層:提供指標維度的API構建功能,以及基于指標維度的數據查詢和規則引擎配置服務。

統一接口層:提供一個對外的API接口,所有的數據請求和響應都通過這個接口進行傳輸和處理。

此方案對比傳統開發模式:

圖片圖片

2.3使用場景

以下是MetrAutoAPI的一些使用場景的介紹:

?數據看板展示

圖片圖片

2.4核心功能

?2.4.1 SQL建模服務

利用Zealot與MySqlStatementParser實現SQL建模功能

可以根據不同的查詢條件和參數動態生成對應的SQL語句,從而避免手動拼接SQL語句帶來的代碼冗余和錯誤,可以很好地支持參數的綁定和傳遞,可以通過占位符或命名參數的方式傳遞參數,同時支持參數類型的自動轉換

SQL建模過程如下:

public static List<FieldVo> getFieldName(String sqlStr) {  
        MySqlStatementParser mySqlStatementParser = new MySqlStatementParser(sqlStr);  
        //使用parpser解析生成的AST,這里sqlStatement是AST,AST為抽象語法樹  
        SQLStatement sqlStatement = mySqlStatementParser.parseStatement();  
        MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();  
        sqlStatement.accept(visitor);  
  
        //list是存儲表名和字段名的集合  
        List<FieldVo> list = new ArrayList<>();  
        Collection<TableStat.Column> columns = visitor.getColumns();  
        //通過循環將表名和字段名解析出,并存儲到list集合中  
        columns.stream().forEach(row -> {  
            if (row.isSelect()) {  
                FieldVo fieldVo = new FieldVo();  
                fieldVo.setTableName(row.getTable());  
                fieldVo.setFieldName(row.getName());  
                list.add(fieldVo);  
            }  
        });  
  
        List<FieldVo> aliasList = getAliasField(sqlStr);  
        for (int i = 0 ; i < list.size() ; i ++) {  
            FieldVo vo = list.get(i);  
            FieldVo aliasVo = aliasList.get(i);  
            if (Objects.isNull(aliasVo.getAliasName())) {  
                vo.setAliasName(vo.getFieldName());  
            } else {  
                vo.setAliasName(aliasVo.getAliasName());  
            }  
        }  
        return list;  
    }

自動生成API-SQL接口文檔說明:

圖片圖片

?2.4.2 API-aviator規則引擎服務

Aviator是一個高性能、輕量級的java語言實現的表達式求值引擎,主要用于各種表達式的動態求值,使用規則引擎可以把復雜、重復的業務規則同各個業務系統分離開,以提高業務邏輯的復用能力和開發效率。

圖片圖片

規則表達式設置如下:

圖片圖片

初始化規則引擎:

public class AviatorEvaluatorUtils {  
    private static AviatorEvaluatorInstance instance = AviatorEvaluator.getInstance();  
  
    public AviatorEvaluatorUtils() {  
    }  
  
    public static AviatorEvaluatorInstance getInstance() {  
        return instance;  
    }  
  
    static {  
        instance.addFunction(new TransNullToZeroRule());  
        instance.addFunction(new IsNullRuleFunction());  
        instance.addFunction(new CrrRadioRule());  
        instance.addFunction(new CrrRule());  
    }  
}

規則引擎服務會解析并執行規則表達式。

private List<Map<String, Object>> expResult(List<RestApiVo> fieldList, List<Map<String, Object>> dataList) {  
       Stopwatch started = Stopwatch.createStarted();  
       List<Map<String, Object>> resultList = new ArrayList<>();  
       for (Map<String, Object> map : dataList) {  
           Map<String, Object> dataMap = new HashMap<>();  
           fieldList.forEach(e -> {  
               try {  
                   Expression exp = AviatorEvaluatorUtils.getInstance().compile(e.getFieldExp(), true);  
                   Object value = exp.execute(map);  
                   if (Objects.isNull(value)) {  
                       dataMap.put(e.getFieldName(), null);  
                   } else {  
                       if (e.getIsFormat().intValue() == 1) {  
                           BigDecimal decimal = new BigDecimal(value.toString());  
                           BigDecimal scale = decimal.setScale(e.getNumberFormat().intValue(), BigDecimal.ROUND_HALF_UP);  
                           dataMap.put(e.getFieldName(), scale);  
                       } else {  
                           dataMap.put(e.getFieldName(), value);  
                       }  
                   }  
               } catch (Exception ex) {  
                   log.error("解析表達式異常,字段:{},結果:{}", JsonUtil.serialize(e), JsonUtil.serialize(map), ex);  
                   dataMap.put(e.getFieldName(), null);  
               }  
           });  
           resultList.add(dataMap);  
       }  
       log.warn("轉換結果耗時:{}", started.stop());  
       return resultList;  
   }

?2.4.3 API統一查詢引擎

提供標準化的接口和協議,使得調用端可以通過一致的方式來請求和響應多個不同的 API。這樣做可以簡化開發人員的工作,加快應用程序的開發速度,同時提高系統的可靠性和可維護性。

/** 
     * 統一API接口 
     * @param _appId appId 
     * @param params 入參 
     * @return 
     */  
    @PostMapping("/restApi")  
    public Protocol<List<Map<String, Object>>> restApi(String _appId, @RequestBody Map<String, Object> params, String apiKey) {  
        ParamsValid valid = new ParamsValid();  
        valid.validNotNull("params", params)  
                .valid("apiId與apiKey不能同時為空", () -> {  
                    if (Objects.isNull(params.get("apiId"))  && Objects.isNull(params.get("apiKey"))) {  
                        return false;  
                    }  
                    return true;  
                }).valid("apiKey值不正確", () -> {  
                    if (Objects.nonNull(params.get("apiKey"))) {  
                        if (Strings.isNullOrEmpty(params.get("apiKey").toString())) {  
                            return false;  
                        }  
                    }  
                    return true;  
                });  
        if (!valid.isValid()) {  
            return valid.showInValidMessage();  
        }  
        Protocol<List<Map<String, Object>>> protocol = null;  
        try {  
            protocol = targetAutoService.restApi(params, _appId, 1);  
        } catch (DataSelfException ex) {  
            log.error("查詢數據異常:param:{},apiKey:{}", JsonUtil.serialize(params), apiKey, ex);  
            return new Protocol<>(-1, ex.toString());  
        } catch (Exception e) {  
            log.error("查詢信息異常:param:{}", JsonUtil.serialize(params), e);  
            return new Protocol<>(-1, "查詢異常,請重試");  
        }  
        return protocol;  
    }

流程如下:

圖片圖片

3.實踐過程中問題及解決方案

3.1使用過程中遇到的難題

接口性能差:接口性能差,分析日志發現從數據庫中讀取配置與規則引擎信息耗時較長,性能較差。

解決方案:使用redis作為緩存,存儲模型元數據信息,統一API引擎在讀取配置數據前先從redis中獲取,如果獲取不到再從業務庫中讀取,并將讀取到的數據寫入redis緩存,設置過期時間,定期清除redis緩存中過期的數據,避免占用過多的內存;通過以上優化,可以有效減少從數據庫中讀取配置數據的時間,提高接口性能。

使用緩存后,性能對比:

圖片圖片

上線成本高:測試環境建模并驗證完成后,還需要在線上環境再次建模,不僅重復操作并且可能因為人為疏忽造成線上線下模型不一致,從而造成嚴重后果。

解決方案:使用信息復制可以簡化測試環境到線上環境的配置過程,從而提高工作效率。具體實現步驟如下:

在測試環境中建模,并將模型元數據信息保存為一個JSON格式的數據,通過粘貼板復制功能,將JSON信息復制到線上環境,通過權限控制來進行安全控制(配置簡單化),避免人為異常。

多API接口合并:由于調用方可能需要的指標過于繁瑣,可能涉及多個指標API接口的調用,造成調用方調用次數過多,造成并發多,壓力大,影響調用方的使用或者造成調用鏈過長

解決方案:采用接口聚合的方式來解決。接口聚合是將多個API接口的數據聚合到一個API接口中,使得調用方只需要調用一個API接口就能獲取到需要的所有指標數據,避免了多次調用導致的并發過多和響應時間過長的問題。同時,也可以提高接口的可用性,避免接口出錯或者異常導致調用失敗。

4.參考文獻

ApiJson:http://apijson.cn/doc/zh/

Mybatis:ttps://github.com/mybatis/mybatis-dynamic-sql

Zealot:ps://gitee.com/chenjiayin1990/zealot

Aviator:https://www.yuque.com/boyan-avfmj/aviatorscript

作者簡介

李賀曉

  • 經銷商技術部-i車商團隊
  • 2018年加入汽車之家,任職于經銷商技術部-i車商團隊,目前主要負責數據類產品開發和探索。
責任編輯:武曉燕 來源: 之家技術
相關推薦

2014-05-19 10:08:36

IM系統架構設計

2015-10-16 14:35:05

SaaSCRM架構設計

2017-12-12 08:40:00

2023-08-16 12:34:16

同步備份異步備份

2024-08-16 14:01:00

2024-10-17 08:26:53

ELKmongodb方案

2013-05-27 10:58:28

Tumblr架構設計雅虎收購

2023-07-06 00:41:03

SQLNoSQL數據庫

2018-05-17 10:10:17

架構設計優化

2010-08-10 10:10:28

系統架構

2023-07-05 00:36:38

系統架構設計

2023-07-09 15:20:00

緩存平衡性能

2015-11-13 10:25:04

京東商品搜索架構

2015-06-02 04:17:44

架構設計審架構設計說明書

2025-04-15 04:00:00

2025-05-09 08:45:13

2023-07-03 17:15:12

系統架構設計

2015-06-02 04:34:05

架構設計

2023-07-17 18:39:27

業務系統架構

2011-04-22 16:23:16

ASP.NET動態應用系統
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久四虎| 日韩福利电影在线观看| 精品国产制服丝袜高跟| 波多野结衣之无限发射| av影片免费在线观看| 国产乱子伦视频一区二区三区 | 亚洲s色大片| 从欧美一区二区三区| 日韩av电影在线网| 日本老熟俱乐部h0930| 在线成人动漫av| 日韩一区二区三区四区五区六区| 妞干网在线免费视频| 国产福利视频在线| 久久久777精品电影网影网 | 国产三级午夜理伦三级| 午夜一区不卡| 欧美日韩国产成人高清视频| 大胸美女被爆操| 色哟哟精品丝袜一区二区| 宅男噜噜噜66一区二区66| 日本成年人网址| av2020不卡| 亚洲美女偷拍久久| 亚洲国产精品一区在线观看不卡| 丰满大乳国产精品| 久久视频www| 中国女人久久久| 久久综合伊人77777| 国产毛片久久久久久久| 成午夜精品一区二区三区软件| 欧美偷拍一区二区| 无码精品a∨在线观看中文| 肉肉视频在线观看| 综合av第一页| 亚洲日本精品| av在线电影免费观看| 国产亚洲综合性久久久影院| 久久久一本精品99久久精品66| 高h调教冰块play男男双性文| 国产老肥熟一区二区三区| 国产精品视频永久免费播放| 国产精品suv一区| 国产亚洲毛片在线| 91国内在线视频| 久久夜靖品2区| 亚洲国产专区| 97视频在线观看成人| 四虎成人精品永久免费av| 黄色综合网站| 性色av一区二区咪爱| 国产一级片播放| 激情综合亚洲| 91高清在线免费观看| 天堂网av手机版| 亚久久调教视频| 日本欧美精品在线| 天干夜夜爽爽日日日日| 日韩电影网1区2区| 国产精品久久久久aaaa九色| 欧美激情一区二区三区免费观看| 日韩va亚洲va欧美va久久| 国产精品第1页| 在线免费观看高清视频| 久久国产夜色精品鲁鲁99| 91日本视频在线| www.99视频| 成人高清在线视频| 久久婷婷人人澡人人喊人人爽| 色视频在线观看| 国产欧美日韩中文久久| 一级日韩一区在线观看| 成人ww免费完整版在线观看| 亚洲成人激情自拍| 欧美极品欧美精品欧美图片| 国产精品伦一区二区| 91.成人天堂一区| 少妇熟女视频一区二区三区 | 日韩欧美国产系列| yjizz视频| 精品视频97| 美女999久久久精品视频| 日本亚洲欧美在线| 青娱乐精品视频| 99精彩视频在线观看免费| 午夜福利视频一区二区| 国产女人18水真多18精品一级做| 国产精品av免费| 久久男人av资源站| 欧美精品在欧美一区二区少妇| 久久久久亚洲av无码专区首jn| 天海翼亚洲一区二区三区| 色综合亚洲精品激情狠狠| 精品一区在线视频| 日本vs亚洲vs韩国一区三区| 肥熟一91porny丨九色丨| 国产综合视频一区二区三区免费| 亚洲视频在线观看一区| 国产va亚洲va在线va| 精品视频在线一区二区在线| 精品国产百合女同互慰| 国产又粗又长免费视频| 最新国产乱人伦偷精品免费网站| 国产精品福利片| 少妇无码一区二区三区| 亚洲欧洲日产国产综合网| 国产免费黄色av| 亚洲国产欧美在线观看| 中文字幕久久亚洲| 五月婷婷开心网| 国产激情偷乱视频一区二区三区| 日本精品一区二区三区不卡无字幕| 国产精品刘玥久久一区| 日本久久电影网| 男人网站在线观看| 亚洲91视频| 国产精品免费观看在线| 天天干天天操av| 一区二区三区四区国产精品| 欧美男女交配视频| 综合国产视频| 欧美性在线观看| 黄色aaa毛片| 亚洲精品日韩一| 成年人三级黄色片| 欧美亚洲国产激情| 日韩av黄色在线观看| 三级在线观看网站| 亚洲一二三四在线| 又色又爽又黄18网站| 亚洲91视频| 成人免费视频a| 午夜伦全在线观看| 欧美色网站导航| 色欲狠狠躁天天躁无码中文字幕| 国产午夜精品一区二区三区欧美| 国产精品一区二区三区在线 | 欧美壮男野外gaytube| 丰满熟妇乱又伦| 亚洲国产精品天堂| 91精品啪在线观看国产| 黄色欧美成人| 国产一区二区久久久| 国产99在线| 亚洲黄色在线观看| 成人午夜视频精品一区| 99久久夜色精品国产网站| 国产资源在线视频| 日韩动漫一区| 秋霞成人午夜鲁丝一区二区三区| 午夜成人鲁丝片午夜精品| 欧美日韩美女视频| 中文字幕免费看| 日韩精品国产欧美| 亚洲精品在线免费看| 不卡亚洲精品| 精品国产一区二区三区在线观看| 97人妻人人澡人人爽人人精品| 中文字幕一区二区三区蜜月| 午夜激情视频网| 国内精品美女在线观看| 久久人人九九| 国产精品美女午夜爽爽| 欧美成人在线影院| 午夜av免费在线观看| 日本韩国一区二区三区视频| 国产调教在线观看| 国产一区二区福利| 青青在线免费观看| 亚洲黄色录像| 成人久久久久久久| 超免费在线视频| 亚洲欧美中文日韩v在线观看| 伊人久久久久久久久久久久| 国产精品久久久久影院老司| 少妇性l交大片7724com| 亚洲在线观看| 亚洲一区二区不卡视频| 一区二区三区视频播放| 欧洲精品毛片网站| 免费a级人成a大片在线观看| 精品成人a区在线观看| 精品国产xxx| 亚洲免费观看高清在线观看| 精品视频站长推荐| 免费精品99久久国产综合精品| 国产免费xxx| 一区二区小说| 亚洲free性xxxx护士hd| 中文字幕人成乱码在线观看 | 老牛嫩草一区二区三区日本 | 99精品久久久| 亚洲精品电影在线一区| 国产精品45p| 国产精品久久久久久影视| 日本片在线看| 在线播放国产一区中文字幕剧情欧美| av中文字幕免费| 欧美亚洲国产bt| 国产对白videos麻豆高潮| 国产精品国产a| 亚洲做受高潮无遮挡| 国产毛片精品视频| 中文字幕在线观看第三页| 在线日韩电影| 99精品视频网站| 欧美一区二区三| 久久99九九| 在线精品自拍| 成人性生交xxxxx网站| 欧美日韩精品免费观看视欧美高清免费大片| 九九九久久国产免费| av影片免费在线观看| 亚洲女人被黑人巨大进入al| 亚洲va欧美va| 欧美一区二区三级| 亚洲图片小说视频| 日本高清成人免费播放| 99久在线精品99re8热| 亚洲黄色小说网站| √天堂中文官网8在线| 欧美高清在线一区二区| 一本色道综合久久欧美日韩精品| 国产精一区二区三区| 色播五月综合网| 日韩成人av影视| 成人午夜视频免费在线观看| 亚洲精品1234| 免费不卡av在线| 欧美精品麻豆| 法国空姐在线观看免费| 欧美韩国日本在线观看 | 国产又粗又长又爽| 成人自拍视频在线| www男人天堂| 懂色av噜噜一区二区三区av| 白丝校花扒腿让我c| 国产精品白丝av| 国产xxxxhd| 国产超碰在线一区| 国产精品日日摸夜夜爽| 国产成人av一区二区三区在线观看| 亚欧精品在线视频| 国产成a人无v码亚洲福利| 337p日本欧洲亚洲大胆张筱雨| 国产一区二区三区黄视频 | 国产一区二区四区| 精品电影一区| 男人日女人bb视频| 蜜桃久久av| 无码少妇一区二区三区芒果| 日本视频在线一区| 91av视频免费观看| 国产成人av电影在线观看| 年下总裁被打光屁股sp| 99久久伊人久久99| 日韩一区二区a片免费观看| 亚洲国产精品t66y| 日韩一卡二卡在线观看| 亚洲欧美偷拍三级| 看免费黄色录像| 亚洲国产精品一区二区久久恐怖片| www日韩精品| 在线观看一区二区精品视频| 97超碰人人草| 精品欧美黑人一区二区三区| 亚洲人妻一区二区| 一本一本久久a久久精品牛牛影视| av亚洲在线| 欧美激情三级免费| 日韩电影大全网站| 国产欧美精品va在线观看| 日韩精品一区二区三区中文字幕| 国产精品一区二区三区免费| 国产欧美一区二区三区精品观看 | 欧美日韩在线看片| 欧美激情a在线| 韩国主播福利视频一区二区三区| 国产久一一精品| 久久国际精品| 蜜桃999成人看片在线观看| 日韩精品一区二区三区免费观看| 亚洲精品国产suv一区88| 久久av一区二区三区| www.午夜av| 91啪亚洲精品| 欧美一级片在线视频| 岛国精品视频在线播放| 中文字幕精品在线观看| 精品国产一区二区三区四区四 | 91亚洲精品视频在线观看| 欧美日韩亚洲在线| 亚洲欧美综合国产精品一区| 2022亚洲天堂| 国产大片一区二区| 在线视频第一页| 亚洲国产wwwccc36天堂| 在线观看色网站| 日韩电影中文字幕一区| 黄色大片在线播放| 国产不卡在线观看| 精品久久对白| 国产盗摄视频在线观看| 久久久久久夜| 人妻体内射精一区二区三区| 中文字幕一区二区在线播放 | 中文亚洲字幕| 夜夜爽久久精品91| 国产精品免费看片| av中文在线播放| 精品国产123| www.久久ai| 国产美女搞久久| 国产欧美日韩精品高清二区综合区| 日本大片免费看| 国产一区二区三区四区五区入口| 亚洲AV无码成人精品区明星换面| 午夜久久久影院| 精品国产无码一区二区| 色婷婷av一区二区三区久久| 欧美momandson| 久久综合狠狠综合久久综青草| 欧美成人精品| 九九九九九九九九| 国产精品蜜臀在线观看| 日韩免费av网站| 亚洲精品福利资源站| 久久av色综合| 99九九电视剧免费观看| 911久久香蕉国产线看观看| 高清一区在线观看| 国产欧美日韩在线| 亚洲天堂视频在线播放| 亚洲日本欧美日韩高观看| 成人av免费电影网站| 久草一区二区| 午夜亚洲一区| 免费看黄色的视频| 一本色道久久加勒比精品| 欧美伦理影视网| 亲子乱一区二区三区电影| 一道本一区二区三区| 无码人妻丰满熟妇区毛片| 久久精品一区二区三区不卡| 黄色片视频免费| 中文字幕亚洲欧美在线 | 日韩一级免费| 欲求不满的岳中文字幕| 福利视频一区二区| 免费资源在线观看| 国产精品久久久久久一区二区 | 久久久久99精品久久久久| 91精品在线免费视频| 国产欧美自拍视频| 国产成人99久久亚洲综合精品| 九热这里只有精品| 日韩精品视频免费在线观看| 亚洲黄色中文字幕| 亚洲国产一区二区三区在线| 老司机免费视频一区二区| 黑鬼狂亚洲人videos| 亚洲精品一线二线三线无人区| 国产调教在线| 色综合久久88色综合天天提莫| 久久99国产精品久久99果冻传媒| www色aa色aawww| 亚洲精品在线电影| 亚洲第一影院| 国产系列第一页| 波多野结衣91| 特级西西444www大胆免费看| 久久色免费在线视频| 成人影院中文字幕| www日韩视频| 亚洲精品国产一区二区精华液| 香蕉视频黄在线观看| 国产精品老女人视频| 欧美1级日本1级| 中文幕无线码中文字蜜桃| 欧美精品三级在线观看| xxxx在线视频| 亚洲国产欧洲综合997久久| 国产成人在线观看| 天堂网一区二区| 欧美尺度大的性做爰视频| 美女少妇全过程你懂的久久 | www.亚洲激情| 欧美黑人巨大xxx极品| 国产欧美日韩| 亚洲成年人在线观看| 欧美视频第二页| 国产一二三在线| 国产精品波多野结衣| 91网上在线视频| 国产三区在线播放| 日本精品性网站在线观看| 欧美1区免费| 992在线观看| 亚洲欧美国内爽妇网| 一区三区自拍|