1、简单易学。
桑珠孜网站建设公司成都创新互联,桑珠孜网站设计制作,有大型网站制作公司丰富经验。已为桑珠孜成百上千家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的桑珠孜做网站的公司定做!
Go语言的作者本身就很懂C语言,所以同样Go语言也会有C语言的基因,所以对于程序员来说,Go语言天生就会让人很熟悉,容易上手。
2、并发性好。
Go语言天生支持并发,可以充分利用多核,轻松地使用并发。 这是Go语言最大的特点。
描述
Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。
在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。
与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。
写了2次才写完,内容很长,翻译了很久,内容来源于Cobra github介绍。翻译完也更全面的了解了Cobra,功能相当强大完善,各种使用的场景都考虑到了。另外也扩展了一些其它知识,比如 命令行玩法 , Levenshtein distance 等等。以下是正文:
Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具。Cobra同时也是一个程序, 用于创建CLI程序
Cobra是建立在结构的命令、参数和标志之上。
命令代表操作,参数和标志是这些行动的修饰符。
最好的应用程序就像读取句子。用户会知道如何使用本机应用程序,因为他们将理解如何使用它。
比如下面的例子, server 是命令, port 是标志:
在下面的命令,我们告诉Git克隆url地址bare
使用Cobra很简单。首先,使用 go get 安装最新版本
然后在你项目里引用Cobra
通常基于Cobra的应用程序将遵循下面的组织结构,当然你也可以遵循自己的接口:
在Cobra应用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
Cobra提供自己的程序来创建你的程序并且添加你想要的命令。这是最简单的方式把Cobra添加到你的程序里。
这里 你能找到相关信息
使用Cobra,需要创建一个空的main.go文件和一个rootCmd文件。你可以选择在合适的地方添加额外的命令。
Cobra不需要特殊的构造函数。简单的就可以创建你的命令。
理想情况下你把这个放在在 app/cmd/root.go
你会另外定义标志和处理配置init()函数。
比如 cmd/root.go
你需要在main函数里执行root命令。
通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
其它的命令通常定义在cmd/目录下的自己文件内
如果你想创建一个version命令,你可以创建cmd/version.go文件,并在文件里这么写:
标志提供修饰符控制动作命令如何操作
当标志定义好了,我们需要定义一个变量来关联标志
'持久'表示每个在那个命令下的命令都将能分配到这个标志。对于全局标志,'持久'的标志绑定在root上。
Cobra默认只在目标命令上解析标志,父命令忽略任何局部标志。通过打开 Command.TraverseChildren Cobra将会在执行任意目标命令前解析标志
你同样可以通过 viper 绑定标志:
在这个例子中,永久的标记 author 被 viper 绑定, 注意 , 当用户没有给 --author 提供值, author 不会被赋值。
标记默认是可选的,如果你希望当一个标记没有设置时,命令行报错,你可以标记它为必须的
验证位置参数可以通过 Command 的 Args 字段。
内置下列验证方法
一个设置自定义验证的例子
在下面的例子,我们定义了3个命令。2个在顶级,一个(cmdTimes)是其中一个顶级命令的子命令。在这个例子里,由于没有给 rootCmd 提供 Run ,单独的root是不能运行的,必须要有子命令。
我们仅为一个命令定义了标记。
更多关于flags的文档可以在 找到
更完整大型程序的例子, 可以查看 Hugo .
当你的程序有子命令时,Cobra 会自动给你程序添加help命令。当你运行‘app help’,会调用help命令。另外,help同样支持其它输入命令。例如,你有一个没有任何其它配置的命令叫‘create’,当你调用‘app help create’ Corbra 将会起作用。
下面的输入是 Cobra 自动生成的。除了命令和标志的定义,其它不再需要。
help 就跟其它命令一样,并没有特殊的逻辑或行为。事实上,你也可以提供你自己help如果你想的话。
你能为默认的命令,提供你自己的help命令或模板。使用下面的方法:
后2个也将适用于任何子命令
当用户提供无效的标记或命令,Cobra 将会返回 用法 。
你可能从上面的帮助意识到,默认的帮助将被嵌入到用法里然后作为输出。
你能提供你自己的用法函数或模板给 Cobra 使用。
比如帮助,方法和模板都可以重写。
如果Version字段设置到了根命令,Cobra 会提供了一个顶层 ‘--version’标记。运行带上‘--version’标记的程序,将会按照模板版本信息。模板可以通过 cmd.SetVersionTemplate(s string) 方法修改
在命令运行前或运行后,再运行方法非常容易。 PersistentPreRun 和 PreRun 方法将会在 Run 之前执行。 PersistentPostRun 和 PostRun 方法将会在 Run 之后执行。 Persistent*Run 方法会被子命令继承,如果它们自己没有定义的话。这些方法将按照下面的属性执行:
下面的例子,2个命令都使用了上面的特性。当子命令执行的时候,它将执行根命令的 PersistentPreRun ,但不会执行根命令的 PersistentPostRun :
输出:
Cobra 会自动输出建议,当遇到“unknown command”错误时。这使得当输入错误时, Cobra 的行为类似 git 命令。例如:
建议会基于注册的子命令自动生成。使用了 Levenshtein distance 的实现。每一个注册的命令会匹配2个距离(忽略大小写)来提供建议。
如果你希望在你的命令里,禁用建议或虚弱字符串的距离,使用:
或
你可以通过 SuggestFor 来给命令提供明确的名词建议。这个特性允许当字符串不相近,但是意思与你的命令相近,别切你也不想给该命令设置别名。比如:
Cobra 可以基于子命令,标记,等生成文档。以以下格式:
Cobra 可以生成一个bash-completion文件。如果你给命令添加更多信息,这些completions可以非常强大和灵活。更多介绍在 Bash Completions 。
cobra是一个提供简单接口来创建强大的现代CLI界面的库类似git git tools,cobra也是一个应用程序,它会生成你的应用程序的脚手架来快速开发基于cobra的应用程序
cobra提供:
cobra建立在命令、参数、标志的结构之上
commands代表动作,args是事物,flags是动作的修饰符
最好的应用程序在使用时读起来就像句子,因此,用户直观地知道如何与它们交互
模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 动词 名词 形容词 或者 APPNAME 命令 参数 标志)
一些真实世界的好例子可以更好地说明这一点
kubectl 命令更能体现APPNAME 动词 名词 形容词
如下的例子,server 是command,port是flag
这个命令中,我们告诉git 克隆url
命令是应用程序的中心点,应用程序支持的每一个交互都包含在一个命令中,命令可以有子命令,也可以运行操作
在上面的例子中,server是命令
更多关于cobra.Command
flag是一种修改命令行为的方式,cobra支持完全兼容POSIX标志,也支持go flag package,cobra可以定义到子命令上的标志,也可以仅对该命令可用的标志
在上面的命令中,port是标志
标志的功能由 pflag library 提供,pflag library是flag标准库的一个分支,在添加POSIX兼容性的同时维护相同的接口。
使用cobra很简单,首先,使用go get按照最新版本的库,这个命令会安装cobra可执行程序以及库和依赖项
下一步,引入cobra到应用程序中
虽然欢迎您提供自己的组织,但通常基于Cobra的应用程序将遵循以下组织结构:
在Cobra应用程序中,main.go文件通常非常简单。它有一个目的:初始化Cobra。
使用cobra生成器
cobra提供了程序用来创建你的应用程序然后添加你想添加的命令,这是将cobra引入应用程序最简单的方式
这儿 你可以发现关于cobra的更多信息
要手动实现cobra,需要创建一个main.go 和rootCmd文件,可以根据需要提供其他命令
Cobra不需要任何特殊的构造器。只需创建命令。
理想情况下,您可以将其放在app/cmd/root.go中:
在init()函数中定义标志和处理配置
例子如下,cmd/root.go:
创建main.go
使用root命令,您需要让主函数执行它。为清楚起见,Execute应该在根目录下运行,尽管它可以在任何命令上调用。
在Cobra应用程序中,main.go文件通常非常简单。它有一个目的:初始化Cobra。
可以定义其他命令,通常每个命令在cmd/目录中都有自己的文件。
如果要创建版本命令,可以创建cmd/version.go并用以下内容填充它:
如果希望将错误返回给命令的调用者,可以使用RunE。
然后可以在execute函数调用中捕获错误。
标志提供修饰符来控制操作命令的操作方式。
由于标志是在不同的位置定义和使用的,因此我们需要在外部定义一个具有正确作用域的变量来分配要使用的标志。
有两种不同的方法来分配标志。
标志可以是“持久”的,这意味着该标志将可用于分配给它的命令以及该命令下的每个命令。对于全局标志,在根上指定一个标志作为持久标志。
也可以在本地分配一个标志,该标志只应用于该特定命令。
默认情况下,Cobra只解析目标命令上的本地标志,而忽略父命令上的任何本地标志。通过启用Command.TraverseChildren,Cobra将在执行目标命令之前解析每个命令上的本地标志。
使用viper绑定标志
在本例中,持久标志author与viper绑定。注意:当用户未提供--author标志时,变量author将不会设置为config中的值。
更多关于 viper的文档
Flags默认是可选的,如果希望命令在未设置标志时报告错误,请根据需要进行标记:
持久性Flags
可以使用命令的Args字段指定位置参数的验证。
内置了以下验证器:
在下面的示例中,我们定义了三个命令。两个是顶级命令,一个(cmdTimes)是顶级命令之一的子命令。在这种情况下,根是不可执行的,这意味着需要一个子命令。这是通过不为“rootCmd”提供“Run”来实现的。
我们只为一个命令定义了一个标志。
有关标志的更多文档,请访问
对于一个更完整的例子更大的应用程序,请检查 Hugo 。
当您有子命令时,Cobra会自动将help命令添加到应用程序中。当用户运行“应用程序帮助”时,将调用此函数。此外,help还支持所有其他命令作为输入。例如,您有一个名为“create”的命令,没有任何附加配置;调用“app help create”时,Cobra将起作用。每个命令都会自动添加“-help”标志。
以下输出由Cobra自动生成。除了命令和标志定义之外,不需要任何东西。
帮助就像其他命令一样。它周围没有特殊的逻辑或行为。事实上,你可以提供你想提供的。
您可以为默认命令提供自己的帮助命令或模板,以用于以下功能:
当用户提供无效的标志或无效的命令时,Cobra通过向用户显示“用法”来响应。
你可以从上面的帮助中认识到这一点。这是因为默认帮助将用法作为其输出的一部分嵌入。
您可以提供自己的使用函数或模板供Cobra使用。与帮助一样,函数和模板也可以通过公共方法重写:
如果在root命令上设置了version字段,Cobra会添加一个顶级的'--version'标志。运行带有“-version”标志的应用程序将使用版本模板将版本打印到标准输出。可以使用cmd.SetVersionTemplate(s string)函数自定义模板。
可以在命令的主运行函数之前或之后运行函数。PersistentPreRun和PreRun函数将在运行之前执行。PersistentPostRun和PostRun将在运行后执行。如果子函数不声明自己的函数,则它们将继承Persistent*Run函数。这些函数按以下顺序运行:
输出:
当发生“未知命令”错误时,Cobra将打印自动建议。这使得Cobra在发生拼写错误时的行为类似于git命令。例如:
基于注册的每个子命令和Levenshtein距离的实现,建议是自动的。匹配最小距离2(忽略大小写)的每个已注册命令都将显示为建议。
如果需要在命令中禁用建议或调整字符串距离,请使用:
or
您还可以使用SuggestFor属性显式设置将为其建议给定命令的名称。这允许对在字符串距离方面不接近的字符串提供建议,但在您的一组命令中是有意义的,并且对于某些您不需要别名的字符串。例子:
Cobra可以基于子命令、标志等生成文档。请在 docs generation文档 中阅读更多关于它的信息。
Cobra可以为以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,这些补全功能将非常强大和灵活。在 Shell Completions 中阅读更多关于它的信息。
Cobra is released under the Apache 2.0 license. See LICENSE.txt
1、学习曲线
它包含了类C语法、GC内置和工程工具。这一点非常重要,因为Go语言容易学习,所以一个普通的大学生花一个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。
2、效率
Go拥有接近C的运行效率和接近PHP的开发效率,这就很有利的支撑了上面大家追求快速的需求。
3、出身名门、血统纯正
之所以说Go语言出身名门,是因为我们知道Go语言出自Google公司,这个公司在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。我们看看Go语言的主要创造者,血统纯正这点就可见端倪了。
4、组合的思想、无侵入式的接口
Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。
5、强大的标准库
这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定,特别是我这里提到的三个,网络层、系统层的库非常实用。
6、部署方便
我相信这一点是很多人选择Go的最大理由,因为部署太方便,所以现在也有很多人用Go开发运维程序。
7、简单的并发
它包含降低心智的并发和简易的数据同步,我觉得这是Go最大的特色。之所以写正确的并发、容错和可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象,Go可以说这一块做的相当简单。
8、稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期的各个环节的工具,如go
tool、gofmt、go test。
TiDB 是 PingCAP 自主研发的开源分布式关系型数据库,具备商业级数据库的数据可靠性,可用性,安全性等特性,支持在线弹性水平扩展,兼容 MySQL 协议及生态,创新性实现 OLTP 及 OLAP 融合。
TiDB 3.0 版本显著提升了大规模集群的稳定性,集群支持 150+ 存储节点,300+TB 存储容量长期稳定运行。易用性方面引入大量降低用户运维成本的优化,包括引入 Information_Schema 中的多个实用系统视图、EXPLAIN ANALYZE、SQL Trace 等。在性能方面,特别是 OLTP 性能方面,3.0 比 2.1 也有大幅提升,其中 TPC-C 性能提升约 4.5 倍,Sysbench 性能提升约 1.5 倍,OLAP 方面,TPC-H 50G Q15 因实现 View 可以执行,至此 TPC-H 22 个 Query 均可正常运行。新功能方面增加了窗口函数、视图(实验特性)、分区表、插件系统、悲观锁(实验特性)。
截止本文发稿时 TiDB 已在 500+ 用户的生产环境中长期稳定运行,涵盖金融、保险、制造,互联网, 游戏 等领域,涉及交易、数据中台、 历史 库等多个业务场景。不同业务场景对关系型数据库的诉求可用 “百花齐放”来形容,但对关系数据库最根本的诉求未发生任何变化,如数据可靠性,系统稳定性,可扩展性,安全性,易用性等。请跟随我们的脚步梳理 TiDB 3.0 有什么样的惊喜。
3.0 与 2.1 版本相比,显著提升了大规模集群的稳定性,支持单集群 150+ 存储节点,300+TB 存储容量长期稳定运行,主要的优化点如下:
1. 优化 Raft 副本之间的心跳机制,按照 Region 的活跃程度调整心跳频率,减小冷数据对集群的负担。
2. 热点调度策略支持更多参数配置,采用更高优先级,并提升热点调度的准确性。
3. 优化 PD 调度流程,提供调度限流机制,提升系统稳定性。
4. 新增分布式 GC 功能,提升 GC 的性能,降低大集群 GC 时间,提升系统稳定性。
众所周知,数据库查询计划的稳定性对业务至关重要,TiDB 3.0 版本采用多种优化手段提升查询计划的稳定性,如下:
1. 新增 Fast Analyze 功能,提升收集统计信息的速度,降低集群资源的消耗及对业务的影响。
2. 新增 Incremental Analyze 功能,提升收集单调递增的索引统计信息的速度,降低集群资源的消耗及对业务的影响。
3. 在 CM-Sketch 中新增 TopN 的统计信息,缓解 CM-Sketch 哈希冲突导致估算偏大,提升代价估算的准确性,提升查询计划的稳定性。
4. 引入 Skyline Pruning 框架,利用规则防止查询计划过度依赖统计信息,缓解因统计信息滞后导致选择的查询计划不是最优的情况,提升查询计划的稳定性。
5. 新增 SQL Plan Management 功能,支持在查询计划不准确时手动绑定查询计划,提升查询计划的稳定性。
1. OLTP
3.0 与 2.1 版本相比 Sysbench 的 Point Select,Update Index,Update Non-Index 均提升约 1.5 倍,TPC-C 性能提升约 4.5 倍。主要的优化点如下:
1. TiDB 持续优化 SQL 执行器,包括:优化 NOT EXISTS 子查询转化为 Anti Semi Join,优化多表 Join 时 Join 顺序选择等。
2. 优化 Index Join 逻辑,扩大 Index Join 算子的适用场景并提升代价估算的准确性。
3. TiKV 批量接收和发送消息功能,提升写入密集的场景的 TPS 约 7%,读密集的场景提升约 30%。
4. TiKV 优化内存管理,减少 Iterator Key Bound Option 的内存分配和拷贝,多个 Column Families 共享 block cache 提升 cache 命中率等手段大幅提升性能。
5. 引入 Titan 存储引擎插件,提升 Value 值超过 1KB 时性能,缓解 RocksDB 写放大问题,减少磁盘 IO 的占用。
6. TiKV 新增多线程 Raftstore 和 Apply 功能,提升单节点内可扩展性,进而提升单节点内并发处理能力和资源利用率,降低延时,大幅提升集群写入能力。
TiDB Lightning 性能与 2019 年年初相比提升 3 倍,从 100GB/h 提升到 300GB/h,即 28MB/s 提升到 85MB/s,优化点,如下:
1. 提升 SQL 转化成 KV Pairs 的性能,减少不必要的开销。
2. 提升单表导入性能,单表支持批量导入。
3. 提升 TiKV-Importer 导入数据性能,支持将数据和索引分别导入。
4. TiKV-Importer 支持上传 SST 文件限速功能。
RBAC(Role-Based Access Control,基于角色的权限访问控制) 是商业系统中最常见的权限管理技术之一,通过 RBAC 思想可以构建最简单“用户-角色-权限”的访问权限控制模型。RBAC 中用户与角色关联,权限与角色关联,角色与权限之间一般是多对多的关系,用户通过成为什么样的角色获取该角色所拥有的权限,达到简化权限管理的目的,通过此版本的迭代 RBAC 功能开发完成。
IP 白名单功能(企业版特性) :TiDB 提供基于 IP 白名单实现网络安全访问控制,用户可根据实际情况配置相关的访问策略。
Audit log 功能(企业版特性) :Audit log 记录用户对数据库所执行的操作,通过记录 Audit log 用户可以对数据库进行故障分析,行为分析,安全审计等,帮助用户获取数据执行情况。
加密存储(企业版特性) :TiDB 利用 RocksDB 自身加密功能,实现加密存储的功能,保证所有写入到磁盘的数据都经过加密,降低数据泄露的风险。
完善权限语句的权限检查 ,新增 ANALYZE,USE,SET GLOBAL,SHOW PROCESSLIST 语句权限检查。
1. 新增 SQL 方式查询慢查询,丰富 TiDB 慢查询日志内容,如:Coprocessor 任务数,平均/最长/90% 执行/等待时间,执行/等待时间最长的 TiKV 地址,简化慢查询定位工作,提高排查慢查询问题效率,提升产品易用性。
2. 新增系统配置项合法性检查,优化系统监控项等,提升产品易用性。
3. 新增对 TableReader、IndexReader 和 IndexLookupReader 算子内存使用情况统计信息,提高 Query 内存使用统计的准确性,提升处理内存消耗较大语句的效率。
4. 制定日志规范,重构日志系统,统一日志格式,方便用户理解日志内容,有助于通过工具对日志进行定量分析。
5. 新增 EXPLAIN ANALYZE 功能,提升SQL 调优的易用性。
6. 新增 SQL 语句 Trace 功能,方便排查问题。
7. 新增通过 unix_socket 方式连接数据库。
8. 新增快速恢复被删除表功能,当误删除数据时可通过此功能快速恢复数据。
TiDB 3.0 新增 TiFlash 组件,解决复杂分析及 HTAP 场景。TiFlash 是列式存储系统,与行存储系统实时同步,具备低延时,高性能,事务一致性读等特性。 通过 Raft 协议从 TiKV 中实时同步行存数据并转化成列存储格式持久化到一组独立的节点,解决行列混合存储以及资源隔离性问题。TiFlash 可用作行存储系统(TiKV)实时镜像,实时镜像可独立于行存储系统,将行存储及列存储从物理隔离开,提供完善的资源隔离方案,HTAP 场景最优推荐方案;亦可用作行存储表的索引,配合行存储对外提供智能的 OLAP 服务,提升约 10 倍复杂的混合查询的性能。
TiFlash 目前处于 Beta 阶段,计划 2019 年 12 月 31 日之前 GA,欢迎大家申请试用。
未来我们会继续投入到系统稳定性,易用性,性能,弹性扩展方面,向用户提供极致的弹性伸缩能力,极致的性能体验,极致的用户体验。
稳定性方面 V4.0 版本将继续完善 V3.0 未 GA 的重大特性,例如:悲观事务模型,View,Table Partition,Titan 行存储引擎,TiFlash 列存储引擎;引入近似物理备份恢复解决分布数据库备份恢复难题;优化 PD 调度功能等。
性能方面 V4.0 版本将继续优化事务处理流程,减少事务资源消耗,提升性能,例如:1PC,省去获取 commit ts 操作等。
弹性扩展方面,PD 将提供弹性扩展所需的元信息供外部系统调用,外部系统可根据元信息及负载情况动态伸缩集群规模,达成节省成本的目标。
我们相信战胜“未知”最好的武器就是社区的力量,基础软件需要坚定地走开源路线。截止发稿我们已经完成 41 篇源码阅读文章。TiDB 开源社区总计 265 位 Contributor,6 位 Committer,在这里我们对社区贡献者表示由衷的感谢,希望更多志同道合的人能加入进来,也希望大家在 TiDB 这个开源社区能够有所收获。
TiDB 3.0 GA Release Notes: