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.rhkb.cn/news/464558.html

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

相关文章

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…

node.js模块化分析

什么是Node.js模块化 Node.js中的模块化‌是指将一个大文件拆分成独立且相互依赖的多个小模块。每个JS文件被视为一个独立的模块&#xff0c;模块之间是互相不可见的。如果一个模块需要使用另一个模块&#xff0c;则需要使用指定的语法来引入该模块&#xff0c;并且只能使用模块…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…

C语言 -- qsort的简单使用

qsort函数 一、介绍二、语法格式三、使用函数从小到大从大到小 四、结语 一、介绍 qsort 函数是 C 标准库中的一个通用排序函数&#xff0c;用于对数组进行快速排序。它定义在 <stdlib.h> 头文件中。这个非常灵活&#xff0c;因为它允许用户指定数组的元素类型、数组的大…

unity3d————叉乘的知识点

一、向量叉乘的知识点 定义与公式&#xff1a; 向量叉乘的定义为&#xff1a;对于两个三维向量a和b&#xff0c;它们的叉乘结果是一个向量c&#xff0c;记为cab。叉乘的计算公式为&#xff1a;c(y1z2-y2z1)i(x2z1-x1z2)j(x1y2-x2y1)k&#xff0c;其中a(x1, y1, z1)&#xff0c;…

vue2和vue3在html中引用组件component方式不一样

我的vue版本是&#xff1a;20.17.0 一、在HTML中&#xff0c;引用组件格式区别。 vue2引用组件可以是file.vue格式&#xff0c;需要导入&#xff1a;<script src"https://unpkg.com/http-vue-loader"></script>才可以识别vue格式。 vue3引用组件格式是…

密码学知识点整理一:密码学概论

密码学是什么&#xff1f; 密码学是一门研究编制密码和破译密码的技术科学。 密码学&#xff0c;作为信息安全的核心技术之一&#xff0c;其重要性在于能够为信息传输提供安全保障&#xff0c;确保数据在存储或传输过程中的机密性、完整性与真实性不被破坏。从古至今&#x…

我谈正态分布——正态偏态

目录 pdf和cdf参数 标准正态分布期望和方差分布形态 3 σ 3\sigma 3σ原则 正态和偏态正态偏态瑞利分布偏度 (Skewness)峰度 (Kurtosis) 比较 正态分布的英文是Normal Distribution&#xff0c;normal是“正常”或“标准”的意思&#xff0c;中文翻译是正态&#xff0c;多完美的…

杨传辉:云+AI 时代的一体化数据库|OceanBase发布会实录

在 2024 OceanBase 年度发布会 上&#xff0c; OceanBase CTO 杨传辉进行了主题为《云和 AI 时代的一体化数据库战略思考》的演讲&#xff0c;本文为演讲实录&#xff0c;欢迎阅读。 视频观看可点击&#xff1a;https://www.oceanbase.com/video/9001825 各位 OceanBase 的客…

华为OD机试 - 无重复字符的元素长度乘积的最大值(Python/JS/C/C++ 2024 C卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看

文章目录 1.使用 Python 中的 json 库2. 使用浏览器3. notepad4. VSCode 如果COCO的JSON文件内容在一行显示&#xff0c;这通常意味着文件被压缩或者是在传输过程中出现了问题。 1.使用 Python 中的 json 库 想更好地查看 COCO 格式的 JSON 标签&#xff0c;可以将其格式化为更…

2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章

2025第十四届国际生物发酵展将于3月3-5日济南盛大举办&#xff01;产业链逐步完整&#xff0c;展会面积再创历史新高&#xff0c;展览面积较上届增涨至60000平方米&#xff0c;专业观众40000&#xff0c;品牌展商800&#xff0c;同期活动会议增加至50场&#xff0c;展会同期将举…

kafka里的consumer 是推还是拉?

大家好&#xff0c;我是锋哥。今天分享关于【kafka里的consumer 是推还是拉&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka里的consumer 是推还是拉&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;消费者&…

Visual Studio | 配置管理

文章目录 一、配置管理1、项目属性1.1、常规1.2、VC 目录1.3、C/C -> 常规1.4、C/C -> 预处理器1.5、C/C -> 预编译头1.6、连接器 -> 常规1.7、连接器 -> 输入 2、编辑2.1、显示空格或tab符 一、配置管理 1、项目属性 1.1、常规 字段功能目标平台版本用于生成…

Docker打包自己项目推到Docker hub仓库(windows10)

一、启用Hyper-V和容器特性 1.应用和功能 2.点击程序和功能 3.启用或关闭Windows功能 4.开启Hyper-V 和 容器特性 记得重启生效&#xff01;&#xff01;&#xff01; 二、安装WSL2&#xff1a;写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/143057041 三…

js.轮转数组和旋转链表

这是两个相似的题型&#xff0c;一个是数组&#xff0c;另一个是链表。 链接&#xff1a;189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1:…

mysql left join group_concat 主表丢失数据

问题出现的场景&#xff1a; 有一个主表 a&#xff0c;一个子表 b a表有两条数据&#xff0c;a表第一条数据在b表中有一条子数据&#xff0c;a表第二条数据在b表中有两条子数据。 现在想要查询出来a表的所有数据和a表的子表b的id&#xff0c;b的id 使用GROUP_CONCAT拼接 有…

Spring 中循环依赖 三级缓存

在Spring框架中&#xff0c;循环依赖是一个常见的问题&#xff0c;它指的是两个或多个Bean之间互相依赖&#xff0c;形成一个闭环&#xff0c;导致无法准确地完成对象的创建和初始化。为了解决这个问题&#xff0c;Spring引入了三级缓存机制。以下是对Spring中循环依赖和三级缓…

新能源汽车与公共充电桩布局

近年来,全球范围内对新能源汽车产业的推动力度不断增强,中国新能源汽车市场也呈现蓬勃发展的势头,在政策与市场的共同推动下,新能源汽车销量持续增长。然而,据中国充电联盟数据显示,充电基础设施建设滞后于新能源汽车数量增长的现状导致充电桩供需不平衡,公共充电桩服务空白区域…

【深度学习基础】常用图像卷积核类型

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 常…