环境
jdk:graalvm-ee-java11-22.1.0
idea:ideaIC-2022.1.3
maven:idea 自带(修改为阿里镜像)
idea 插件
Quarkus Tools 夸克官网推荐
Quarkus Run Configs 第三方、用于创建一个可以直接运行与debug的按钮。
依赖
后端需要的jackson、hibernate、数据库驱动类、测试类。以下是pom文件
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.acme</groupId>
<artifactId>code-with-quarkus</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<maven.compiler.release>11</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>2.11.1.Final</quarkus.platform.version>
<skipITs>true</skipITs>
<surefire-plugin.version>3.0.0-M7</surefire-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>${quarkus.platform.artifact-id}</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<!--web框架-->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive</artifactId>
</dependency>
<!--测试框架-->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<!-- JDBC库 -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-agroal</artifactId>
</dependency>
<!--测试框架用于简化rest接口测试代码的书写 -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<activation>
<property>
<name>native</name>
</property>
</activation>
<properties>
<skipITs>false</skipITs>
<quarkus.package.type>native</quarkus.package.type>
</properties>
</profile>
</profiles>
</project>
创建run debug按钮
写接口
获取配置文件信息
以下注解与spring中的@Value功能一样,如果配置文件中缺少配置项会报错。注解也提供了默认值设置。默认情况读取的配置文件是application.properties。
@ConfigProperty
@ConfigProperty(name = "greeting.message")
String message;
多配置绑定
@ConfigProperties
@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {
private String message;
private String suffix = "!";
private Optional<String> name;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public Optional<String> getName() {
return name;
}
public void setName(Optional<String> name) {
this.name = name;
}
}
使用时注入即可
rest接口 注解
@Path("/hello") 定义url路径,类、或方法注解
@Produces(MediaType.APPLICATION_JSON) 返回json格式数据,类、或方法注解
@Consumes(MediaType.APPLICATION_JSON) 接收json数据,类、或方法注解
@GET get请求
@POST post请求
@PUT put请求
@DELETE delete请求
bean注册
@ApplicationScoped 可以理解为Spring的 @Component
依赖注入
@Inject 可以理解为Spring的@Autowired、@Resource
@Alternative 表示实现类可供选择
@Priority(1001) 实现类的优先级 类注解
@Named 按名称注入实现类
多个实现类 注入
@Named 使用注解为实现类设置名称 类注解
@Alternative 表示实现类可供选择
@Priority(1001) 实现类的优先级 类注解
注入多个 同Spring 中map 注入多个 可以使用Instance serlect动态获取需要的实现类。
@Path("/hello")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ExampleResource {
@Inject
Instance<MyEntityService> instance;
@GET
public MyEntity hello() {
return instance.select(MyEntityServiceImpl.class).get().get();
}
}
web接口入参数
使用@RestQuery 指定从Query中获取参数,截图中有从其他注解可以从其他域中获取数据。
@GET
public MyEntity hello(@RestQuery String a) {}
事务
事务与spring中一致
@Transactional
你也可以编程检查事务是否标为回滚。 可以注入 TransactionManager
干这个.
日志
Log.info("usename:"+usenam);
CRUD 数据库增删改查的几个方式
- 实体类继承 PanacheEntityBase
- 实体类继承 PanacheEntity
- 实现一个 PanacheRepository接口
- 注入EntityManager类,使用EntityManager进行CRUD
最推荐实体类继承 PanacheEntityBase
- 对比PanacheEntity,PanacheEntityBase id的类型可以自定义,而PanacheEntity,id必须是Long类型。很多时候有序的id会带来很多问题。(如多数据源需要合并数据,数据库需要更换时)。
- 对比PanacheRepository,无需单独PanacheRepository的实现类。很多时候PanacheRepository只是实现了下,并没有用到自定义的HQL。所以这个层级基本属于无意义的,不如将其向实体类合并。让操作回归类中。
- 对比EntityManager,操作更直观。
Hibernate 对象不同生命周期状态
个人理解,hibernate代理了与数据库的会话,并对程序提供了代理后的会话实例。
当某个对象被save到会话(数据由瞬时态变更为持久态),即对象被被会话实例引用(会话实例有指针指向这个对象)。这时修改对象,不会改变指针。当事务提交时会把会话实例中的对象进行数据库的信息变更。
当会话实例执行提交操作后,(指针移除),对象会被垃圾回收。此时到游离状态。游离为指针消除后的对象。瞬时为指针前的状态。
删除态好理解。
打包部署
这里使用docker native images 进行打包环境的构建,并进行打包。
使用以下命令进行项目的编译。编译后的程序只能在容器中运行。(打包环境需要docker、mvn)
mvn clean package -Pnative -Dquarkus.native.container-build=true
项目根目录 执行以下命令打包运行进行(一定用cmd运行,idea都是ps运行的会失败)
docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/code-with-quarkus .
后面就是比较基础的docker run 容器启动了 。可以看出容器启动的确实快。
VSCODE 运行,调试
测试发现老版本IDEA对quarkus支持不好会导致项目依赖拉取失败等问题。所以提供一个vscode的方式。
插件
- JAVA插件Extension Pack for Java。提供java语法支持,补齐,maven等功能。
- quarkus 红帽插件。提供quarkus部分支持。
vscode设置
项目引入后会自动创建.vscode目录
launch.json中"configurations"添加以下设置(添加代码启动和调试配置):
{
"command": "mvn quarkus:dev ",
"name": "启动 quarkus 程序",
"request": "launch",
"type": "node-terminal"
}
{
"preLaunchTask": "quarkus:dev",
"type": "java",
"request": "attach",
"hostName": "localhost",
"name": "调试 Quarkus 程序",
"port": 5005
}
启动/调试
上述配置完成后。可以在这些位置看到运行和调试按钮。↓
后续需要补齐的
- 如何集成到nacos中。
- 可复用
- 配置可读
- 项目配置可修改
- 数据库操作。
- 多数据源切换
- 多类数据库可迁移
- saas如何在sql中添加上字段与配置
- 打包问题。
- 如何自动化
- 如何根据生产环境构建不同的runder
- 项目整体架构中的日志问题
- 包括统一的异常处理如何进行。
- 接口日志如何设计。
- 项目整体架构中的接口权限问题。
- 接口本身是否有权限。
- sql中的数据权限如何控制。是否可以参考mybatis-plus 分页的实现方式。