云原生quarkus框架项目实践 微服务框架

论坛 期权论坛     
选择匿名的用户   2021-5-23 02:02   19   0
<h2>一、quarkus 是什么?为什么要用quarkus</h2>
<p>quarkus是Redhat开源的云原生微服务框架,  相比较成熟的SpringCloud, 为什么要用quarkus?</p>
<p><strong>主要有以下几点原因:</strong></p>
<ol><li>Spring系列框架臃肿、复杂, 更像是一个全家桶. 而quarkus 简单、高效, 工具先进</li><li>启动速度, quarkus可以在5秒内启动, 而spring对于一个golang开发者来说, 这个速度直接无法忍受.</li><li>quarkus可以热编译, 无需手动编译和重启服务, 而Spring的热编译..</li><li>与其他工具集成, Spring集成了大部分的工具, 但你把DI换成guice试试, quarkus可以很方便的集成工具, 虽然框架本身包含的东西不多</li><li>quarkus不依赖tomcat或jetty, 可以编译为原生应用, 性能大幅提高</li><li>quarkus耦合低, 项目结构干净, 适合使用代码生成器.</li></ol>
<p> </p>
<h2>二、创建一个quarkus项目</h2>
<p>您可以使用maven或gradle来快速创建一个quarkus项目, 具体方法见quarkus网站, quarkus 只需要创建一个Resource类, 就可以启动服务.  零配置.  </p>
<p>另外:quarkus 对Kotlin支持极为友好,  本文将创建一个使用Kotlin&#43;Gradle的项目.  项目的配置文件: build.gradle.kts内容如下:</p>
<p><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9fafc5631ba1215db74dcb775c5144aa.png"></p>
<pre class="blockcode">plugins{
    java
    kotlin(&#34;jvm&#34;) version (&#34;1.3.72&#34;)
    kotlin(&#34;plugin.allopen&#34;) version (&#34;1.3.72&#34;)
    id(&#34;io.quarkus&#34;) version(&#34;1.4.2.Final&#34;)
}
allOpen {
    annotation(&#34;javax.enterprise.context.ApplicationScoped&#34;)
    annotation(&#34;javax.enterprise.context.RequestScoped&#34;)
}

repositories {
    maven(&#34;http://maven.aliyun.com/nexus/content/groups/public/&#34;)
    mavenCentral()
}

dependencies {
    implementation(kotlin(&#34;stdlib&#34;))
    implementation(&#34;io.quarkus:quarkus-kotlin:1.4.2.Final&#34;)
    implementation(&#34;io.quarkus:quarkus-resteasy:1.4.2.Final&#34;)
    implementation(&#34;io.quarkus:quarkus-resteasy-jsonb:1.4.2.Final&#34;)
    testImplementation(&#34;io.quarkus:quarkus-junit5:1.4.2.Final&#34;)
}
tasks.withType&lt;Test&gt; {
    useJUnitPlatform()
}
// 代码生成器
tasks.create(&#34;generate&#34;).doFirst {
    exec{
        workingDir(&#34;./tto&#34;)
        commandLine(&#34;sh&#34;,&#34;-c&#34;,&#34;./tto.sh&#34;)
    }
}
tasks.withType&lt;JavaCompile&gt;().configureEach {
    options.encoding&#61;&#34;utf-8&#34;
    options.compilerArgs &#61; listOf(&#34;-Xdoclint:none&#34;, &#34;-Xlint:none&#34;, &#34;-nowarn&#34;)
}
</pre>
<p><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9fafc5631ba1215db74dcb775c5144aa.png"></p>
<p> </p>
<h2>三、配置并启动项目</h2>
<p>您可以创建一个类, 并添加注解:&#64;ApplicationScoped , 作为系统启动类,  代码如下:</p>
<p><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9fafc5631ba1215db74dcb775c5144aa.png"></p>
<pre class="blockcode">&#64;ApplicationScoped
class Application {
    fun onStart(&#64;Observes event: StartupEvent?) {
        println(&#34;app started..&#34;)
    }
}</pre>
<p><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9fafc5631ba1215db74dcb775c5144aa.png"></p>
<p>这并不是必须的,  因为上文提到了,  可能需要集成其他工具. 接着我们创建一个服务如下:</p>
<p><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9fafc5631ba1215db74dcb775c5144aa.png"></p>
<pre class="blockcode">import javax.ws.rs.GET
import javax.ws.rs.Path
import javax.ws.rs.Produces
import javax.ws.rs.core.MediaType

&#64;Path(&#34;/hello&#34;)
class HelloResource {
    &#64;GET&#64;Path(&#34;/{name}&#34;)
    &#64;Produces(MediaType.APPLICATION_JSON)
    fun hello(&#64;PathParam(&#34;name&#34;) name:String): String {
        return &#34;hello ${name}&#34;
    }
}</pre>
<p><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9fafc5631ba1215db74dcb775c5144aa.png"></p>
<p>运行命令启动服务</p>
<pre class="blockcode">gradle quarkusDev</pre>
<p>访问服务</p>
<pre class="blockcode">curl http://localhost:8080/hello/jarrysix
&gt; hello jarrysix</pre>
<h2> </h2>
<h2>三、使用数据源</h2>
<p>通过上面的步骤, 我们已能运行quarkus, 接下来我们通过极为简单的方式来完成数据源的访问.</p>
<p>首先, 我们需要添加配置:</p>
<pre class="blockcode">quarkus.datasource.db-kind&#61;h2
quarkus.datasource.username&#61;username-default
quarkus.datasource.jdbc.url&#61;jdbc:h2:tcp://localhost/mem:default
quarkus.datasource.jdbc.min-size&#61;3
quarkus.datasource.jdbc.max-size&#61;13</pre>
<p>创建实体类</p>
<p><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-9fafc5631ba1215db74dcb775c5144aa.png"></p>
<pre class="blockcode">&#64;Entity
public class Gift {
    &#64;Id &#64;GeneratedValue(strategy &#61; GenerationType.SEQUENCE, generator&#61;&#34;giftSeq&#34;)
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id &#61; id;
    }

    private String name;
    public String get
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP