首页 > 其他分享 >Quarkus框架学习

Quarkus框架学习

时间:2022-10-18 14:34:05浏览次数:74  
标签:name 框架 学习 String Quarkus io 注解 public quarkus

环境

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按钮

写接口

获取配置文件信息

Quarkus - 配置应用程序

以下注解与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 数据库增删改查的几个方式

  1. 实体类继承 PanacheEntityBase
  2. 实体类继承 PanacheEntity
  3. 实现一个 PanacheRepository接口
  4. 注入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的方式。

插件

  1. JAVA插件Extension Pack for Java。提供java语法支持,补齐,maven等功能。
  2. 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
        }

启动/调试

上述配置完成后。可以在这些位置看到运行和调试按钮。↓

后续需要补齐的

  1. 如何集成到nacos中。
    • 可复用
    • 配置可读
    • 项目配置可修改
  2. 数据库操作。
    • 多数据源切换
    • 多类数据库可迁移
    • saas如何在sql中添加上字段与配置
  3. 打包问题。
    • 如何自动化
    • 如何根据生产环境构建不同的runder
  4. 项目整体架构中的日志问题
    • 包括统一的异常处理如何进行。
    • 接口日志如何设计。
  5. 项目整体架构中的接口权限问题。
    • 接口本身是否有权限。
    • sql中的数据权限如何控制。是否可以参考mybatis-plus 分页的实现方式。

标签:name,框架,学习,String,Quarkus,io,注解,public,quarkus
From: https://www.cnblogs.com/bullbat/p/16802430.html

相关文章