前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Quarkus初体验

Quarkus初体验

作者头像
是小张啊喂
发布于 2021-08-09 09:42:24
发布于 2021-08-09 09:42:24
1.4K00
代码可运行
举报
文章被收录于专栏:软件软件
运行总次数:0
代码可运行

什么是Quarkus?

Quarkus是为GraalVMHotSpot量身定制的Kubernetes Native Java框架,由最佳的Java库和标准精心打造而成。Quarkus的目标是使Java成为Kubernetes和无服务器环境中的领先平台,同时为开发人员提供统一的反应式和命令式编程模型,以优化地满足更广泛的分布式应用程序架构。

官方地址:https://quarkus.io/

先决条件

要完成本指南,您需要:

  • 少于15分钟
  • 一个IDE
  • JAVA_HOME正确配置JDK 811+
  • Apache Maven 3.6.2以上

构建项目

创建新的Quarkus项目的最简单方法是打开一个终端并运行以下命令:

对于LinuxMacOS用户
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn io.quarkus:quarkus-maven-plugin:1.10.5.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.getting.started.GreetingResource" \
    -Dpath="/hello"
cd getting-started
对于Windows用户
  • 如果使用cmd,(请不要使用反斜杠\
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn io.quarkus:quarkus-maven-plugin:1.10.5.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=getting-started -DclassName="org.acme.getting.started.GreetingResource" -Dpath="/hello"
  • 如果使用Powershell,则将-D参数用双引号引起来
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn io.quarkus:quarkus-maven-plugin:1.10.5.Final:create "-DprojectGroupId=org.acme" "-DprojectArtifactId=getting-started" "-DclassName=org.acme.getting.started.GreetingResource" "-Dpath=/hello"

它在中生成以下内容 ./getting-started

  • Maven结构
  • org.acme.getting.started.GreetingResource公开的资源/hello
  • 相关的单元测试
  • http://localhost:8080启动应用程序后可访问的登录页面
  • 和模式中的示例Dockerfile文件native、jvm、src/main/docker
  • 应用程序配置文件

生成后,查看pom.xml。您将找到Quarkus BOM的导入,从而可以忽略不同Quarkus依赖项上的版本。此外,您可以看到quarkus-maven-plugin负责应用程序打包的人员,还提供了开发模式。

hello world

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.acme.getting.started;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello world";
    }
}

启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ mvn compile quarkus:dev

[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< org.acme:getting-started >----------------------
[INFO] Building getting-started 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- quarkus-maven-plugin:1.10.5.Final:dev (default-cli) @ getting-started ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\work\getting-started\target\classes
Listening for transport dt_socket at address: 5005
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2021-01-15 23:00:30,380 WARN  [io.qua.dep.QuarkusAugmentor] (main) Using Java versions older than 11 to build Quarkus applications is deprecated and will be disallowed in a future release!
2021-01-15 23:00:31,342 INFO  [io.quarkus] (Quarkus Main Thread) getting-started 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.10.5.Final) started in 1.017s. Listening on: http://localhost:8080
2021-01-15 23:00:31,343 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2021-01-15 23:00:31,343 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ curl -w "\n" http://localhost:8080/hello
hello

使用注射

Quarkus中的依赖注入基于ArC,它是为Quarkus架构量身定制的基于CDI的依赖注入解决方案。如果您不熟悉CDI,建议您阅读CDI简介指南。

Quarkus仅实现CDI功能的一个子集,并具有非标准功能和特定的APIS,您可以在Contexts and Dependency Injection指南中了解有关它的更多信息。

ArC作为的依赖项,quarkus-resteasy因此您已经很方便了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApplicationScoped
public class GreetingService {
    public String greeting(String name) {
        return "hello " + name;
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Inject
GreetingService service;

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/greeting/{name}")
public String greeting(@PathParam String name) {
    return service.greeting(name);
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -w "\n" http://localhost:8080/hello/greeting/shaojie
hello shaojie

处理流

确保io.quarkus:quarkus-resteasy-mutiny存在对RESTEasy扩展名()的Mutiny支持,需要添加io.quarkus:quarkus-resteasy-mutiny依赖,官方提供了两种添加依赖的方式

方式一:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn io.quarkus:quarkus-maven-plugin:1.10.5.Final:add-extensions \
    -Dextensions="io.quarkus:quarkus-resteasy-mutiny"
方式二:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-mutiny</artifactId>
    </dependency>

最简单的生成定期的问候消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Multi<String> greetings(int count, String name) {
  return Multi.createFrom().ticks().every(Duration.ofSeconds(1))
        .onItem().transform(n -> String.format("hello %s - %d", name, n))
        .transform().byTakingFirstItems(count);
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/greeting/{count}/{name}")
public Multi<String> greetings(@PathParam int count, @PathParam String name) {
  return service.greetings(count, name);
}

该端点将项目作为JSON数组流式传输到客户端。消息的名称和数量使用路径参数进行参数化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ curl http://localhost:8080/hello/greeting/3/neo
[
    "hello shaojie - 0",
    "hello shaojie - 1",
    "hello shaojie - 2"
]

这里有一个小坑,官方没有提供完整的依赖,因为缺少依赖,所以这个请求并不能拿到当前的json返回值,需要添加一个依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>

还可以通过返回来生成服务器发送的事件响应Multi

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
@SseElementType(MediaType.TEXT_PLAIN)
@Path("/stream/{count}/{name}")
public Multi<String> greetingsAsStream(@PathParam int count, @PathParam String name) {
    return service.greetings(count, name);
}

@SseElementType指示每个事件类型的注释。正如@Produces注释所定义的那样SERVER_SENT_EVENTSJAX-RS需要它知道每个(嵌套的)事件的内容类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ curl -N http://localhost:8080/hello/stream/3/shaojie
data: hello shaojie - 0

data: hello shaojie - 1

data: hello shaojie - 2

只是简单的了解一下,感觉还可以,后面深入去了解一下Quarkus

第一眼看上去竟然不知道怎么读的,翻译也翻译不出来,然后网上有一段介绍是:

红帽公司中间件团队在3月7日正式发布了Quarkus项目。 Quark(夸克)是物理学名词,可以看成是最小粒子,如元素周期表序数为1的氢原子,含有一个质子,也是由3个上下夸克组成的。 所以Quarkus这个名称,应该有微小服务的含义。

说不出来的奇怪,不深究这个,反正英文水平一般,就上面的例子而言,有些地方的语法有点蹩脚,但是不知道是不是因为还不了解的原因,线了解一下,防止后面看不懂。

简单了解,有错误或者不对的地方请指正,谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Quarkus学习一 - getting-started
从效果上来看SpringBoot3.0和Quarkus要做的事情是相同的,但是SpringBoot3.0毕竟会有很多历史包袱,很多标准规范在Spring中是通过适配的方式来实现的,
eeaters
2022/06/14
1K0
Quarkus学习一 - getting-started
Quarkus操作PostgreSQL
Quarkus使用Mutiny模型提供了许多反应API。在本节中,我们将了解如何使用反应式PostgreSQL驱动程序以非阻塞和反应式的方式与数据库交互。
是小张啊喂
2021/08/09
1.4K0
云原生时代高性能Java框架—Quarkus(一)
Quarkus 是一个为 Java 虚拟机(JVM)和原生编译而设计的全堆栈 Kubernetes 原生 Java 框架,用于专门针对容器优化 Java,并使其成为无服务器、云和 Kubernetes 环境的高效平台。
东溪陈姓少年
2020/08/06
6.5K0
一款云原生时代的高性能 Java 框架
Quarkus 是一个为 Java 虚拟机(OpenJDK HotSpot)和原生编译而设计的全堆栈 Kubernetes 原生 Java 框架,用于专门针对容器优化 Java,并使其成为无服务器、云和 Kubernetes 环境的高效平台。
永恒君
2023/10/21
4910
一款云原生时代的高性能 Java 框架
quarkus实战之二:应用的创建、构建、部署
备注:我的mac和ubuntu上的IDEA都没见到这个选项,难道我装了两个假的IDEA?
程序员欣宸
2022/04/13
2.1K0
quarkus实战之二:应用的创建、构建、部署
Quarkus 云原生java开发框架1: hello world
既然是一个 java 应用,那应该是无需什么准备的,jdk,maven 这些都有了。
谢正伟
2020/05/22
1.5K0
quarkus实战之四:远程热部署
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus实战》系列的第四篇,如标题所示,今天的任务是完成远程热部署实战 作为一名Java程序员,以下场景相信您很熟悉: 在本地电脑上:用IDEA写代码,编译构建成jar或者docker镜像 在服务器上:运行jar或者docker镜像 遇到问题时:通过热部署,使本地的改动立即在服务器上生效,这一切都是自动的,无需打包部署等操作 就是下图这
程序员欣宸
2022/04/13
6040
quarkus实战之四:远程热部署
Quarkus入门之创建项目搭建debug环境(2)
在学习一个新的框架技术前,肯定要先来一套hello word,搭建基本的运行环境和调试环境。今天来创建一个Quarkus的应用
kl博主
2023/11/18
2780
Quarkus入门之创建项目搭建debug环境(2)
quarkus实战之八:profile
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus实战》系列的第八篇,经过前面的学习,咱们对配置有了足够了解,但问题也随之而来:如何让应用以最小的改动同时运行在不同环境(如本地、测试、生产等) 举个例子,下面是个简化版配置文件,有两个配置项,第一个固定不变,第二个随环境变化各不相同: # 这个配置信息在各个环境中都是相同的 greeting.message=hello # 这个配
程序员欣宸
2022/04/13
8030
quarkus实战之八:profile
基于 Stork 和 Quarkus 扩展 Kubernetes 服务发现
在传统的单体架构中,应用程序已经通过静态主机名、IP 地址和端口知道后端服务的存在位置。IT运维团队为服务可靠性和系统稳定性维护静态配置。自从微服务开始在分布式网络系统中运行以来,其维护发生了显著变化。之所以发生这种变化,是因为微服务需要与多个后端服务进行通信,以提高负载均衡和服务弹性。
Luga Lee
2022/04/20
2.3K0
基于 Stork 和 Quarkus 扩展 Kubernetes 服务发现
《Quarkus实战》总结
使用io.quarkus.vertx.http.runtime.filters.Filters,继承ContainerResponseFilter
老梁
2022/12/29
2.5K0
《Quarkus实战》总结
quarkus实战之六:配置
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus实战》系列的第六篇,咱们来掌握一个常用知识点:配置 如同SpringBoot中的application.properties文件,对一个quarkus应用来说,配置是其重要的组成部分,web端口、数据库这些重要信息都放在配置中,咱们在编码时也会将一些业务参数做成配置,而不是硬编码(hard code) 与配置有关的知识点不少,本文
程序员欣宸
2022/04/13
1.2K1
quarkus实战之六:配置
quarkus实战之七:使用配置
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus实战》系列的第七篇,前文讲述了如何在将配置信息传入quarkus应用,今天要练习的是如何使用这些配置信息 整篇文章由以下内容构成: 创建工程,作为演示使用配置项操作的代码 演示最基本的使用配置项操作 展示配置项不存时会导致什么问题 演示如何设置默认值,这样配置项不存在也不会出错 默认值是字符串,而实际的变量可以是多种类型,它们之间
程序员欣宸
2022/04/13
1.2K0
quarkus实战之七:使用配置
Spring Boot 快速迁移至 Quarkus
Quarkus 是一个目前非常火的 Java 应用开发框架,定位是轻量级的微服务框架。,Quarkus 提供了优秀的容器化整合能力,相较于传统开发框架(Spring Boot)有着更快的启动速度、更小的内存消耗、更短的服务响应。
冷冷
2021/01/21
1.7K0
quarkus实战之五:细说maven插件
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demo 本篇概览 本文是《quarkus实战》系列的第五篇,一起去熟悉quarkus的maven插件(就是下图红框中的那个plugin),用好它可以使我们更加得心应手的在项目中配置和控制quarkus 插件quarkus-maven-plugin提供了丰富的功能,它们都有对应的命令,执行mvn quarkus:xxx即可执行,其中xxx就是具体的命令,例如mvn qu
程序员欣宸
2022/04/13
1.6K0
quarkus实战之五:细说maven插件
支持JDK19虚拟线程的web框架,中篇:完整开发一个支持虚拟线程的quarkus应用
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是《支持JDK19虚拟线程的web框架》系列的中篇,前文咱们体验了有虚拟线程支持的web服务,经过测试,发现性能上它与其他两种常见web架构并无明显区别,既然如此,还有必要研究和学习吗? 当然有必要,而且还要通过实战更深入了解虚拟线程与常规线程的区别,在各大框架和库广泛支持虚拟线程之前,打好理论和实践基础,这才是本系列的目标 为了接下来的深入
程序员欣宸
2022/10/31
1.1K0
支持JDK19虚拟线程的web框架,中篇:完整开发一个支持虚拟线程的quarkus应用
quarkus依赖注入之一:创建bean
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于依赖注入 对一名java程序员来说,依赖注入应该是个熟悉的概念,简单的说就是:我要用XXX,但我不负责XXX的生产 以下代码来自spring官方,serve方法要使用MyComponent类的doWork方法,但是不负责MyComponent对象的实例化,只要用注解Autowired修饰成员变量myComponent,spring环境会负责为myCompon
程序员欣宸
2022/04/13
1.1K0
quarkus依赖注入之一:创建bean
quarkus依赖注入之七:生命周期回调
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇的知识点是bean的生命周期回调:在bean生命周期的不同阶段,都可以触发自定义代码的执行 触发自定义代码执行的具体方式,是用对应的注解去修饰要执行的方法,如下图所示: 有两种模式可以实现生命周期回调:拦截器模式和自定义模式,接下来通过编码依次学习 拦截器模式 《拦截器(Interceptor)》已详细介绍了quarkus拦截器的自定义和使用,
程序员欣宸
2022/04/13
6670
quarkus依赖注入之七:生命周期回调
云原生时代高性能Java框架—Quarkus(二)
上一篇文章主要介绍了Quarkus以及给Quarkus提供“神力”的Java虚拟机GraalVM,并演示了如何安装GraalVM以及Quarkus的初步用法。本文将主要指向Quarkus的“亮点”——本地化应用程序。
东溪陈姓少年
2020/08/06
1.3K0
如何借助 Quarkus 和 MicroProfile 实现微服务
作者 | Alex Soto 译者 | 张卫滨 策划 | 丁晓昀   为何需要微服务特性? 在微服务架构中,应用程序是由多个相互连接的服务组成的,这些服务协同工作以实现所需的业务功能。 所以,一个典型的企业级微服务架构如下所示: 最初,我们可能认为使用微服务架构实现一个应用程序是很容易的事情。但是,要恰当地完成这一点并不容易,因为我们会面临一些新的挑战,而这些挑战是单体架构所未曾遇到的。举例来讲,这样的挑战包括容错、服务发现、扩展性、日志和跟踪等。 为了应对这些挑战,每个微服务都需要实现在 R
深度学习与Python
2023/04/01
1.9K0
如何借助 Quarkus 和 MicroProfile 实现微服务
相关推荐
Quarkus学习一 - getting-started
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档