20、从 Quarkus 提供 React 应用服务及部署到 Kubernetes

从 Quarkus 提供 React 应用服务及部署到 Kubernetes

1. 配置 Maven 构建以包含前端资源

在集成 React 前端和 Quarkus 后端时,我们需要配置 Maven 构建来包含前端文件。其中一段代码展示了第二次执行的配置,它会运行 npm run build 来执行前端项目的构建和文件生成:

                </workingDirectory>
              <executable>npm</executable>
              <arguments>
                <argument>run</argument>
                <argument>build</argument>
              </arguments>
            </configuration>
          </execution>
        </executions>

这个执行的配置与 npm - install 类似,但会执行 npm run build 。需要注意的是,每个执行项的 execution id 是唯一的,Exec Maven Plugin 会按照 pom.xml 文件中定义的顺序执行每个具有唯一 id 的项。

2. Quarkus Quinoa 扩展

Quarkus Quinoa 是一个正在开发中的 Quarkus 扩展,它可以以一种既定的方式帮助我们自动化完成本章涉及的一些任务。该扩展旨在简化单页应用(SPA)的开发和服务,同时与 Quarkus 应用集成。你可以在 Quarkus Quinoa 文档 中了解更多信息。

3. 创建 HTTP 资源以从 Quarkus 提供 React 应用服务

将 Quarkus 后端与 React SPA 前端集成的关键部分是让 Quarkus 后端能够提供 React SPA 前端文件。我们通过创建一个名为 GatewayResource 的类来实现额外的 HTTP 端点:

@Path("/")
public class GatewayResource {
    private static final String FALLBACK_RESOURCE =
  "/frontend/index.html";
    @GET
    @Path("/{fileName:.+}")
    public RestResponse<InputStream> getFrontendStaticFile
    (@PathParam("fileName") String fileName) throws IOException {
      final InputStream requestedFileStream = GatewayResource.
        class.getResourceAsStream("/frontend/" + fileName);
      final InputStream inputStream;
      inputStream = Objects.requireNonNullElseGet
        (requestedFileStream, () ->
        GatewayResource.class.getResourceAsStream
          (FALLBACK_RESOURCE));
      return RestResponse.ResponseBuilder
        .ok(inputStream)
        .cacheControl(CacheControl.valueOf("max - age=900"))
        .type(URLConnection.guessContentTypeFromStream
          (inputStream))
        .build();
    }

    @GET
    @Path("/")
    public RestResponse<InputStream> getFrontendRoot() throws 
    IOException {
      return getFrontendStaticFile("index.html");
    }
}
  • @Path("/") 注解将该类配置为在根路径下暴露其定义的所有端点,这会覆盖静态资源的默认设置。
  • getFrontendStaticFile 方法实现了网关的核心逻辑。它尝试查找指定文件名或路径的前端资源,如果找到则将其流式传输给用户;如果未找到,则流式传输 index.html 文件。在返回语句中,我们构建响应,包括 15 分钟的缓存配置和文件的 MIME 类型。
  • getFrontendRoot 方法配置为响应应用根路径的 HTTP GET 请求,它调用 getFrontendStaticFile 方法并传入 "index.html" 参数。
4. 运行应用程序

在之前的章节中,我们通常通过启动两个进程( ./mvnw quarkus:dev npm start )以开发模式运行应用程序。现在,我们可以将应用程序作为单个组件运行:
1. 启动 PostgreSQL 数据库 :如果本地环境中没有 PostgreSQL 实例,可以使用 Docker 容器创建一个:

docker run --rm --name postgresql -p 5432:5432 -e POSTGRES_PASSWORD=pgpass -d postgres
  1. 构建应用程序 :执行以下命令构建包含前端的应用程序:
./mvnw -Pfrontend clean package
  1. 运行应用程序
java -Dquarkus.datasource.username=postgres -Dquarkus.datasource.password=pgpass -Dquarkus.datasource.reactive.url=postgresql://localhost:5432/postgres -Dquarkus.hibernate - orm.database.generation=create -jar target/quarkus - app/quarkus - run.jar

运行后,我们可以在浏览器中访问 http://localhost:8080 ,浏览器会自动重定向到登录页面,使用管理员凭据( admin/quarkus )登录后,应用程序的所有功能都应正常工作。

5. 配置原生构建

如果我们想将应用程序打包为原生二进制文件以提高启动时间和内存占用,需要进行额外的配置:
- 包含前端资源 :我们创建一个 resources - config.json 文件来告诉 GraalVM 包含前端资源:

{
  "resources": [
    {
      "pattern": "^frontend.*"
    }
  ]
}

然后在 pom.xml 文件的原生配置文件中添加以下属性:

<quarkus.native.additional - build - args>
  -H:ResourceConfigurationFiles=resources - config.json,
</quarkus.native.additional - build - args>
  • 修复 GatewayResource 以进行原生编译 :由于存在一个阻止 GraalVM 检测 GatewayResource 类中方法的 bug,我们使用 @RegisterForReflection 注解来解决:
@Path("/")
@RegisterForReflection
public class GatewayResource {
    // ...
}
6. 运行原生应用程序

要以原生模式运行应用程序,我们需要先编译和打包它:

./mvnw -Pfrontend,native clean package

构建完成后,原生应用程序二进制可执行文件将位于 target/reactive - 1.0.0 - SNAPSHOT - runner 。我们可以使用以下命令运行它:

./target/reactive - 1.0.0 - SNAPSHOT - runner -Dquarkus.datasource.username=postgres -Dquarkus.datasource.password=pgpass -Dquarkus.datasource.reactive.url=postgresql://localhost:5432/postgres -Dquarkus.hibernate - orm.database.generation=create

原生启动时间仅需几毫秒,相比 JVM 模式有了显著提升。在浏览器中访问 http://localhost:8080 ,使用管理员凭据登录后,应用程序的所有功能都应正常工作。

7. 部署应用程序到 Kubernetes

接下来,我们将学习如何将任务管理应用程序部署到 Kubernetes:
- 技术要求
- 最新的 Java JDK LTS 版本(编写时为 Java 17)。
- 最新的 Node.js LTS 版本(编写时为 16.15)。
- 主要步骤
1. 了解 Kubernetes 和容器 :学习 Kubernetes 和容器的主要特性,了解它们为何如此受欢迎。
2. 创建容器镜像 :为我们的应用程序创建容器镜像,并将其推送到外部容器注册表。
3. 创建集群配置清单 :创建所需的 Kubernetes 配置文件,以便部署容器化的应用程序。
4. 将任务管理器部署到 Kubernetes :将应用程序部署到 minikube Kubernetes 集群。

以下是整个流程的 mermaid 流程图:

graph LR
    A[配置 Maven 构建] --> B[Quarkus Quinoa 扩展]
    B --> C[创建 GatewayResource 类]
    C --> D[运行应用程序]
    D --> E[配置原生构建]
    E --> F[运行原生应用程序]
    F --> G[部署到 Kubernetes]

通过以上步骤,我们可以将 React 前端和 Quarkus 后端集成,以单个组件的形式部署和分发应用程序,并进一步将其部署到 Kubernetes 集群。

从 Quarkus 提供 React 应用服务及部署到 Kubernetes

8. 什么是 Kubernetes

Kubernetes 是一个开源的容器编排平台,它可以自动化应用程序的部署、扩展和管理。以下是 Kubernetes 的一些主要特性:
| 特性 | 描述 |
| ---- | ---- |
| 自动化部署 | 可以根据配置文件自动部署应用程序的容器。 |
| 自动扩展 | 根据应用程序的负载自动调整容器的数量。 |
| 自我修复 | 如果容器出现故障,Kubernetes 会自动重启或替换它们。 |
| 服务发现 | 可以自动为应用程序的服务分配 DNS 名称,方便服务之间的通信。 |

9. 创建容器镜像

为了将应用程序部署到 Kubernetes,我们需要先创建一个容器镜像。以下是创建容器镜像的步骤:
1. 编写 Dockerfile :在项目根目录下创建一个 Dockerfile ,内容如下:

# 使用 Quarkus 基础镜像
FROM quay.io/quarkus/quarkus-micro-image:1.0
# 设置工作目录
WORKDIR /work/
# 复制应用程序可执行文件
COPY target/*-runner /work/application
# 设置文件权限
RUN chmod 775 /work
# 暴露端口
EXPOSE 8080
# 启动应用程序
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
  1. 构建容器镜像 :在项目根目录下执行以下命令构建容器镜像:
docker build -t my-task-manager:1.0 .
  1. 推送容器镜像到注册表 :将构建好的容器镜像推送到外部容器注册表,例如 Docker Hub:
docker login
docker tag my-task-manager:1.0 your-dockerhub-username/my-task-manager:1.0
docker push your-dockerhub-username/my-task-manager:1.0
10. 创建集群配置清单

接下来,我们需要创建 Kubernetes 配置文件来部署容器化的应用程序。以下是一些常见的 Kubernetes 配置文件示例:

Deployment 配置文件(deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: task-manager-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: task-manager
  template:
    metadata:
      labels:
        app: task-manager
    spec:
      containers:
      - name: task-manager-container
        image: your-dockerhub-username/my-task-manager:1.0
        ports:
        - containerPort: 8080

Service 配置文件(service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: task-manager-service
spec:
  selector:
    app: task-manager
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer
11. 将任务管理器部署到 Kubernetes

完成上述步骤后,我们可以将应用程序部署到 minikube Kubernetes 集群:
1. 启动 minikube

minikube start
  1. 应用配置文件
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
  1. 查看部署状态
kubectl get deployments
kubectl get services
  1. 访问应用程序
minikube service task-manager-service

以下是部署到 Kubernetes 的 mermaid 流程图:

graph LR
    A[了解 Kubernetes] --> B[创建容器镜像]
    B --> C[创建集群配置清单]
    C --> D[部署到 minikube 集群]
    D --> E[访问应用程序]
总结

通过本文,我们学习了如何将 React 前端和 Quarkus 后端集成,配置 Maven 构建以包含前端资源,实现从 Quarkus 提供 React 应用服务,以及将应用程序打包为原生二进制文件。此外,我们还详细介绍了将应用程序部署到 Kubernetes 的步骤,包括了解 Kubernetes 的特性、创建容器镜像、编写集群配置清单和部署到 minikube 集群。通过这些步骤,我们可以将应用程序以单个组件的形式部署和分发,并利用 Kubernetes 的强大功能进行自动化管理和扩展。

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值