中小企业公共服务平台网站建设,怎么在服务器中安装WordPress,婚纱摄影网站排名,seo推广服务Quarkus初探 背景安装Quarkus安装Quarkus CLI 创建Quarkus项目运行Quarkus初探代码修改一下代码 数据持久化创建PanacheEntiry写入数据读取数据 Dev Service使用外部数据库区分dev和prod 构建native应用#xff08;依赖Graalvm#xff09; 背景
最早是在Infoq上了解到Quarku… Quarkus初探 背景安装Quarkus安装Quarkus CLI 创建Quarkus项目运行Quarkus初探代码修改一下代码 数据持久化创建PanacheEntiry写入数据读取数据 Dev Service使用外部数据库区分dev和prod 构建native应用依赖Graalvm 背景
最早是在Infoq上了解到Quarkus这个框架内部集成了Vertx对native-image有着非常好的支持启动速度非常快占用内存很小相较于Springboot,最近有时间就来体验一下。
安装Quarkus
Quarkus也是基于Java的微服务框架所以想要体验Quarkus需要满足以下条件
JDK 17配置配置好了JAVA_HOMEApache Maven 3.9.6docker或podman可选Quarkus CLI可选Graalvm可选用于构建Native应用
安装Quarkus CLI
Quarkus CLI中提供了很多命令可以帮助我们快速的创建、运行Quarkus项目。这两天体验下来Quarkus CLI应该是主要对mvn的各类命令进行了集成Quarkus CLI的命令相较于mvn来说更加便捷也是推荐大家安装体验一下。目前官方支持以下几种安装方式
JBang - for Linux, macOS and WindowsSDKMAN! - for Linux and macOSHomebrew - for Linux and macOSChocolatey - for WindowsScoop - for Windows
我目前这台机器是通过SDKMAN来管理JDK版本的这里选择了使用SDKMAN进行安装 sdk install quarkus 安装完成之后验证一下 quarkus --version 3.9.2 创建Quarkus项目
通过quarkus执行以下命令
quarkus create app org.acme:getting-started-dev-services \--extensionrest
cd getting-started-dev-services或者通过maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.9.2:create \-DprojectGroupIdorg.acme \-DprojectArtifactIdgetting-started-dev-services \-Dextensionsrest
cd getting-started-dev-services如果想要创建一个gradle项目可以追加以下参数 -DbuildToolgradle 或 -DbuildToolgradle-kotlin-dsl 对于使用windows的同学有以下两点需要注意:
如果使用cmd不要使用\分割命令所有命令都要放在同一行中如果使用PowerShell-D的参数需要使用双引号括起来e.g.-DprojectArtifactIdgetting-started-dev-services
运行Quarkus
quarkus devor
./mvnw quarkus:devor
./gradlew --consoleplain quarkusDev正常启动后可以看到如下信息
__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ , / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2024-04-10 11:22:05,350 INFO [io.quarkus] (Quarkus Main Thread) code-with-quarkus 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.9.2) started in 0.842s. Listening on: http://localhost:80802024-04-10 11:22:05,351 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
然后我们在浏览器里访问 http://localhost:8080/hello应该可以看到如下信息 Hello from Quarkus REST 初探代码
我们使用IDE打开刚刚创建的项目可以看到只有一个很简单的类GreetingResource
package org.acme;import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;Path(/hello)
public class GreetingResource {GETProduces(MediaType.TEXT_PLAIN)public String hello() {return Hello from Quarkus REST;}
}相交于Springboot来说这里不需要定义一个Application启动类再增加一个Controller一个简简单单的GreetingResource就完成了所有的功能这里使用到的注解也都是jakarta的标准注解。
修改一下代码
public String hello(RestQuery String name) {return Hello name;
}然后我们访问http://localhost:8080/hello?nameBloom 这时我们会看到这样一条消息: Hello Bloom. quarkus dev模式支持代码热部署在我们修改代码之后无需重启调试修改的时候会非常方便。
对应的我们修改一下单元测试 src/test/java/org/acme/GreetingResourceTest.java将 .body(is(“Hello from Quarkus REST”)); 修改为 .body(containsString(“Hello”)); 不然下次启动会报错quarkus默认启动时会先执行单元测试
数据持久化
在进行这一步之前建议把我们本地的容器服务启动(docker或podman)起来看看接下来会发生什么
创建PanacheEntiry quarkus extension add hibernate-orm-panache jdbc-postgresql 或者 ./mvnw quarkus:add-extension -Dextensions‘hibernate-orm-panache jdbc-postgresql’ 官方示例提供的是postgresql你也可以替换为mysql。 创建一个Greeting.java
import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;Entity
public class Greeting extends PanacheEntity {public String name;
}Panache是一个基于Hibernate的orm框架PanacheEntity类似于Spring-Data中的JpaRepository中提供了大量的方法方便我们进行CRUD的操作
写入数据
GET
Transactional
Produces(MediaType.TEXT_PLAIN)
public String hello(QueryParam(name) String name) {Greeting greeting new Greeting();greeting.name name;greeting.persist();return Hello name;
}这里只是一个示例在正式的代码中GET请求不应该向后端服务写入数据
读取数据
GET
Path(names)
Produces(MediaType.TEXT_PLAIN)
public String names() {ListGreeting greetings Greeting.listAll();String names greetings.stream().map(g- g.name).collect(Collectors.joining (, ));return Ive said hello to names;
}来试一下效果, 先访问 http://localhost:8080/hello?nameBloom, 再访问 http://localhost:8080/hello/names.
我们就能看到: “I’ve said hello to Bloom”.
Dev Service
进行到这里你肯定会有很多疑问我本地都没有PG数据库项目中也没有任何数据库相关的配置为什么没有报错这一切都是怎么发生的 这时你可以打开自己的Docker desktop或者使用docker ps的命令你就会发现有一个PG的数据库实例正在运行
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38c07eab6549 postgres:14 docker-entrypoint.s… About a minute ago Up About a minute 0.0.0.0:61089-5432/tcp kind_yalow
这一切都是Dev Service为我们做的由于我们添加了jdbc-postgresql的依赖Dev Service就为我们启动了一个postgresql的容器方便我们更加快速的进行项目搭建。
另外在dev模式下处于Dev Services管理的数据库Quarkus会使用drop-and-create的模式所以我们每次修改代码重启服务之后之前保存的数据都会丢失。在某些情况下这种模式会很不方便Quarkus也提供了一种机制来进行数据的初始化 我们可以创建一个sql文件src/main/resources/import.sql
INSERT INTO Greeting(id, name)
VALUES (nextval(Greeting_SEQ), Alice);
INSERT INTO Greeting(id, name)
VALUES (nextval(Greeting_SEQ), Bob);这样每次quarkus启动时都会将这些数据初始化进去
使用外部数据库
如果我们已经搭建好了一个数据库我们可以在src/main/resources/application.properties中增加如下配置
# configure your datasource
quarkus.datasource.db-kind postgresql
quarkus.datasource.username leopold
quarkus.datasource.password bloom
quarkus.datasource.jdbc.url jdbc:postgresql://localhost:5432/mydatabase区分dev和prod
如果你想在开发和测试环境中使用Dev Service在生产环境使用外包数据库可以通过一个%prod的前缀来区分
# configure your datasource
%prod.quarkus.datasource.db-kind postgresql
%prod.quarkus.datasource.username leopold
%prod.quarkus.datasource.password bloom
%prod.quarkus.datasource.jdbc.url jdbc:postgresql://localhost:5432/mydatabase构建native应用依赖Graalvm
Quarkus一大亮点是对native-image有着非常好的支持想要体验native-image需要先安装Graalvm你可以通过官网或者SDKMAN进行安装和配置。
quarkus build --native
./mvnw install -Dnative编译的过程会比较长编译完成之后会在target文件夹下生成一个getting-started-dev-services-1.0.0-SNAPSHOT-runner的可执行文件可以直接启动。
需要注意的是通过native构建出来的可执行程序会失去跨平台的特性因此在一个平台上构建出来的native-image往往无法在其他平台运行最好的方式是通过docker等容器进行部署。
目前Graalvm有一个实验性的功能在Linux平台来构建跨平台的应用具体可以参考 https://www.graalvm.org/jdk21/reference-manual/native-image/guides/build-static-executables/#prerequisites-and-preparation