使用SparkJava和Graal的本机微服务

使用SparkJava编写的微服务只是使用标准Java库的普通Java代码。 没有注释魔术,只有代码。 这种简单的编程风格的优点在于,它很简单。 非常简单,以至于Graal本机编译器无需闪烁就可以对其进行编译 ,这在例如Spring之类的更复杂的框架中目前非常困难。

SparkJava / Graal组合本身就很有趣,人们对此的体验也开始 出现 。 此外,作为Java库,应该可以从其他基于JVM的语言中使用它,而我想知道Graal将如何应对。 实际上,事实证明这很简单,在本文中,我们将看到为Java,Kotlin甚至Clojure构建本机微服务二进制文件非常容易。

入门

如果您还没接触过Graal,我建议您访问他们的网站 ,看看它提供了什么。 在这里,我们使用的是本机编译功能,但实际上这只是表面。

要首先使用Graal,您需要安装最新版本的Graal SDK。 撰写本文时为1.0.0-rc9 。 我使用SdkMan做到了 :

sdk install java 1.0.0-rc9-graal

从那时起

sdk use java 1.0.0-rc9-graal

然后创建一个基本的Gradle项目并添加最小依赖项:

dependencies {compile "com.sparkjava:spark-core:2.7.2"compile "org.slf4j:slf4j-simple:1.7.13"
}

(我假设您已经熟悉Gradle,如果愿意的话,可以使用Maven进行 。请注意,选择的Slf4j实现与SparkJava所需的版本匹配非常重要。)

对于SparkJava,微服务端点本质上是lambda表达式形式的路径或回调之间的绑定或route 。 这是我们将用作基础的标准“ hello world”示例。 当然,现实世界中的服务将利用请求和响应对象。 请参阅文档以获取更多详细信息。

import static spark.Spark.*;public class HelloWorld {public static void main(String[] args) {get("/sayHello", (req, res) -> "Hello world!");}
}

要将其作为命令行程序运行,将所有依赖项一起复制到同一目录中非常方便。 我们也可以使用Gradle做到这一点。

task copyDependencies(type: Copy) {from configurations.defaultinto 'build/libs'shouldRunAfter jar
}assemble.dependsOn copyDependencies

生成服务并运行它以检查其是否有效。

> ./gradlew clean assemble
> java -cp "build/libs/*" HelloWorld
...
[Thread-0] INFO org.eclipse.jetty.server.Server - Started @363ms
> curl localhost:4567/sayHello
Hello World!

让我们使用Graal将其编译为本地二进制文件。 幸运的是,该命令与java命令非常相似:

> native-image -cp "build/libs/*" HelloWorld
...
Build on Server(pid: 31197, port: 52737)*
[helloworld:31197]    classlist:   2,142.65 ms
[helloworld:31197]        (cap):   2,154.21 ms
...
...
[helloworld:31197]        write:     443.13 ms
[helloworld:31197]      [total]:  56,525.52 ms

现在,我们应该在当前目录中拥有本机二进制文件。 让我们运行它:

> ./helloworld
...
[Thread-2] INFO org.eclipse.jetty.server.Server - Started @2ms
> curl localhost:4567/sayHello
Hello World!

可执行文件为14Mb,但看该启动时间为2ms ,基本上是瞬时的! 在内存方面,过多地关注top并不是明智的选择,但是很明显,从运行时删除JVM具有其优势。 这在部署大量独立进程的微服务系统中尤其重要。

Kotlin呢?

Kotlin是一种JVM语言,正在Swift发展并且并非没有道理。 它结合了功能样式和OO功能,无缝的Java互操作性和简洁的语法,使其成为通用的良好语言,并且是Java的明显替代。 首先要使用Kotlin构建我们的服务,我们将Kotlin库依赖项添加到Gradle(撰写本文时版本为v1.3.10)。

dependencies {
...compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.10"
}

并使用Kotlin编译器插件。

plugins {id 'org.jetbrains.kotlin.jvm' version '1.3.10'
}

使用Kotlin,我们荒谬的简单微服务变得更加简单。

import spark.Spark.*fun main(args: Array<String>) {get("/sayHello") { req, res -> "Hello World!" }
}

生成服务并运行它以检查其是否有效。

> ./gradlew clean assemble
> java -cp "build/libs/*" HelloWorldKt
...
[Thread-0] INFO org.eclipse.jetty.server.Server - Started @363ms
> curl localhost:4567/sayHello
Hello World!

让我们本地编译它。 因为它 Java,所以命令几乎与Java版本相同(Kotlin编译器会自动将Kt后缀添加到生成的类中)。

> native-image -cp "build/libs/*" HelloWorldKt
Build on Server(pid: 53242, port: 51191)
[helloworldkt:53242]    classlist:     783.03 ms
[helloworldkt:53242]        (cap):   2,139.45 ms
...
[helloworldkt:53242]        write:     591.88 ms
[helloworldkt:53242]      [total]:  53,074.15 ms

并运行它:

> ./helloworldkt
...
[Thread-2] INFO org.eclipse.jetty.server.Server - Started @2ms
> curl localhost:4567/sayHello
Hello World!

可执行文件的大小和启动速度几乎与Java版本相同,这是可以预期的,因为它实质上是相同的代码。

这是一个基本示例,但Kotlin实现简化SparkJava简化 实现 微服务Graal简化部署相结合,是微服务开发非常有吸引力的主张。

尽管如此,除了更好的语法外,Kotlin与Java非常相似。 我们还可以使用其他JVM语言,这些语言可能会进一步推动Graal。

需要Clojure

使用Clojure构建微服务是一个有趣的想法。 服务本质上是自然的功能,实际上服务一种功能,语言的动态特性可能使其成为某些以数据为中心的情况的理想选择。

而不是使用Gradle,我们将从一个新的Leiningen项目开始:

lein new hello-clojure

依赖关系放在main project.clj文件中,以及我们将用来启动服务器的主类的名称。

:dependencies [[org.clojure/clojure "1.9.0"][com.sparkjava/spark-core "2.7.2"][org.slf4j/slf4j-simple "1.7.13"]]:main hello_clojure.core)

Clojure可与Java互操作,但程度不及Kotlin。 为了克服这些差异,我编写了一些适配器,以允许惯用的clojure代码使用SparkJava的类。

(ns hello_clojure.core(:gen-class)(:import (spark Spark Response Request Route)))(defn route [handler](reify Route(handle [_ ^Request request ^Response response](handler request response))))(defn get [endpoint routefn](Spark/get endpoint (route routefn)))

(我后来发现了一篇不错的文章 ,其中提供了使用Clojure和SparkJava的完整服务。它们的适配器比我的适配器稍好,因此我在后面的文章中结合了一些想法。)

然后,我们准备创建从main方法执行的控制器,以便可以从命令行轻松调用它。 还要注意,在上面我们使用gen-class指令来确保在清单中指定了主类:

(defn -main [](get "/sayHello" (fn [req resp] "Hello World!!")))

为了简化服务的生成,我们可以使用Leiningen构建一个自包含的jar。

> lein clean && lein uberjar

和以前一样,我们首先检查该服务是否可以正常运行Java:

$ java -cp target/hello-clojure-0.1.0-SNAPSHOT-standalone.jar hello_clojure.core
...
[Thread-0] INFO org.eclipse.jetty.server.Server - Started @1033ms
> curl localhost:4567/sayHello
Hello World!

编译为本地映像就像使用Java和Kotlin的先前示例一样简单。

> native-image -cp target/hello-clojure-0.1.0-SNAPSHOT-standalone.jar hello_clojure.core
Build on Server(pid: 35646, port: 53994)*
[hello_clojure.core:35646]    classlist:   2,704.82 ms
[hello_clojure.core:35646]        (cap):     909.58 ms
...
[hello_clojure.core:35646]        write:     647.23 ms
[hello_clojure.core:35646]      [total]:  54,900.61 ms

并运行它:

> ./helloworld_clojure
...
[Thread-2] INFO org.eclipse.jetty.server.Server - Started @2ms
> curl localhost:4567/sayHello
Hello World!

本地二进制文件再次大约为15M,并且启动时间几乎是瞬时的。

结论

将Graal与其他基于JVM的语言结合使用是一个非常诱人的主张,值得进一步研究,但是我确实对生产用途存在一些担忧。 主要是如果出现问题,公共领域中几乎没有信息可以为您提供帮助,而纯Java之外的信息则更少。 另一方面,这些都是开源项目,所以什么都没有隐藏:)

另一个限制是,许多库根本无法与Graal一起使用。 这并不是完全消极的,因为它会鼓励我们回到简单的编码实践中,但是您可能会遇到无法更改的依赖关系,这可能会引起很大的麻烦。 我认为最初的主要缺点是反射驱动的映射,无论是序列化还是ORM品种。 为了使许多库和框架与Graal 兼容 ,已经做了很多工作,但是还处于初期。

第三,主要是实际的考虑是对本机映像的编译非常慢。 即使是这个非常简单的示例,也几乎需要花费一分钟的时间来构建。 当然,您可以仅将开发编译为字节码,但是兼容性问题可能会消失。 持续的构建流程和全面的测试将是减轻这种风险的一种方法。

显然,要使它成为一个功能齐全的服务还有很多工作要做,并且在投入生产使用之前要进行适当的考虑,但是如果我们选择继续使用简单的代码,那么问题将被最小化。

翻译自: https://www.javacodegeeks.com/2019/01/native-microservices-sparkjava-graal.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机原理与应用简称,基础知识-计算机原理与应用.ppt

基础知识-计算机原理与应用第1章 基础知识 本章内容&#xff1a; 单片机的概念 单片机的发展、基本的结构和特点 单片机的应用模式和领域 MCS-51单片机等。 1.1 计算机的一些概念 1.2 单片机   单片机即单片机微型计算机&#xff0c;就是将CPU、RAM、ROM、定时/计数器和多种接…

【渝粤教育】广东开放大学 大学英语1 形成性考核 (43)

选择题 题目&#xff1a;Fans are necessary in ____hot country. 题目&#xff1a;Which river is ____shortest, the Nile, the Amazon, or the Mississippi? 题目&#xff1a;This great team crossed the ocean on____raft. 题目&#xff1a;Why is America called____Uni…

【渝粤教育】广东开放大学 建筑工程施工 形成性考核 (58)

选择题 题目&#xff1a;1、仲裁委员会裁决作出后&#xff0c;一方当事人不履行裁决时&#xff08;   &#xff09;。 题目&#xff1a;2、诉讼时效因提起诉讼&#xff0c;当事人一方提出要求或者同意履行义务而中断&#xff0c;从中断时起&#xff0c;诉讼时效期间 &#xf…

【渝粤教育】广东开放大学 数据结构 形成性考核 (24)

选择题 题目&#xff1a;链接存储的存储结构所占存储空间&#xff08; &#xff09; 题目&#xff1a;线性表若采用链式存储结构时&#xff0c;要求内存中可用存储单元的地址&#xff08; &#xff09;。 题目&#xff1a;顺序表中第一个元素的存储地址是100&#xff0c;每个元…

湖北农商行计算机类笔试,2018湖北农商行招聘考试面试考多少分,才能进笔试?...

原标题&#xff1a;2018湖北农商行招聘考试面试考多少分&#xff0c;才能进笔试&#xff1f;昨天&#xff0c;湖北农商行各地农商行面试分数线陆续出来了&#xff0c;恭喜过线的小伙伴&#xff0c;你们顺利的进入了笔试阶段&#xff0c;接下来小编给大家说一下各地的进笔试的分…

【渝粤教育】广东开放大学 物业实务 形成性考核 (24)

选择题 题目&#xff1a;一般的大中型物业服务公司都采用( )。 题目&#xff1a;( )既能适应现代化工业企业生产技术比较复杂&#xff0c;管理工作比较精细的特点;又能充分发挥职能机构的专业管理作用&#xff0c;减轻直 题目&#xff1a;公共安全防范管理服务是物业服务企业协…

vue路由匹配实现包容性_我们甚至没有进行包容性的讨论

vue路由匹配实现包容性科技行业需要更加包容女性和有色人种。 这是关于拥有最大的人才库以吸取卓越的经验。 可悲的是&#xff0c;大多数讨论&#xff0c;甚至是倡导更具包容性的文化讨论&#xff0c;本身都是分裂的。 我们都是个人 我们都是个人。 我们都有自己的优点和缺点…

【渝粤教育】广东开放大学 经济法基础 形成性考核 (38)

选择题 题目&#xff1a; 下列各项中&#xff0c;不能成为经济法律关系主体的是( )。 选择一项&#xff1a; 题目&#xff1a; 张某是某企业的销售人员&#xff0c;随身携带盖有该企业公章的空白合同书&#xff0c;便于对外签约。后张某因收取回扣被企业除名&#xff0c;但空…

计算机共享原理,synchronize底层原理 游戏电脑问题解决分享!

sync1 package com.paddx.test.concurrent;23 public class SynchronizedDemo {4 public void method() {5 synchronized (this) {6 System.out.println("Method 1 start&quot&#x1f609;;7 }8 }9 }反编译结果&#xff1a;关于这两条指令的作用&#xff0c;我们直接…

【渝粤教育】广东开放大学 财政学 形成性考核 (43)

选择题 题目&#xff1a;现代财政学诞生的标志&#xff08; &#xff09;。 题目&#xff1a;&#xff08; &#xff09;由于公共产品存在非竞争性和非排他性&#xff0c;任何消费者即使不付出任何代价也可免费享受公共产品的好处。 题目&#xff1a;在公共产品与私人产…

单元测试反模式,完整列表

我前段时间写过有关OOP中的反模式的文章 。 现在该写单元测试反模式了&#xff0c;因为它们也存在&#xff0c;并且有很多。 我将尝试在列表中包括我知道的每个示例。 如果您认识其他任何人&#xff0c;请通过请求请求将其添加&#xff0c;或在下面发表评论。 对于每个反模式&a…

大学计算机——所有大学生都应学习的一门计算思维基础教育课程,_大学计算机_所有大学生都应学习的一门计算思维基础教育课程...

中国大学教学 2011年第4期“大学计算机”——所有大学生都应学习的一门计算思维基础教育课程战德臣 聂兰顺 徐晓飞摘 要&#xff1a;当前&#xff0c;大学非计算机专业计算机课程存在知识型/技能型教学与未来计算能力需求之间的鸿沟&#xff0c;致使计算机教育存在危机。本文分…

【渝粤题库】广东开放大学 文化产业概论 形成性考核

选择题 题目&#xff1a;目前关于文化产业的定义有以下&#xff08;&#xff09;几种 题目&#xff1a;根据《文化及相关产业指标体系框架》&#xff0c;文化产业具体可划分为&#xff08;&#xff09; 题目&#xff1a;中国的文化产业在发展过程中&#xff0c;出现了以下&…

【渝粤题库】广东开放大学 金融经济学 形成性考核

选择题 题目&#xff1a;&#xff08; &#xff09;理论认为&#xff0c;现实中的个体和企业经理人面临着风险或不确定性。 答案&#xff1a; A、计量经济学 B、微观经济学 C、宏观经济学 D、金融经济学 题目&#xff1a;以下不属于个体可用的融资工具是&#xff08; …

【渝粤题库】陕西师范大学180105 推销策略 作业(高起专)

一、填空 1、现代推销理念的核心是 需要。 2、按照推销方格理论&#xff0c; 的推销心理是最理想的。 3、收集推销信息的方法&#xff0c;主要有&#xff1a; 、观察法和实验法。 4、对顾客购买力评价是指组织或个人 的审查。 5、推销洽谈的报价原则是 。 6、在不熟悉推销对象的…

控制计算机价格,本人对电脑不太懂。想十一买台笔记本电脑。价格控制在5000之内。请高手指点一下。谢谢!...

你好朋友&#xff0c;要达到你的需求&#xff0c;至少应该满足三点&#xff0c;一是15.6尺寸&#xff1b;二是I5以上处理器&#xff0c;三是大容量内存&#xff0c;最好是6-8G的。你选择的两款&#xff0c;第一款已经停产&#xff0c;第二款还不错&#xff0c;新架构处理器&…

amazon云服务_亚马逊Simple Worklfow服务的骆驼演示

amazon云服务在上一篇文章中&#xff0c;我解释了为什么AWS SWF服务很好&#xff0c;并宣布了新的Camel SWF组件。 现在&#xff0c;组件文档已准备就绪&#xff0c; 这是一个简单的完全可用的演示。 它包含三个独立的独立骆驼路线&#xff1a; 工作流生产者允许我们与工作流进…

【渝粤题库】陕西师范大学200401 初等代数研究 作业(专升本)

《初等代数研究》作业 一。填空题 1&#xff0e;第一数学归纳法的内容是____________. 2&#xff0e;函数的值域是_________. 3&#xff0e;函数的定义域是__________. 4&#xff0e;函数在内的反函数是 . 5&#xff0e;模的剩余类具有的性质是&#xff08;至少写出两条&#x…

js结合css3,使用JS和CSS3实现的旗帜飘扬动画

CSS语言&#xff1a;CSSSCSS确定body {padding: 0px;margin: 0px;background-color: black;text-align: center;position: absolute;top: 0px;bottom: 0px;left: 0px;right: 0px;overflow: hidden;}#canvas {position: relative;padding: 0px;height: 320px;width: 480px;margi…

【渝粤题库】陕西师范大学200991教育统计学作业(高起本)

《教育统计学》作业&#xff08;教育学&#xff09; 一、名词解释 分层抽样描述统计集中量统计表总体和样本二列相关参数小概率事件中位数统计量和参数回归分析相关关系 二、填空题 1.从变化方向上看&#xff0c;两个变量之间的相关类型有正相关、 、 。 2.教育统计资料的来源…