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

Quarkus初体验

作者头像
是小张啊喂
发布2021-08-09 17:42:24
1.3K0
发布2021-08-09 17:42:24
举报
文章被收录于专栏:软件软件

什么是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
复制
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
复制
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
复制
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
复制
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
复制
$ 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
复制
$ 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
复制
@ApplicationScoped
public class GreetingService {
    public String greeting(String name) {
        return "hello " + name;
    }
}
代码语言:javascript
复制
 @Inject
GreetingService service;

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

处理流

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

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

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

代码语言:javascript
复制
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
复制
@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
复制
$ curl http://localhost:8080/hello/greeting/3/neo
[
    "hello shaojie - 0",
    "hello shaojie - 1",
    "hello shaojie - 2"
]

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

代码语言:javascript
复制
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>

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

代码语言:javascript
复制
@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
复制
$ 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Quarkus?
    • 先决条件
    • 构建项目
      • 对于Linux和MacOS用户
        • 对于Windows用户
          • 方式一:
          • 方式二:
      • hello world
      • 启动
      • 使用注射
      • 处理流
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档