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

架構治理調研:規則、表達式還有語言

開發 開發工具 架構
為了在 ArchGuard 中完善分布式規范的能力,便分析了幾個現有的工具。

我們談論到了 “分布式” 場景下,對于架構治理和規范治理的一系列問題。我們提及了一系列的工具,如 API Linter 工具 Spectral,數據庫 Linter 工具 SQLFluff。而為了在 ArchGuard 中完善分布式規范的能力,便分析了幾個現有的工具。

對于我們來說,構建一個類似的工具,需要考慮的一些因素有:

  • 插件化。開發人員可以根據已有的守護規則,開發一些新的架構守護規則,如針對于 API 的,針對于數據庫調用鏈路的。
  • 可測試性。如果采用的是完全 DSL 或者 半 DSL,那么如何讓后續的
  • 語言無關。如何不綁定于語言的語法樹,而實現對于多種語言的支持。

出于這個目的,只好拿起現有的代碼進行一番分析,主要有四個工具,適用于 Kotlin 語言的 KtLint、適用于 OpenAPI 的 Spectral、適用于多數據庫的 SQLFluff,以及被諸如 MyBatis 采用的表達式語言 Ognl。

Kotlin 代碼的治理:KtLint

KtLint 與一般的 Lint 工具稍有區別的是,它自帶了一個自動格式化的功能。KtLint 整體的邏輯還是比較簡單的,基于單個文件進行 AST 生成,隨后針對于 AST 進行規則匹配。Ktlint 圍繞于 Rule、Rulesets、RulesetsProvider 構建了規則的層級關系,同時用 Vistor (即 VisitorProvider)模式圍繞 AST 進行分析,如下是 KtLint 的抽象 Rule:

/**
* This method is going to be executed for each node in AST (in DFS fashion).
*
* @param node AST node
* @param autoCorrect indicates whether rule should attempt auto-correction
* @param emit a way for rule to notify about a violation (lint error)
*/
abstract fun visit(
node: ASTNode,
autoCorrect: Boolean,
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
)

如注釋中所說的,三個參數代表了各自的用途。這里的 ASTNode 是來源于 Kotlin 的 AST 樹( kotlin-compiler-embeddable 包)。模式上也是獲取配置,然后運行檢測規則:

val ruleSets = ruleSetProviders.map { it.value.get() }
val visitorProvider = VisitorProvider(ruleSets, debug)

其中對應的 visit:

visitorProvider
.visitor(
params.ruleSets,
preparedCode.rootNode,
concurrent = false
).invoke { node, rule, fqRuleId -> }

在 VistorProvider 中會過濾對應的規則:

val enabledRuleReferences =
ruleReferences
.filter { ruleReference -> isNotDisabled(rootNode, ruleReference.toQualifiedRuleId()) }
val enabledQualifiedRuleIds = enabledRuleReferences.map { it.toQualifiedRuleId() }
val enabledRules = ruleSets
.flatMap { ruleSet ->
ruleSet
.rules
.filter { rule -> toQualifiedRuleId(ruleSet.id, rule.id) in enabledQualifiedRuleIds }
.filter { rule -> isNotDisabled(rootNode, toQualifiedRuleId(ruleSet.id, rule.id)) }
.map { rule -> "${ruleSet.id}:${rule.id}" to rule }
}.toMap()
....

然后,再去并行或者串行地運行 Rule 里的 visit。

而對于規則的方式是通過 ServicesLoader 進行的插件化方式:

private fun getRuleSetProvidersByUrl(
url: URL?,
debug: Boolean
): Pair<URL?, List<RuleSetProvider>> {
if (url != null && debug) {
logger.debug { "JAR ruleset provided with path \"${url.path}\"" }
}
val ruleSetProviders = ServiceLoader.load(
RuleSetProvider::class.java,
URLClassLoader(listOfNotNull(url).toTypedArray())
).toList()
return url to ruleSetProviders.toList()
}

如果粒度更大的情況下,采用 Java 9 的模塊是不是會更加方便?

基于 API 數據的 Spectral

與 Ktlint 不同的是 Spectral 是一個針對于 JSON/YAML Lint 的工具,特別是針對于 OpenAPI 文檔(就是 swagger 的 yaml/json 文件)。與 Ktlint 相比,Spectral 最有趣的地方是,它提供了一個 JSON Path(類似于 XPath)的功能,可以針對于對象中的特定部分,進采用特定的規則。如下是 Spectral 的示例:

'oas3-valid-schema-example': {
description: 'Examples must be valid against their defined schema.',
message: '{{error}}',
severity: 0,
formats: [oas3],
recommended: true,
type: 'validation',
given: [
"$.components.schemas..[?(@property !== 'properties' && @ && (@ && @.example !== void 0 || @.default !== void 0) && (@.enum || @.type || @.format || @.$ref || @.properties || @.items))]",
"$..content..[?(@property !== 'properties' && @ && (@ && @.example !== void 0 || @.default !== void 0) && (@.enum || @.type || @.format || @.$ref || @.properties || @.items))]",
"$..headers..[?(@property !== 'properties' && @ && (@ && @.example !== void 0 || @.default !== void 0) && (@.enum || @.type || @.format || @.$ref || @.properties || @.items))]",
"$..parameters..[?(@property !== 'properties' && @ && (@ && @.example !== void 0 || @.default !== void 0) && (@.enum || @.type || @.format || @.$ref || @.properties || @.items))]",
],
then: {
function: oasExample,
functionOptions: {
schemaField: '$',
oasVersion: 3,
type: 'schema',
},
},
}

上面對象中的 given 即是針對于對象中的相關屬性作為條件,執行后面的 then 函數,詳細可以見官方的文檔:《 Custom Rulesets 》。順帶一提:Spectral 采用的是 nimma 作為 JSON Path 表達式。

Spectral 的模型

與 Ktlint 相比,由于 Spectral 是與 OpenAPI/Async API 進行了相關的綁定,加上特定的規則表達式,所以其數據模型稍微復雜一些。其數據模型包含了:描述,消息級別,given - then,上下文。如下所示:

  • recommended。是否是推薦配置。
  • enabled。是否允許
  • description。規則描述
  • message。錯誤信息
  • documentationUrl。文檔地址。
  • severity。嚴重程度,`error`, `warn`, `info`, or `hint`。
  • formats。格式化標準,如 OpenAPI 2.0、OpenAPI 3.0 等。
  • resolved。是否已解決。
  • given。類似于 CSS 中的選擇器,使用類似于 XPath 的 JsonPath, JSONPath
  • then。
  • field,字段
  • function,函數,模式
  • functionOptions

此外,它還有一個簡單的類型系統,以及對應的表達式判斷。如下:

  • CASES。flat、camel、pascal、kebab、cobol、snake、macro
  • 長度:最大值、最小值。
  • 數字
  • Boolean 判斷。
  • 類型系統。枚舉

總的來說,Spectral 在實現上比較靈活有趣。

SQLFluff

與 Ktlint 和 Spectral 這種基于已有的數據模型的應用來說,SQLFluff 顯得更有挑戰性 —— 它是基于多種不同的數據庫方言來構建規則的。SQLFluff 是直接基于源碼來進行分析的,將不同的數據庫方言轉換為基本元素(分詞)。隨后,基于分詞的類型 + 規則 ,來對它們進行處理。簡單來說,就是更抽象的分詞上下文,構建對應的規則上下文。如下是

  • segement。位于其核心的是 BaseSegment,它定義了 Lexing、Parsing 和 Linting 三個基本的元素,產生諸如: groupby_clause  orderby_clause  select_clause 等分詞。
  • parent_stack。
  • siblings_pre。
  • siblings_post。
  • raw_stack。
  • memory。
  • dialect。作為語法運行時解析的基礎。
  • path。路徑。
  • templated_file。模板文件。

示例:

{
"file": {
"statement": {
"select_statement": {
"select_clause": {
"keyword": "SELECT",
"whitespace": " ",
"select_clause_element": {
"column_reference": {
"identifier": "foo"
}
}
},
"whitespace": " ",
"from_clause": {
"keyword": "FROM",
"whitespace": " ",
"from_expression": {
"from_expression_element": {
"table_expression": {
"table_reference": {
"identifier": "bar"
}
}
}
}
}
}
},
"statement_terminator": ";",
"newline": "\n"
}
}

隨后的規則,便是在對這些規則進行 eval ,如下示例:

class Rule_L021(BaseRule):
def _eval(self, context: RuleContext) -> Optional[LintResult]:
"""Ambiguous use of DISTINCT in select statement with GROUP BY."""
segment = context.functional.segment
if (
segment.all(sp.is_type("select_statement"))
# Do we have a group by clause
and segment.children(sp.is_type("groupby_clause"))
):
# Do we have the "DISTINCT" keyword in the select clause
distinct = (
segment.children(sp.is_type("select_clause"))
.children(sp.is_type("select_clause_modifier"))
.children(sp.is_type("keyword"))
.select(sp.is_name("distinct"))
)
if distinct:
return LintResult(anchor=distinct[0])
return None

在這里所有的規則判斷都是基于這種抽象的語法樹。從某種意義上來說,構建了一個統一的抽象。本來想進一步分析,但是發現各種 SQL dialect 里是各種正則表達式,我就選擇了臨時性撤退。

表達式語言:OGNL

起初,我是在實現 ArchGuard Scanner 對于 MyBatis 的 SQL 生成支持時,看到了 XML 中嵌套的 OGNL 表達式,發現了 OGNL。從實現上來說,它比我之前設想的 TreeSitter 中的 S 表達式,在與數據結合的完善度上更高。同樣,也可以用于這里的規則判斷,可以用表達式來對數據進行匹配。

對象導航圖語言(Object Graph Navigation Language),簡稱 OGNL,是應用于 Java 中的一個開源的表達式語言(Expression Language),用于獲取和設置 Java 對象的屬性,以及其他附加功能,例如列表投影(projection)和選擇以及 lambda 表達式。您可以使用相同的表達式來獲取和設置屬性的值。Ognl 類包含了評估 OGNL 表達式快捷方式。它可以分兩個階段執行此操作,將表達式解析為內部形式,然后使用該內部形式設置或獲取屬性的值;或者可以在一個階段完成,并直接使用表達式的字符串形式獲取或設置屬性。

Ognl.getValue("name='jerry'", oc, oc.getRoot());
String name2 = (String) Ognl.getValue("#user1.name='jack',#user1.name", oc, oc.getRoot());

本來想模仿 OGNL 編寫一個表達式語言,但是發現使用的是 Jacc,也沒有 Antlr 實現。所以,在尋找一種更合理的方式。

結論

作為相關工具的分析,這里先開個頭。

責任編輯:張燕妮 來源: Phodal全棧工程師
相關推薦

2010-08-09 14:43:25

Flex正則表達式

2011-04-22 11:07:24

groovyJava

2010-08-09 14:14:13

Flex正則表達式

2010-08-13 15:31:11

Flex正則表達式

2010-08-09 14:30:39

Flex正則表達式

2014-01-05 17:41:09

PostgreSQL表達式

2023-07-31 07:43:07

Java語言表達式變量

2010-08-13 15:23:10

Flex正則表達式

2009-04-09 09:19:25

C#規則表達式.NET

2013-09-27 09:43:44

Linux Shell腳本數學表達式

2009-08-14 16:50:59

C#正則表達式語法

2024-03-25 13:46:12

C#Lambda編程

2018-09-27 15:25:08

正則表達式前端

2009-09-15 15:18:00

Linq Lambda

2022-12-05 09:31:51

接口lambda表達式

2009-07-03 18:31:04

JSP表達式

2009-09-11 12:32:33

LINQ表達式

2009-09-09 13:01:33

LINQ Lambda

2011-10-28 16:34:13

LINQ

2009-09-10 15:35:07

LINQ查詢表達式
點贊
收藏

51CTO技術棧公眾號

东京久久高清| 婷婷在线视频观看| 黄色精品一区| 亚洲精品999| 欧洲av无码放荡人妇网站| 天天干,夜夜操| 免费视频久久| 亚洲性夜色噜噜噜7777| 最新天堂在线视频| 国产成人手机在线| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲国产女人aaa毛片在线| www.中文字幕在线| 国产黄在线观看| 精品一区二区三区蜜桃| 久久6精品影院| ass精品国模裸体欣赏pics| 日韩在线观看不卡| 一区二区三区四区不卡视频 | 日本欧美大码aⅴ在线播放| 亚洲一级一级97网| 久久精品一二三四| 欧美大电影免费观看| 一区二区三区四区精品在线视频| 欧美精品一区二区三区在线四季| av中文字幕免费在线观看| 美女日韩在线中文字幕| 欧美俄罗斯乱妇| 国产精品成人在线视频| 日韩精品免费一区二区夜夜嗨 | 日韩av免费在线看| 欧美成人精品一区二区免费看片| 精品视频黄色| 日韩精品免费电影| 成人欧美精品一区二区| 日韩美香港a一级毛片| 色综合久久中文字幕综合网| 一卡二卡三卡视频| 黄色免费在线看| 国产欧美va欧美不卡在线| 久久国产主播精品| 国产91免费在线观看| 国产精品1区2区3区在线观看| 国产精品久久久久久亚洲影视| 国产又大又黄视频| 国产精品夜夜夜| 午夜精品久久久久久久白皮肤| 爱爱视频免费在线观看| 欧美电影《轻佻寡妇》| 中文字幕国产精品久久| 青娱乐国产视频| 免费视频一区三区| 亚洲男人天堂2023| 51调教丨国产调教视频| 欧亚精品一区| 亚洲精品黄网在线观看| japanese在线观看| 日韩精品亚洲aⅴ在线影院| 亚洲精品一区二区三区影院| 又大又长粗又爽又黄少妇视频| 精品视频在线观看网站| 欧美一区二区三区成人| 男人添女人荫蒂国产| 天堂va在线高清一区| 欧美成人性福生活免费看| 国产成人精品一区二区在线小狼| 国内不卡的一区二区三区中文字幕 | 日本在线小视频| 在线亚洲激情| 国产精品99蜜臀久久不卡二区| 麻豆精品视频在线观看| 亚洲国产成人精品久久久国产成人一区| 波多野结衣免费观看| 久久久精品区| 精品久久99ma| 日韩人妻一区二区三区| 国产成人黄色| 菠萝蜜影院一区二区免费| 国产高潮国产高潮久久久91| 欧美日韩18| 78色国产精品| 中文字幕黄色av| 国产美女精品人人做人人爽| 国产精品国产一区二区 | 国产一区二区三区在线观看精品 | 午夜欧美福利视频| 欧美高清影院| 亚洲精品在线免费观看视频| 亚洲黄色在线网站| 91欧美大片| 午夜精品一区二区三区av| 伦av综合一区| 国产一区二区三区黄视频 | 日本韩国视频一区二区| 五月天激情播播| 国产精品任我爽爆在线播放| 国产一区二区三区高清在线观看 | 午夜精品久久久久久久久久久 | 米仓穗香在线观看| 九九色在线视频| 欧美性猛交xxxx免费看漫画| 粉色视频免费看| 人妖一区二区三区| 久久精品成人一区二区三区| 国产午夜在线播放| 久久电影国产免费久久电影 | 欧美亚洲在线日韩| 久久久久久欧美| 国模私拍一区二区| 99久久精品国产一区二区三区 | 亚洲精品色午夜无码专区日韩| 91精品国偷自产在线电影| 91精品国产色综合| 国产色在线视频| 国产欧美日本一区视频| 亚洲精品蜜桃久久久久久| 久久精品黄色| 国产丝袜精品视频| 麻豆成人在线视频| 久久se精品一区精品二区| 九色91视频| 青春草视频在线观看| 欧美视频一区二区| www.色多多| 黄色成人av网站| 国产精品免费小视频| 亚洲三级中文字幕| 亚洲影视在线播放| 肉色超薄丝袜脚交| 97国产精品| 国产日韩欧美中文在线播放| 免费在线毛片| 欧美日韩在线看| 黄色免费视频网站| 亚洲电影av| 超碰97人人在线| a黄色片在线观看| 在线成人免费视频| 日韩欧美在线视频播放| 日本不卡一区二区三区 | 精品人妻二区中文字幕| 91tv精品福利国产在线观看| 国产精品中文字幕久久久| 国产大片在线免费观看| 91精品办公室少妇高潮对白| 国产精品无码一区二区三区| 一本综合精品| 久久人人九九| 天堂av在线网| 亚洲精品一区二区三区婷婷月| 在线观看 中文字幕| www.欧美色图| 免费成人午夜视频| 日韩高清影视在线观看| 欧美一级大片在线观看| 男同在线观看| 91国内精品野花午夜精品| 国产美女免费网站| 美女脱光内衣内裤视频久久影院| 亚洲欧美久久久久一区二区三区| 久久婷婷五月综合色丁香| 日韩在线视频播放| 国产精品国产三级国产aⅴ| 亚洲私人黄色宅男| 91精品人妻一区二区三区蜜桃2 | 欧美激情亚洲另类| 日韩在线观看视频一区二区三区| 天天综合色天天综合| 久久无码人妻精品一区二区三区| 亚洲欧美激情诱惑| 日韩视频在线观看国产| 四虎国产精品免费久久5151| 久久精品国产清自在天天线| 亚洲国产精品欧美久久| 精品av在线播放| x88av在线| 精品在线亚洲视频| 黄色大片中文字幕| 国产不卡一区| 亚洲自拍小视频| 日韩精品极品| 日韩视频精品在线| 亚洲福利在线观看视频| 色综合久久天天| 日韩福利小视频| 99精品久久99久久久久| www.天天射.com| 国内久久精品| 午夜一区二区三区| 亚洲视频国产| 国产成人精品免高潮在线观看| 麻豆网站在线看| 亚洲精品第一国产综合精品| 中文字幕+乱码+中文| 亚洲综合久久久久| 日韩视频在线观看免费视频| 国产成人精品免费网站| www日韩视频| 午夜亚洲福利| 视频一区亚洲| 国产劲爆久久| 91亚洲精品一区| 亚洲深夜视频| 欧美日本精品在线| 国产精品久久久久一区二区国产| 欧美成人免费网站| 在线免费看毛片| 精品久久久香蕉免费精品视频| 亚洲欧美综合7777色婷婷| 不卡的av网站| 中文字幕日韩久久| 日韩国产欧美视频| 蜜臀av无码一区二区三区| 欧美韩日一区| 日韩精品最新在线观看| 国产精品久久久网站| 91欧美日韩一区| 日韩经典一区| 欧美中文字幕在线观看| 毛片在线导航| 欧美成人sm免费视频| 91在线视频免费看| 亚洲欧美在线免费| 特黄视频在线观看| 精品美女一区二区| 国产成人精品一区二三区四区五区 | 伊人久久大香线蕉综合影院首页| 欧美亚洲成人xxx| 黑人极品ⅴideos精品欧美棵| 中文字幕亚洲无线码a| 免费福利在线视频| 亚洲激情中文字幕| 刘亦菲久久免费一区二区| 日韩一区二区在线观看| 一级特黄aaa大片在线观看| 色av成人天堂桃色av| 黄色在线免费观看| 一本高清dvd不卡在线观看| 日本一区二区欧美| 午夜一区二区三区在线观看| 国产亚洲自拍av| 夜夜揉揉日日人人青青一国产精品 | 97婷婷涩涩精品一区| 国产深夜视频在线观看| 欧美激情日韩图片| 国产三线在线| 97av在线视频| 国产高清不卡| 人人澡人人澡人人看欧美| 桃色一区二区| 国产精品久久久久久久美男| 成人午夜一级| 成人乱色短篇合集| 国产剧情一区二区在线观看| 999热视频| 国产精品久av福利在线观看| 国产亚洲福利社区| 亚洲欧洲美洲国产香蕉| 日韩一区二区三区资源| 久久免费av| 日本黄网站色大片免费观看| 欧美精品97| 欧美国产日韩激情| 亚洲一区黄色| 日本新janpanese乱熟| 麻豆精品一区二区| 国产探花在线观看视频| 成人久久视频在线观看| 四虎影成人精品a片| 中文字幕不卡在线| 国产精品久久久精品四季影院| 亚洲影视资源网| 日韩手机在线视频| 欧美日韩国产成人在线91| 99在线观看免费| 日韩高清av一区二区三区| 国内av一区二区三区| y97精品国产97久久久久久| 色婷婷av在线| 国产精品久久久久久久电影 | 涩涩涩在线视频| 国产精品电影久久久久电影网| 亚洲人成网站在线在线观看| 福利视频一区二区三区| 欧美人与拘性视交免费看| 一区二区三区视频| 亚洲麻豆视频| 国产精品自拍视频在线| 国产999精品久久久久久| 90岁老太婆乱淫| 一区二区视频在线看| aaaaaa毛片| 日韩午夜激情av| 黄色免费在线播放| 欧美激情一级二级| 成人全视频在线观看在线播放高清 | 亚洲乱码一区| 日韩中文字幕av在线| 亚洲小说区图片区| 欧美大尺度做爰床戏| 国产精品羞羞答答xxdd| 久久视频精品在线观看| 亚洲综合丝袜美腿| 中文天堂在线播放| 日韩久久免费视频| a免费在线观看| 国产精品久久久久久av| 日韩三区视频| av 日韩 人妻 黑人 综合 无码| 日韩一区精品视频| 久久久久9999| 伊人婷婷欧美激情| 91成人在线免费| 亚洲欧美中文另类| 91福利在线免费| 91国产在线播放| 日韩一区二区在线| 久久久久久久少妇| 成人精品小蝌蚪| 1024手机在线视频| 欧美日韩国产电影| av在线之家电影网站| 欧美一区二区三区免费视| 亚洲码欧美码一区二区三区| 波多野结衣三级在线| 日韩电影免费一区| 最新中文字幕视频| 精品国产电影一区| 欧美一级在线免费观看| 精品中文字幕乱| 97色婷婷成人综合在线观看| 天堂资源在线亚洲资源| 蜜桃伊人久久| 人人妻人人澡人人爽人人精品| 亚洲va在线va天堂| 国产香蕉在线观看| 色综合天天综合网国产成人网 | 日本午夜精品一区二区三区| 亚洲久色影视| 亚洲色偷偷色噜噜狠狠99网| 亚洲一区二区综合| 亚洲精品一区二区三区区别| 久久亚洲综合国产精品99麻豆精品福利 | 国产69精品久久app免费版| 日韩69视频在线观看| 久久99国产精一区二区三区| 欧美一级片中文字幕| 久久免费精品国产久精品久久久久| 欧美不卡视频在线观看| 日韩精品视频三区| 在线观看欧美日韩电影| 欧美不卡三区| 日韩av一级电影| 国精品人伦一区二区三区蜜桃| 欧美亚洲国产一区在线观看网站| av电影在线播放高清免费观看| 国产精品一区二区久久精品| 久久国产亚洲| 久久婷婷中文字幕| 一区二区三区四区不卡视频| 欧美一级淫片免费视频魅影视频| **欧美日韩vr在线| 国精一区二区| 99re精彩视频| 一区二区高清视频在线观看| 少妇人妻一区二区| 日本亚洲欧洲色| 久久久综合色| 无码人妻丰满熟妇啪啪网站| 精品欧美国产一区二区三区| 酒色婷婷桃色成人免费av网| 国产区精品视频| 婷婷综合在线| 日本69式三人交| 欧美视频一区二区| 九色91在线| 日韩美女视频中文字幕| 亚洲精品2区| 美国黄色a级片| 在线免费观看一区| √天堂资源地址在线官网| 国产成人精品午夜| 亚洲国产一区二区三区在线播放| 亚洲男女在线观看| 欧美视频自拍偷拍| 丁香花视频在线观看| 亚洲精品欧美精品| 顶级嫩模精品视频在线看| 青青草视频在线观看免费| 欧美xxxx做受欧美.88| 亚洲综合福利| www.色.com| 色先锋资源久久综合| 91在线中字| 日韩av电影免费在线观看| 国产精品99久久久久久久女警| 国产精品免费精品一区| 欧美成人在线免费| 精品久久久久中文字幕小说| 一级全黄裸体片|