Cloud Native Spring in Action

目录

设计原则

15 Factor App

数据验证和错误处理

测试

使用 Junit 5 进行单元测试

使用 @SpringBootTest 进行集成测试

使用 @WebMvcTest 测试 REST Controller

使用 @JsonTest 测试 JSON 序列化

使用 @DataJdbcTest 和 Testcontainers 测试数据持久化

使用 Reactor 和 Testcontainers 测试 Reactive 应用

        使用 MockWebServer 测试 REST client

        使用 @DataR2dbcTest 和 Testcontainer 测试数据持久化

        使用 @WebfluxTest 测试 REST Controller

Testcontainers

数据持久化与数据管理

JDBC 审计

Flyway & Liquibase

Liquibase

安全

Spring Security & Spring Cloud API Gateway

OAuth2

JWT

OpenID Connect

KEYCLOAK

定义安全realm

OIDC 认证

CSRF

韧性

超时

重试

回退和错误处理

基于 Redis 的分布式会话管理

Kubernetes

Deployment

Service

ConfigMap & Secret

Ingress & Ingress Controller

Volumn & Persistence Volumn & Persistence Volumn Claim

Pod

Replicaset

配置管理

Kustomize

Helm

Argo & Jenkins


英文版:《Cloud Native Spring in Action》,Thomas Vitale 著

中文版:《云原生 Spring 实战》Spring Boot 与 Kubernetes 实践 

设计原则

15 Factor App

“15 Factor App”是在“12 Factor App”基础上发展而来,新增的三个要素分别是:

1. API First(API 优先):强调在应用程序开发中,优先设计和定义 API。这使得应用程序的各个模块或服务之间能够通过清晰、标准的 API 进行交互通信。遵循 API First 的原则,开发团队可以更好地实现软件的解耦,提高开发效率和系统的可维护性。并且在现代云原生应用中,通过 API 可以方便地与其他微服务或外部系统进行集成,提升了应用的灵活性和可扩展性。例如,使用 API 网关来管理和规范 API 的调用,遵循最佳的 REST API 实践,定义好请求、响应 payload、API 名称、安全等方面的规范。

2. Telemetry(遥测):包括应用性能管理、特定领域的遥测数据以及健康和系统日志等方面。对应用程序的运行状态、性能指标、资源使用情况等进行实时监测和收集,能够帮助开发团队和运维人员及时了解应用的运行状况,以便在出现问题时快速定位和解决。基于这些遥测数据,平台还可以进行自动扩缩容、自我修复以及向用户和运维人员发送警报等操作。通过机器学习等技术对遥测数据进行分析,还可以为企业的未来业务策略提供参考。

3. Authentication and Authorization(认证和授权):在现代应用中,安全是至关重要的。这一要素确保只有经过认证的用户和应用程序能够访问系统资源,并根据不同的用户角色和权限进行授权。例如,采用 API token、RBAC(基于角色的访问控制)、OAuth 等认证和授权机制,对 API 的请求和响应 payload 进行加密,在网络层面设置防火墙保护,保障数据库的安全以及采用多因素认证(MFA)等措施。

这三个新增要素适应了现代云原生应用的发展需求,使得应用程序在云环境中能够更加高效、可靠、安全地运行。

12 Factor App

https://12factor.net/

  • Codebase 基准代码
  • Dependencies 依赖管理
  • Config 配置
  • Backing Services 支撑服务
  • Build Release and Run 构建、发布和运行
  • Processes 无状态进程 
  • Port Binding 端口绑定
  • Concurrency 并发
  • Disposability 易处理
  • Dev/Prod Parity 环境对等
  • Logs 日志
  • Admin Processes 管理进程

数据验证和错误处理

spring-boot-starter-validation:@NotBlank、@NotNull、@Pattern、@Positive、@Valid 等。

测试

spring-boot-starter-tester:会将 JUnit 5、Mockito 和 AssertJ 的测试库导入项目。

使用 Junit 5 进行单元测试

使用 @SpringBootTest 进行集成测试

使用 @WebMvcTest 测试 REST Controller

使用 @JsonTest 测试 JSON 序列化

使用 @DataJdbcTest 和 Testcontainers 测试数据持久化

使用 Reactor 和 Testcontainers 测试 Reactive 应用

        使用 MockWebServer 测试 REST client
        使用 @DataR2dbcTest 和 Testcontainer 测试数据持久化
        使用 @WebfluxTest 测试 REST Controller

Testcontainers

Testcontainers是一个Java库,用于在测试中方便地管理容器。

主要功能

• 容器生命周期管理:可以轻松启动和停止容器。例如,在测试数据库交互时,能快速启动一个数据库容器(如MySQL、PostgreSQL),测试完成后自动停止它。这样避免了手动安装和配置数据库,使测试环境搭建更便捷。

• 支持多种容器类型:除了常见的数据库容器,还支持消息队列容器(如RabbitMQ、Kafka)、Web容器(如Tomcat、Jetty)等。如果测试的应用依赖于这些服务,就可以用对应的容器来提供真实的测试环境。

• 与测试框架集成:很好地集成了JUnit等流行的Java测试框架。在JUnit测试类中,可以通过简单的注解和方法调用就启动和使用容器。

使用示例

1. 添加依赖:在Maven项目的pom.xml文件中添加以下依赖:
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.18.3</version>
</dependency>
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>junit - jupiter</artifactId>
    <version>1.18.3</version>
</dependency>
2. 测试数据库交互(以MySQL为例)
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import static org.junit.jupiter.api.Assertions.assertTrue;

@Testcontainers
public class DatabaseTest {
    // 启动MySQL容器
    @Container
    public static MySQLContainer<?> mySQLContainer = new MySQLContainer<>("mysql:8.0")
          .withDatabaseName("test_database")
          .withUsername("test_user")
          .withPassword("test_password");
    @Test
    public void testDatabaseConnection() throws SQLException {
        // 获取容器的JDBC URL
        String jdbcUrl = mySQLContainer.getJdbcUrl();
        try (Connection connection = DriverManager.getConnection(jdbcUrl, "test_user", "test_password");
             Statement statement = connection.createStatement()) {
            // 执行一个简单的SQL查询
            statement.execute("CREATE TABLE IF NOT EXISTS test_table (id INT, name VARCHAR(255))");
            int result = statement.executeUpdate("INSERT INTO test_table (id, name) VALUES (1, 'test')");
            assertTrue(result > 0);
        }
    }
}
在这个示例中:

• 首先定义了一个MySQLContainer,它会在测试运行时自动启动一个MySQL 8.0版本的容器,并且配置了数据库名、用户名和密码。

• 在测试方法中,通过getJdbcUrl获取容器的JDBC连接地址,然后建立连接,创建表并插入数据,最后验证插入操作是否成功。

Testcontainers极大地简化了测试环境的搭建,让测试能够在接近生产环境的容器化环境中进行,提高了测试的可靠性和有效性。

数据持久化与数据管理

JDBC 审计

使用 @EnableJdbcAuditing 启用 JDBC 审计

        在配置类添加 @EnableJdbcAuditing 后,@CreatedBy,@CreatedDate,@LastModifiedBy,@LastModifiedDate 这些字段都可以加载实体字段上以捕获审计信息。

Flyway & Liquibase

Flyway和Liquibase都是管理数据库的工具,主要区别如下:

工作方式

• Flyway:基于版本号的方式管理数据库迁移。它要求开发者为每个迁移脚本按顺序编号,如V1__Create_user_table.sql、V2__Add_user_name_column.sql。在执行迁移时,Flyway会按版本号从小到大依次执行这些脚本。

• Liquibase:通过XML、YAML或SQL格式的变更日志文件来管理数据库迁移。变更日志文件描述了数据库的一系列变更,它不依赖于文件名中的版本号顺序,而是在日志文件里定义操作的顺序。

对数据库的支持

• Flyway:支持常见的数据库,如MySQL、PostgreSQL、Oracle等,但对某些数据库的特定功能支持可能有限。

• Liquibase:支持更广泛的数据库类型,包括一些比较小众的数据库,而且对不同数据库的兼容性较好,在复杂数据库环境下更有优势。

学习曲线

• Flyway:比较简单直接,容易上手,适合中小规模的项目,尤其是团队成员对数据库迁移工具不太熟悉的情况。

• Liquibase:功能强大但稍复杂,学习成本相对高些,不过它的灵活性使其适用于大型企业级项目。

集成能力

• Flyway:能很好地与构建工具(如Maven和Gradle)集成,在项目构建过程中方便地执行数据库迁移任务。

• Liquibase:除了构建工具集成外,还提供了多种接口和插件,能与不同的开发框架和部署环境集成。

Liquibase

https://docs.liquibase.com/home.html

安全

Spring Security & Spring Cloud API Gateway

OAuth2

JWT

OpenID Connect

KEYCLOAK

定义安全realm

OIDC 认证

CSRF

韧性

超时

重试

回退和错误处理

基于 Redis 的分布式会话管理

Kubernetes

Deployment

Service

ConfigMap & Secret

Ingress & Ingress Controller

Volumn & Persistence Volumn & Persistence Volumn Claim

Pod

Replicaset

配置管理

Kustomize

Helm

Argo & Jenkins

Argo和Jenkins都是用于自动化软件交付流程的工具,但它们之间有一些区别。

工作流定义方式

• Jenkins:通过传统的自由风格(Freestyle)项目或者流水线(Pipeline)来定义任务。在流水线中,使用Groovy脚本编写复杂的构建、测试和部署步骤。例如,定义一个简单的Java项目构建流水线,需要在脚本中指定代码拉取、编译、测试和打包等步骤。

• Argo:主要围绕自定义资源定义(CRD)和工作流模板(Workflow Templates)来构建工作流。它采用声明式的配置方式,通过YAML文件来定义任务之间的依赖关系和执行顺序,更符合Kubernetes原生的配置风格。

与容器生态系统的集成

• Jenkins:可以与容器集成,例如通过在构建节点上运行Docker命令来构建容器镜像,但这种集成相对来说比较手动和复杂。它本身不是为容器原生环境设计的。

• Argo:是为在Kubernetes环境中工作而构建的,与容器生态系统紧密集成。可以很自然地调度和管理容器化的工作负载,并且能够利用Kubernetes的特性,如资源管理、服务发现等。

功能重点

• Jenkins:功能丰富多样,除了构建和部署,还提供了大量的插件用于各种任务,如代码质量检查、安全扫描等。它的插件生态系统是其强大的一个方面,适合多种不同类型的软件开发流程。

• Argo:更侧重于工作流编排和容器原生应用的持续交付。特别适用于在Kubernetes集群内协调复杂的微服务部署、多阶段发布等任务,强调对容器化工作负载的高效管理。

部署和管理

• Jenkins:部署相对简单,可以通过下载WAR包在独立的服务器或者容器中运行。管理方面,需要维护Jenkins服务器本身,包括插件更新、配置备份等。

• Argo:通常部署在Kubernetes集群内,利用Kubernetes的部署和管理机制。这使得它的部署和扩展更符合云原生的方式,但也需要对Kubernetes有一定的了解才能更好地进行部署和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三周精通FastAPI:31 使用 StaticFiles从目录中自动提供静态文件

官方文档&#xff1a;静态文件 - FastAPI 静态文件 您可以使用 StaticFiles从目录中自动提供静态文件。 使用StaticFiles 导入StaticFiles。"挂载"(Mount) 一个 StaticFiles() 实例到一个指定路径。 from fastapi import FastAPI from fastapi.staticfiles impo…

【双目视觉标定】——1原理与实践

0 前言 双目视觉定位是目前机器&#xff08;机器人&#xff09;等领域中使用得非常广泛的视觉定位技术&#xff0c;双目视觉是模拟人的视觉系统利用两个不同位置的摄像头的视差来确定物体的位置。由于有需要采集两个摄像头的图像共同参与计算&#xff0c;所以双目相机装配要求…

【最佳牛围栏——二分】

题目 思路 扩大数据&#xff0c;避免精度问题&#xff0c;拉到整数域解决不用枚举前缀和的 l 和 r&#xff0c;改为求可能 l 的最小值&#xff0c;线性做法不用记录长度来求平均值&#xff0c;改为用平均值处理数据&#xff08;这是第二条的前提&#xff09;&#xff0c;直接通…

[java][高级]MyBatisPlus

一、MyBatisPlus简介 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤&#xff1f; 1.1 SpringBoot整合MyBatisPlus入门程序 ①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 ②&#xff1a;选择当前模块需要使用的技术集&…

Shutdown Abort 强制关库,真的有可能起不来?

全文目录&#xff1a; 开篇语前言 &#x1f31f;目录 &#x1f4cb;1. 什么是 Shutdown Abort&#xff1f; &#x1f4a1;工作原理 &#x1f527; 2. Shutdown Abort 的潜在风险 ⚠️3. 真实案例分析 &#x1f4ca;案例背景 &#x1f310;分析与反思 &#x1f50d; 4. 如何降低…

win10/11无休眠设置和断电后电池模式自动休眠而不是睡眠-用以省电

1、打开休眠设置选项 打开控制面板\所有控制面板项\电源选项\ 左侧的选择电源按钮的功能 默认状态没有休眠 1、管理员权限打开cmd或者power shell 2、输入一下指令&#xff0c;打开休眠选项 powercfg -hibernate on关闭后重新打开 控制面板\所有控制面板项\电源选项\左侧的选…

PyQt5实战——多脚本集合包,UI以及工程布局(二)

个人博客&#xff1a;苏三有春的博客 系列往期&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; 布局 2.1 UI页面布局 整体框架分为分为三个部分&#xff0c;垂直分布。 第一个部分为功能选择按钮&#xff08;如UTF-8转换&#…

Linux驱动开发(3):字符设备驱动

上一章节我们了解到什么是内核模块&#xff0c;模块的加载卸载详细过程以及内核模块的使用等内容。 本章&#xff0c;我们将学习驱动相关的概念&#xff0c;理解字符设备驱动程序的基本框架&#xff0c;并从源码上分析字符设备驱动实现和管理。 主要内容有如下五点&#xff1a;…

中国逐年最大NDVI数据集(250m)

最大NDVI数据集是指通过遥感技术获取的归一化植被指数&#xff08;NDVI&#xff09;数据&#xff0c;这些数据反映了地表植被覆盖的密集程度。NDVI的数值范围通常为-1到1&#xff0c;其中-1表示完全被水覆盖&#xff0c;0表示有岩石或裸土等非植被覆盖&#xff0c;而1表示植被完…

【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法

【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法 【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法 文章目录 【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和…

Transformer 架构简单理解;GPT-3.5 的架构,向量长度为 :12288;Transformer架构改进:BERT和GPT

目录 Transformer 架构简单理解 GPT-3.5 的架构,向量长度为 :12288 Transformer工作原理:在多头注意力机制(Multi - Head Attention)的标准操作中,每个头(head)的输入数据是相同的 Transformer架构改进:BERT BERT:BERT是一种基于Transformer的预训练语言模型,它…

Springboot 内置缓存与整合Redis作为缓存

Spring Boot 的缓存注解允许开发者在不修改业务逻辑的情况下&#xff0c;将方法的计算结果缓存起来&#xff0c;从而减少重复计算和数据库查询&#xff0c;提高系统性能。 1、Spring Boot Cache 的基本用法及常用注解 1. 引入依赖 首先&#xff0c;需要在项目中引入缓存相关依…

《西部皮革》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《西部皮革》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《西部皮革》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;四川省经济和信息化厅 …

【4】函数与结构体

文章目录 一、函数的基本流程及调用二、包的使用原理三、函数的使用注意事项四、defer的使用五、字符串常用系统函数六、时间函数七、常用内置函数八、错误处理机制及自定义错误 一、函数的基本流程及调用 package mainimport ("fmt""strings" )// 定义简…

供应SW1108P集成氮化镓直驱的高频准谐振IC

1. 概述 SW1108P 是一款针对离线式反激变换器的高性能高集成度准谐振电流模式 PWM 控制器。 SW1108P 内置 6V 的驱动电压&#xff0c;可直接用于驱动氮化镓功率管&#xff1b;芯片工作于带谷底锁定功能 的谷底开启模式&#xff0c;同时集成频率抖动功能以优化 EMI 性能&…

uniapp使用中小问题及解决方法集合

1、 u-input 标签 设置只读、禁用后,click事件不生效 // 解决u-input 标签 设置只读、禁用后,click事件不生效&#xff08;不弹出弹框&#xff09; .input-disabled-click {pointer-events: none; }2、 uniapp实现u-datetime-picker时间选择器的默认日期定位&#xff0c;解决d…

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…

使用Nginx作为反向代理和负载均衡器

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Nginx作为反向代理和负载均衡器 引言 Nginx 简介 安装 Nginx Ubuntu CentOS 配置 Nginx 作为反向代理 配置 Nginx 作为负载…

「实战应用」使用 DHTMLX 构建数据透视表,促进有效的数据分析

概述&#xff1a;在本文中&#xff0c;您将了解组织何时选择数据透视表来处理大数据&#xff0c;并熟悉用于在网页上实现此功能的 DHTMLX 工具。 如今&#xff0c;高效处理大数据已成为企业的必需。企业每天必须处理大量数据&#xff0c;以将其转化为可操作的见解并获得竞争优…

Stable diffusion 3.5本地运行环境配置记录

1.环境配置 创建虚环境 conda create -n sd3.5 python3.10Pytorch(>2.0) conda install pytorch2.2.2 torchvision0.17.2 torchaudio2.2.2 pytorch-cuda12.1 -c pytorch -c nvidiaJupyter能使用Anaconda虚环境 conda install ipykernel python -m ipykernel install --user …