目录
重要说明:本方是翻译自https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/#getting-started这个文章,感谢Sabby AnandanMarius
BogoeviciEric BottardMark FisherIlayaperumal GopinathanGunnar HillertMark
PollackPatrick PeraltaGlenn RenfroThomas RisbergDave SyerDavid TuranskiJanne
ValkealahtiOleg Zhurakousky这些原文作者的写作成果,让我们能更好地入门学习Spring Cloud Data Flow的相关技术,考虑到国内中文的文档资料比较欠缺,而且基本不太成体系,所以自己希望来翻译该文章,方便学习使用。
以下是原文内容的翻译,一些关键性的技术术语,本文考虑不进行翻译,保持原来的英文词汇,加强技术术语印象,而且这些技术术语强行翻译成中文的话,感觉很别扭。另一方面水平有限,文本可能有翻译不太贴切或是错误的地方,还请大家体谅,看到后多多指正。
********************************以下是原文内容的翻译**********************
Version 1.3.0.M2
© 2012-2017 Pivotal Software, Inc.
你可以自己使用这个文章或是分发给其它人,但前提是你不以赚取费用为目标,同时每个转发的文章必须包含此版权通知,无论是印刷品版本还是电子发行版本。
Shell
在这一节中您将开始了解Shell和它更进一步的功能,涉及到如何处理空格,引号,以及SPEL表达式的解析。StreamDSL和ComposedTask DSL章节很适合用来开始学习shell命令行。
16. Shell 选项
Shell是基于SpringShell项目来构建的。有命令行选项与Spring
Shell和一些Data Flow的选项是通用的。shell接受以下命令行选项:
unix:>java -jar spring-cloud-dataflow-shell-1.2.1.RELEASE.jar --helpData Flow Options: --dataflow.uri= Address of the Data Flow Server [default: http://localhost:9393]. --dataflow.username= Username of the Data Flow Server [no default]. --dataflow.password= Password of the Data Flow Server [no default]. --dataflow.credentials-provider-command= Executes an external command which must return an OAuth Access Token [no default]. --dataflow.skip-ssl-validation= Accept any SSL certificate (even self-signed) [default: no]. --spring.shell.historySize= Default size of the shell log file [default: 3000]. --spring.shell.commandFile= Data Flow Shell executes commands read from the file(s) and then exits. --help This message.
spring.shell.commandfile这个选项是值得注意的,因为它可以用来指向一个现有的文件,其中包含所有用于部署一个或多个相关数据流任务的shell命令。这对于创建一些脚本来帮助自动化部署是非常有用的。
下边也是一个 shell 的命令
dataflow:>script --file
这可以将复杂的脚本文件模块化,分成多个独立文件是非常有用的。
17. 可用的命令行
在命令提示符处键入help,系统将列出所有可用的命令。大多数命令都是用于数据流功能的,但有一些是通用的。
! - Allows execution of operating system (OS) commandsclear - Clears the consolecls - Clears the consoledate - Displays the local date and timeexit - Exits the shellhttp get - Make GET request to http endpointhttp post - POST data to http endpointquit - Exits the shellsystem properties - Shows the shell's propertiesversion - Displays shell version
在help后面添加相应的命令的名称,系统将会显示关于这个命令的附加帮助信息。
dataflow:>help stream createKeyword: stream createDescription: Create a new stream definitionKeyword: ** default **Keyword: name Help: the name to give to the stream Mandatory: true Default if specified: '__NULL__' Default if unspecified: '__NULL__'Keyword: definition Help: a stream definition, using the DSL (e.g. "http --port=9000 | hdfs") Mandatory: true Default if specified: '__NULL__' Default if unspecified: '__NULL__'Keyword: deploy Help: whether to deploy the stream immediately Mandatory: false Default if specified: 'true' Default if unspecified: 'false'
18. Tab 键自动填充
Shell命令行的选项,在输入--后,可以通过按TAB键自动填充完整。如输入stream
create –后,直接按TAB键,那么会有相应的命令选项提示
dataflow:>stream create --stream create --definition stream create --name
如果你是输--de后,再按TAB键,那么—definition这个选项将会自动填充完整
在应用程序或任务属性的流或组合任务DSL表达式中,也可以使用TAB键自动填充。还可以使用TAB键在流DSL表达式中获取相应的提示,以便发现有哪些可用的sources, processors和sinks。
19. 空格和引号的使用规则
如果参数值里包含空格或|字符,那么需要给他们添加单引号。下边的例子是把一个SPEL表达式传给一个转换processor,这个表达式会处理一切通过这个processor的数据:
transform --expression='new StringBuilder(payload).reverse()'
如果参数值当中需要嵌入单引号,那么需要把用到的单引号改为双引号:
// Query is: Select * from /Customers where name='Smith'scan --query='Select * from /Customers where name=''Smith'''
19.1. 引号和转义
基于Spring
Shell的客户端,它负责解析DSL并和数据流服务器进行交互。反过来,应用程序可能也具有依赖于嵌入式语言(如Spring
Expression Language
)的应用程序属性。
shell, Data Flow DSL 解析器和 SpEL都有相应的规则用于处理引号和转义。当他们结合在一起时就容易产生混乱。本章节会解释这些应用规则,并举例说明当涉及这三个组件时所遇到的复杂情况。
当然,情况并不总是那么复杂。
如果你不使用Data Flow
shell,例如你直接使用REST API,或者应用程序的属性用的不是SpEL表达式,转义规则就简单了。
19.1.1. Shell 的规则
可以说,shell是使用引号最复杂的组件,但这些规则可以很简单地罗列出来:
•shell命令由相应的命令键(--foo)和相应的值组成。存在一个特殊的无键映射,请参见下面
•值通常不能包含空格,因为空格是命令的默认分隔符。
•可以通过添加引号(单引号或双引号)来添加空格。
•如果用引号括起来,一个值可以嵌入一个相同类型的字符,需要前面加一个反斜杠(\)
•其他转义也是可用的,如\t,\n,\r,\ f和Unicode的转义形式\uxxxx
•最后,如果不使用引号来包含空格,那么无键映射是以一种特殊的方式处理的。
例如,shell支持!命令来执行本机shell命令。这个!接受单个无键的参数。以下命令行可以工作:
dataflow:>! rm foo
这里的参数是整个rm
foo
字符串,它被传递给底层的shell。
作为另一个例子,下面的命令都是实现同样功能的,参数值是foo(没有引号):
dataflow:>stream destroy foodataflow:>stream destroy --name foodataflow:>stream destroy "foo"dataflow:>stream destroy --name "foo"
19.1.2. DSL 解析规则
在解析器级别(即在stream 或task定义的内部),规则如下:
•在遇到第一个空格字符前,前边相应的字符解析为选项值。
•它们可以由字符串组成,由单引号或双引号包围。
•需要嵌入引号的话,需要使用两个连续引号。
因此,在下面的示例中,筛选器应用程序的--expression选项值在语义上是等价的:
filter --expression=payload>5filter --expression="payload>5"filter --expression='payload>5'filter --expression='payload > 5'
相对来说,最后一个是更易读的。主要是得益于它两边包围的单引号。实际表达式是payload
> 5
(没有引号)。
现在,让我们假设我们要测试字符串消息。如果我们想比较payload与SpEL 的字符串“foo”,我们可以这么做:
filter --expression=payload=='foo' filter --expression='payload == ''foo''' filter --expression='payload == "foo"'
第一个命令行,可以正常工作是因为没有空格,虽然不太清晰。
第二个命令行,使用单引号来保护整个参数,因此实际的单引号需要变为双引号。
第三个命令行,SpEL基于单引号或者双引号识别字符串,最后一种方法是最好的。
请注意上面的例子是不考虑在shell里使用的,例如,当直接调用REST API时。当在shell中输入时,整个流定义本身将在双引号内,它里面的一些字符需要转义。整个例子就变成了:
dataflow:>stream create foo --definition "http | filter --expression=payload='foo' | log"dataflow:>stream create foo --definition "http | filter --expression='payload == ''foo''' | log"dataflow:>stream create foo --definition "http | filter --expression='payload == \"foo\"' | log"
19.1.3. SpEL 语法和 SpEL 字符串
最后一块规则内容是关于SpEL表达式的。许多应用程序接受的选项是被解释为SpEL表达,而如上所述,字符串的处理也有一种特殊的方式。规则是:
•文字可以用单引号或双引号括起来。
•引号需要增加一倍才能嵌入作为一个字符引号。双引号内的单引号不需要特殊处理,反之亦然。
作为最后一个示例,假设希望使用转换处理器。该处理器接受一个expression选项,这是个SpEL表达式。它将对传入消息进行评估,使用默认的表达式payload(转发消息不受影响)。
重要的是,要明白以下命令行是等价的:
transform --expression=payloadtransform --expression='payload'
但是和下边的不同:
transform --expression="'payload'"transform --expression='''payload'''
当然,还有其他变体。
第一个系列将简单地对消息有效负载进行评估,而后一个示例将评估实际的实际字符串payload(没有引号)。
19.1.4. 规则整体情况
作为最后一个完整的示例,让我们回顾一下如何通过在Data Flow
shell上下文中创建流来强制将所有消息转换为字符串Hello World:
dataflow:>stream create foo --definition "http | transform --expression='''hello world''' | log" dataflow:>stream create foo --definition "http | transform --expression='\"hello world\"' | log" dataflow:>stream create foo --definition "http | transform --expression=\"'hello world'\" | log"
第一个命令行,这里在字符串两边加单引号(在数据流解析器级别),但它们需要加倍,因为属于在字符串中(等号后面的第一个单引号)。
第二、第三个命令行,分别使用单引号和双引号来覆盖数据流解析器级别上的整个字符串。因此,另一种引号可以在字符串中使用。整个内容都在shell的--definition参数内,但它使用了双引号,所以双引号需要转义(在shell级别)。