使用 Spring Boot 和 GraalVM 实现原生(系列四)

举报
小云悠悠zZ 发表于 2023/01/30 15:54:34 2023/01/30
【摘要】 Spring不仅仅是HTTP端点。无数其他框架,包括Spring Batch,Spring Integration,Spring Security,Spring Cloud以及不断增长的其他框架,都提供了良好的Spring Native支持。让我们快速看一个 Spring 集成应用程序示例。

集成应用程序

Spring不仅仅是HTTP端点。无数其他框架,包括Spring Batch,Spring Integration,Spring Security,Spring Cloud以及不断增长的其他框架,都提供了良好的Spring Native支持。

让我们快速看一个 Spring 集成应用程序示例。Spring 集成是一个支持企业应用程序集成 (EAI) 的框架。Gregor Hohpe和Bobby Woolf的开创性著作《企业集成模式》为世界提供了集成模式的通用语言。Spring Integration给了它实现这些模式的抽象。

转到 Spring 初始化器,命名项目集成,选择 Java 17,添加 、 ,然后单击 。您需要手动将一个依赖项添加到您的:Spring Native,Spring IntegrationSpring WebGeneratepom.xml

<dependency>
  <groupId>org.springframework.integration</groupId>
  <artifactId>spring-integration-file</artifactId>
  <version>${spring-integration.version}</version>
</dependency>

更改以下代码:IntegrationApplication.java

package com.example.integration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.file.dsl.Files;
import org.springframework.integration.file.transformer.FileToStringTransformer;
import org.springframework.integration.transformer.GenericTransformer;

import java.io.File;

@SpringBootApplication
public class IntegrationApplication {

    @Bean
    IntegrationFlow integration(@Value("file://${user.home}/Desktop/integration") File root) {
        var in = new File(root, "in");
        var out = new File(root, "out");
        var inboundFileAdapter = Files
                .inboundAdapter(in)
                .autoCreateDirectory(true)
                .get();
        var outboundFileAdapter = Files
                .outboundAdapter(out)
                .autoCreateDirectory(true)
                .get();
        return IntegrationFlows //
                .from(inboundFileAdapter, spec -> spec.poller(pm -> pm.fixedRate(1000)))//
                .transform(new FileToStringTransformer())
                .transform((GenericTransformer<String, String>) source -> new StringBuilder(source)
                        .reverse()
                        .toString()
                        .trim())
                .handle(outboundFileAdapter)
                .get();
    }

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

这个应用程序很简单:它监视任何新文件的目录()。一旦看到任何内容,它就会创建一个副本,其内容反转并将其写到 .应用程序在 JRE 上在 0.429 秒内启动!这很好,但让我们看看将其转换为 GraalVM 本机可执行文件会给我们带来什么。$HOME/Desktop/integration/inString$HOME/Desktop/integration/out

mvn -Pnative -DskipTests clean package 

该应用程序在 55.643 秒内编译完成!它在 0.029 秒内启动 (),需要 35.5 兆字节的 RAM。不错!./target/integration

将应用程序投入生产

我们希望在某个时候将这些应用程序投入生产,而现在的生产是 Kubernetes。Kubernetes在容器方面工作。我们需要一个容器。Buildpacks 项目背后的核心概念是集中和重用将应用程序工件转换为容器的公式。您可以通过 pack CLI 使用 Buildpack,也可以通过 KPack 在 Kubernetes 集群中使用 Buildpack,或者通过 Spring Boot 构建插件使用。我们将使用最后一个选项,因为它只需要 Docker 桌面。请在此处查看 Docker 桌面。

mvn spring-boot:build-image 

此命令将在容器内生成本机可执行文件,因此你将在 Linux 容器中获取 Linux 本机二进制文件。然后,可以将 docker 标记和 docker 推送到所选的容器注册表。当我在 2022 年 1 月写这篇文章时,M<> Mac 上的 Docker 构建包仍然有点不稳定。但我相信这很快就会得到解决!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。