GraalVM 是一种高性能的运行时,可显着提高应用程序的性能和效率,非常适合微服务。 它设计用于以 Java,JavaScript,基于 LLVM 的语言(例如 C 和 C ++ )以及其他动态语言编写的应用程序。 它消除了编程语言之间的隔离,并实现了共享运行时的互操作性。

3.0.0.0-BETA6 及以上版本,Next 支持基于 GraalVM 的多语言混合编程模式。建议在使用前先看一遍 GraalVM 的官方文档。

Cloudopt Next 是一个非常轻量级且现代的、基于 Kotlin 编写的全栈开发框架,同时支持 Java 和 Kotlin,您可以处理Url的解析,数据的封装,Json的输出等等,从根本上减少开发时间、提升开发体验。但是 Cloudopt Next 是基于 Java、Kotlin 这种静态语言的,某些情况下(例如策略、规则)不方便时时调整代码,必须要重新编译部署。结合 GraalVM 后可以直接将 python、ruby 等动态语言在运行过程中在 JVM 上执行,这样就可以动态调整一些规则、策略以及实时生效。

在运行前请安装好 GraalVM ,并将 IDE 中的 JDK 改为 GraalVM。目前 Windows 不支持 python、ruby 等语言。

你需要先引入混合编程的依赖:

  1. <dependency>
  2. <groupId>net.cloudopt.next</groupId>
  3. <artifactId>cloudopt-next-polyglot</artifactId>
  4. <version>${version}</version>
  5. </dependency>

Python

运行代码

  1. python {
  2. "print('Hello Python!')"
  3. }

运行 Python 文件

Next 会自动检测,如果 Block 中包裹的字符串根据回车符分割后只有一行切这一行的结尾与要执行的语言的文件后缀一致,那么会自动读取 resource 文件夹下的这个文件。

  1. python {
  2. "test.py"
  3. }

传递变量

你只需要将变量的 map 传递给执行方法即可。然后在需要执行的代码中导入 polyglot 包然后取出 map 中的值即可。

  1. python(mutableMapOf("name" to "Andy")) {
  2. "import polyglot \n" +
  3. "print(polyglot.import_value('name') + ': Hello Python!') \n"
  4. }

结合 await

避免Blocking

建议先阅读《避免 Blocking》一章。

  1. val x = await<Int> { promise ->
  2. val value = python(mutableMapOf("name" to "Andy")) {
  3. "test.py"
  4. }
  5. promise.complete(value?.asInt())
  6. }
  7. println(x)

与正常的方法结合 await 语法糖一致,只需要使用 await 语法包裹即可。

自定义上下文

在 GraalVM 中,执行代码是使用一个线程安全的上下文对象执行的,如果你需要修改只需要在语法糖的参数中放入即可。

默认情况下,Next 开启了 io、环境变量读取和 native 执行权限。

  1. val context: Context = customContext ?: Context.newBuilder()
  2. .allowIO(true)
  3. .allowPolyglotAccess(PolyglotAccess.ALL)
  4. .allowEnvironmentAccess(EnvironmentAccess.INHERIT)
  5. .allowNativeAccess(true)
  6. .build()
  7. pythoncustomContext=context {
  8. "test.py"
  9. }

禁止自动关闭上下文对象

默认情况下在执行完后会自动关闭上下文对象,如果你需要在执行完后仍然要操作上下文对象的话,请禁止自动关闭。

  1. pythonautoContextClose=false {
  2. "test.py"
  3. }

导入第三方 python 包

目前 GraalVM 支持的 python 包并不多。建议参考官方的支持列表。引入之前需要先引入 site 包。

  1. import site
  2. import numpy as np
  3. x = np.empty([3,2], dtype = int)
  4. print (x)

JavaScript

  1. javascript {
  2. "console.log('Hello Python!')"
  3. }

除了语法关键字不一样以外,其他用法基本与 python 一致。

Ruby

  1. ruby {
  2. "print 'Hello Ruby'"
  3. }

除了语法关键字不一样以外,其他用法基本与 python 一致。

R

  1. R {
  2. "print('Hello R')"
  3. }

除了语法关键字不一样以外,其他用法基本与 python 一致。