Angular TodoMVC with Spring boot backend, deploy to Kubernetes
本文指导您构建一个Spring Boot演示应用,并使用JBoss Web Server Operator将其部署到Kubernetes上。该应用使用TodoMVC Angular前端,并与Spring Boot后端集成。Todo实体使用JPA注解进行数据库映射。TodoController处理CRUD操作,TodoRepository扩展JpaRepository用于数据库交互。应用可以在本地运行,也可以使用Tomcat作为嵌入式服务器打包。部署过程包括构建Docker镜像、推送到仓库以及在OpenShift上部署。提供了H2和PostgreSQL数据库的配置细节。
应用架构
我们使用TodoMVC Angular应用。TodoMVC是一个项目,提供使用各种流行JavaScript框架实现的相同“Todo”应用。TodoMVC的目标是通过展示不同框架如何用相同功能解决相同问题,帮助开发人员比较和对比不同框架和库。在这个演示应用中,我们使用TodoMVC前端Angular示例。项目构建后复制到Java项目的/resources目录中,以保持在同一应用和根上下文中。
后端使用Spring Boot实现,这是一个旨在简化独立、生产级基于Spring的应用开发的框架。它通过在Spring Framework之上提供预配置模板和约定优于配置的方法,使应用设置和部署更加容易,配置最少。
该项目使用Spring Boot框架和Spring Boot Tomcat Starter。这是一个依赖项,您可以包含在Spring Boot项目中,以使用嵌入式Apache Tomcat服务器运行应用。这允许您将应用打包为包含Tomcat的自包含可执行JAR文件,使应用部署和运行更加容易,无需配置外部Web服务器。
完整应用源代码可在此处获取。
Todo实体
首先创建一个名为Todo的实体。这是我们希望将数据存储到后端数据库的方式。
Todo表示数据库中“待办事项”的实体。该类使用Jakarta Persistence(前身为Java Persistence API或JPA)注解将类映射到数据库表。
|
|
TODO控制器
TodoController处理与“Todo”项相关的HTTP请求。它利用多个Spring组件和注解来定义CRUD(创建、读取、更新、删除)操作的端点。
控制器定义以下结构:
@RestController
:标记此类为Spring MVC控制器,其中每个方法返回域对象而非视图。它结合了@Controller
和@ResponseBody
。@CrossOrigin
:为整个控制器启用跨源资源共享(CORS),允许来自不同源的请求。@RequestMapping("/api/todos")
:将HTTP请求映射到/api/todos
到此控制器。
|
|
获取所有Todos
将HTTP GET请求映射到此方法。它通过调用todoService.getAllTodos()
返回所有待办事项的列表。
|
|
按ID获取Todo
@GetMapping("/{id}")
:将带有路径变量id
的HTTP GET请求映射到此方法。它通过ID检索待办事项。
@PathVariable Long id
:将id
路径变量绑定到方法参数。
ResponseEntity
:用适当的HTTP状态码包装响应。如果找到待办事项,返回200 OK,否则返回404 Not Found。
|
|
创建Todo
要创建Todo,我们期望从前端收到带有JSON的请求。
@Transactional
:确保方法在事务内执行。
@PostMapping
:将HTTP POST请求映射到此方法。它创建一个新的待办事项。
@RequestBody Todo todo
:将请求体绑定到方法参数todo
。
|
|
更新Todo
@PutMapping("/{id}")
:将带有路径变量id
的HTTP PUT请求映射到此方法。它更新现有的待办事项。
@RequestBody Todo todoDetails
:将请求体绑定到方法参数todoDetails
。
ResponseEntity
:如果更新成功,返回200 OK,否则返回404 Not Found。
|
|
删除Todo
@DeleteMapping("/{id}")
:将带有路径变量id
的HTTP DELETE请求映射到此方法。它通过ID删除待办事项。
ResponseEntity<Void>
:如果删除成功,返回204 No Content。
|
|
Todo仓库
通过扩展JpaRepository
,TodoRepository
继承了多个执行常见数据库操作的方法,无需显式定义它们:
save(S entity)
:保存给定实体。findById(ID id)
:通过ID检索实体。findAll()
:检索所有实体。deleteById(ID id)
:通过ID删除实体。deleteAll()
:删除所有实体。
@Repository
注解表明该接口是Spring Data仓库。
|
|
本地运行应用
最后定义数据库配置。要运行后端数据库,或者您可以在application.properties
中取消注释H2数据库设置。(在这种情况下,确保注释掉PG属性)
|
|
要为后端启动PG数据库,我使用podman(容器运行时):
|
|
从源代码运行应用。
命令mvn spring-boot:run
用于使用Apache Maven运行Spring Boot应用。
mvn spring-boot:run
命令是一种方便的方式,可以直接从命令行启动Spring Boot应用,无需先将其打包为JAR或WAR文件。它通常在开发阶段用于快速测试和迭代应用。
|
|
构建镜像并推送到仓库
首先需要构建和打包源文件。
|
|
该命令由Maven构建生命周期的三个独立阶段组成:clean、compile和package。正如目标所述,命令完成后,应将WAR文件复制到target目录中。准备部署到JBoss Web Server(JWS)。
JWS Operator可以使用预构建的镜像,也可以从源代码派生一个。在此示例中,我们创建一个镜像并将其推送到quay.io。
首先简单介绍Dockerfile:
|
|
我们使用JBoss Web Server 6镜像。镜像使用OpenJDK版本17。
我们还将war文件复制到根目录,以便在/
上解析。
运行以下命令构建镜像:
|
|
podman build
:这是使用Podman构建容器镜像的主要命令。类似于Docker中的docker build
。–arch=x86_64
:这指定容器镜像的架构。x86_64
表示镜像应为64位x86架构构建。当您为不同架构构建镜像并需要明确指定目标架构时,这非常有用。例如,如果您在Apple Silicon如M系列上运行构建,这很有用。-t quay.io/sshaaf/todo-demo-jws:latest
:例如,-t
用于标签,其余部分是仓库名称/镜像。
构建完成后,将镜像推送到OpenShift集群可访问的仓库。Quay.io或DockerHub都可以被OpenShift集群访问,因为它们是公开托管的。
使用Operator在OpenShift上运行应用
首先,在部署应用之前需要部署数据库。
数据库
以下命令使用最新的PostgreSQL镜像在OpenShift中创建新的PostgreSQL数据库应用。它设置数据库用户名为jws
,密码为jws
,数据库名为todos
。应用命名为todos-database
。
|
|
oc new-app
:这是在OpenShift中创建新应用的主要命令。它帮助从源代码、模板或Docker镜像实例化新应用。-e POSTGRESQL_USER=jws
:此标志设置环境变量POSTGRESQL_USER
,值为jws
。在此上下文中,用于指定PostgreSQL数据库的用户名。-e POSTGRESQL_PASSWORD=jws
:类似于前一个标志,这设置另一个环境变量POSTGRESQL_PASSWORD
,值为jws
。这是PostgreSQL用户的密码。-e POSTGRESQL_DATABASE=todos
:这设置环境变量POSTGRESQL_DATABASE
,值为todos
,指定要创建的PostgreSQL数据库的名称。openshift/postgresql:latest
:这部分指定用于新应用的Docker镜像。openshift/postgresql:latest
表示应使用OpenShift仓库中最新版本的PostgreSQL镜像。–name=todos-database
:此选项为正在创建的新应用分配名称。在这种情况下,应用将命名为todos-database
。
Operator
有多种安装Operator的方法。Operator可通过OperatorHub在OpenShift控制台中搜索和安装。
创建新的Webserver实例
安装Operator后,可以使用以下CR安装应用。
|
|
apiVersion: web.servers.org/v1alpha1
:这指定资源的API版本。在这种情况下,它是web.servers.org/v1alpha1
,表明此资源是自定义API组web.servers.org
的一部分,版本为v1alpha1
。kind: WebServer
:这定义所描述资源的类型。此处是WebServer
。这可能是Kubernetes集群中CRD定义的自定义资源。metadata
:此部分包含资源的元数据。name: todo-demo-app
:这将资源名称设置为todo-demo-app
。namespace: test
:这指定资源将在test
命名空间中创建。
spec
:此部分定义资源的期望状态。webImage
:此嵌套部分可能涉及Web服务器的镜像设置。applicationImage: ‘quay.io/sshaaf/todo-demo-jws’
:这指定用于应用的Docker镜像。它指向quay.io/sshaaf/todo-demo-jws
,这是一个托管的镜像仓库(Quay.io)。
applicationName: jws-app
:这将应用名称设置为jws-app
。replicas: 2
:这指定要运行的应用副本(实例)的期望数量。在这种情况下,请求2个副本。
运行以下命令获取部署应用的路由:
|
|
输出示例:
|
|
您现在可以使用运行在JWS上的出色TODO应用,使用Spring Boot 3和AngularJS。
更多配置选项
replicas
:这指定要运行的应用副本(实例)的期望数量。useSessionClustering: true
:启用DNSping会话集群。- 通过Webhooks部署:JWS文档。
← 上一篇 下一篇 →
目录
- Todo实体
- TODO控制器
- 获取所有Todos
- 按ID获取Todo
- 创建Todo
- 更新Todo
- 删除Todo
- Todo仓库
- 本地运行应用
- 构建镜像并推送到仓库
- 使用Operator在OpenShift上运行应用
- 数据库
- Operator
- 创建新的Webserver实例
特色标签
administrator, ant, automation, build, cache, ci, command, computers, continous, design, design-patterns, docker, engineering, fedora, gof, how-to, howto, ibm, infinispan, integration, jacl, java, jdbc, jdk-21, jython, kubernetes, llm, migration, mq, openjdk, openshift, patterns, programming, quarkus, redhat, release, rhel, scm, scripting, singleton, singleton-pattern, software, software-development, svn, sysadmin, tips, tools, utils, websphere, wsadmin
版权所有 © Shaaf’s blog 2025