使用Okta Spring Boot Starter的Spring Native的教程

293 阅读3分钟

2020年秋天,Spring团队发布了一个新的实验性Spring Native项目,让Spring开发者看到了加快启动时间的希望。Spring Native是关于将你的Spring应用程序转换为本地可执行文件。它利用GraalVM来实现这一目标。这个公告是巨大的,因为Micronaut和Quarkus这两个新的孩子在默认情况下都会产生本地可执行文件。

当我第一次听说Spring Native时,我真的很兴奋。它的第一个版本(v0.8.3)是在2020年11月23日发布的,但我是在2020年9月开始玩它的,可能是因为SpringOne。我怎么知道这个?因为那是我第一次尝试它,并为Okta Spring Boot启动器输入一个问题。在2020年的最后几周,我能够用Spring Security的OAuth依赖项(而不是Okta启动器)把事情做好。

使用Spring Native的分支

根据VMWare Tanzu最近发布的Spring 2021报告,很多人都知道Spring Native,但现在还很早。

今年夏天早些时候,我写了一篇关于如何用Micronaut、Quarkus和Spring Boot构建原生Java应用的文章,其中包括我的学习心得。大约在同一时间,我想:"如果Okta的Spring Boot启动器能与Spring Native一起使用,那肯定会很好。"

为了解决这个问题,我与Brian DemersJosh Long安排了一个Twitch流媒体。我们花了90多分钟来解决这个问题。你可以在下面的视频中看到我们的挣扎、合作和最终的喜悦。我在YouTube上的视频描述中添加了详细的目录,所以如果你喜欢,你可以跳过去。

这个流媒体最初在2021年6月22日播出。从那时起,已经有几个Spring Boot版本和几个Spring Native版本。不要忘了,还有一个SpringOne!

Okta Spring Boot Starter v2.1.1支持Spring Native!

今天,我很高兴地宣布,我们已经把学到的东西加入到Okta Spring Boot v2.1.1中;现在,只需要几行字就可以为使用Okta的Spring Boot应用添加本地支持。

import org.springframework.nativex.hint.NativeHint;
@NativeHint(options = "--enable-https")

或者,如果你喜欢一个完整的例子:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.nativex.hint.NativeHint;

@NativeHint(options = "--enable-https")
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

如果你想看看如何将我之前提到的原生Java+Spring Boot例子从Spring Security OAuth迁移到Okta启动器上,请看@oktadev/native-java-examples#5

你也可以自己用Okta CLI试试。安装它,并跟随下面的步骤,快速了解Okta + Spring Native的例子。

创建一个本地Spring Boot应用

要用Okta创建一个安全的Spring Boot应用,运行okta start spring-boot 。你需要验证你的电子邮件并设置一个密码作为其中的一部分。

如果你已经有一个Okta账户,你可以先运行okta login

这个命令将下载我们的Okta Spring Boot样本,在Okta上注册你的应用,并通过将你的Okta设置加入到src/main/resources/application.properties

按照上面的规定,在主Application 类中添加@NativeHint(options = "--enable-https")

接下来,编辑你的pom.xml ,将Spring Native版本和分类器添加到<properties> 部分。

<spring-native.version>0.10.3</spring-native.version>
<repackage.classifier/>

然后,用下面的XML替换<build> 部分。

<build>
    <defaultGoal>spring-boot:run</defaultGoal>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>${repackage.classifier}</classifier>
                <image>
                    <builder>paketobuildpacks/builder:tiny</builder>
                    <env>
                        <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
                    </env>
                </image>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-aot-maven-plugin</artifactId>
            <version>${spring-native.version}</version>
            <executions>
                <execution>
                    <id>test-generate</id>
                    <goals>
                        <goal>test-generate</goal>
                    </goals>
                </execution>
                <execution>
                    <id>generate</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<repositories>
    <repository>
        <id>spring-releases</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/release</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-releases</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/release</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

Giddyup!

./mvnw spring-boot:build-image
# wait until image builds
docker run -it -p8080:8080 okta-spring-boot-sample:0.0.1-SNAPSHOT

接下来,打开你的浏览器到 [http://localhost:8080](http://localhost:8080).你很可能会被直接登录,并看到你的名字印在屏幕上。