结合 GitLab、CI/CD、Docker 和 Kubernetes(K8s)部署项目的核心是实现代码提交→自动构建→自动测试→容器化→自动部署到 K8s 集群的全流程自动化。以下是详细的实施步骤和关键配置:
一、环境准备先确保基础环境就绪,核心组件包括:
组件
作用
准备要点
GitLab
代码托管 + CI/CD 引擎
需启用内置的Container Registry(容器镜像仓库),用于存储 Docker 镜像。
Docker
应用容器化
安装 Docker 引擎(GitLab Runner 节点和本地开发机需配置)。
Kubernetes 集群
容器编排与运行环境
需有可用的 K8s 集群(如 Minikube、EKS、GKE 等),并配置kubectl可访问。
GitLab Runner
执行 CI/CD 任务的代理
部署在可访问 K8s 集群和 GitLab 的节点上,需注册到 GitLab 项目中。
二、项目结构准备假设项目为一个简单的 Web 应用(如 Python/Java/Node.js ...
秒杀场景的特点:高并发、低库存、短时间的爆发式访问。因此我们应该从以下方面考虑:
高并发处理:如何应对大量用户的同时访问
库存一致性:如何保证库存不会超卖和少买
用户体验:如何减少等待时间,避免页面崩溃
防刷机制:如何防止恶意用户利用脚本抢购商品
用户 → 前端限流 → CDN → 负载均衡(Nginx) → API网关 → 应用服务 → 缓存(Redis) → 消息队列 → 订单服务 → 数据库
1. 前端层:减少无效请求前端是流量入口,需通过简单策略过滤大部分无效请求,降低后端压力。
按钮控制:
秒杀未开始时按钮置灰,禁止点击;
秒杀开始后,点击一次后立即置灰(防止用户重复点击),并显示 “处理中”。
限流与排队:
加入验证码(图形 / 滑块),增加请求成本(防脚本抢购);
前端排队动画(如 “您在第 XX 位”),降低用户焦虑,同时通过延迟提交分散流量。
静态资源优化:
秒杀页面(商品图片、描述)通过 CDN 分发,避免请求直达应用服务器。
2. 接入层:流量初次过滤通过负载均衡和网关进一步拦截无效流量,保护后端服务。
Nginx 负载均衡 ...
Git命令 以下是 Git 日常开发中最常用的命令整理,按功能分类便于查阅:
一、初始化与配置
git init:在当前目录初始化一个新的 Git 仓库(生成.git目录)。
git config --global user.name "你的名字":设置全局用户名(所有仓库生效)。
git config --global user.email "你的邮箱":设置全局邮箱(所有仓库生效)。
git config --local user.name "名字":设置当前仓库的用户名(仅当前仓库生效,覆盖全局)。
git config --list:查看当前 Git 配置(包括全局和本地)。
二、工作区与暂存区操作
git add <文件名>:将指定文件从工作区添加到暂存区(暂存修改)。
git add .:将当前目录所有修改(新增、修改、删除)添加到暂存区。
git add -u:仅添加已跟踪文件的修改 / 删除(不包含新增文件)。
git rm <文件名>:删除工作区文件,并将删除操作添加到暂存 ...
单体架构 vs 分布式架构 vs 微服务架构单体架构(Monolithic)
特点:
整个系统打包成一个应用(通常一个 war/jar 包)。
所有功能模块(用户、订单、商品、支付…)都在一个工程里。
优点:
开发简单,上手快。
部署方便,只需要一个应用包。
缺点:
耦合度高,一个模块出问题可能影响整个系统。
修改或扩展困难(要重新编译、打包、部署)。
无法灵活扩展(只能整体扩容)。
👉 适合 小型项目 或 初创项目。
分布式架构(Distributed)
特点:
把系统拆分成多个子系统(但粒度比较大,比如用户系统、订单系统)。
子系统之间通过 RPC、HTTP、MQ 等方式通信。
优点:
各个子系统可以独立部署和扩展。
适合团队协作开发(不同小组负责不同子系统)。
缺点:
子系统还是比较大,内部功能没有彻底拆开。
依赖复杂,系统间通信、事务处理变难。
👉 适合 中大型系统,例如传统电商网站:商品系统、支付系统、会员系统。
微服务架构(Microservices)
特点:
在分布式的基础上进一步细化,把系统拆成 更小的服务(通常围绕业务边界, ...
什么是消息队列(MQ)MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。
常见的消息队列(如何选型)
Kafka
吞吐量极高(十万级 TPS)、大数据生态友好
运维复杂、事务消息需额外开发
日志采集、大数据流处理、高吞吐业务
吞吐 > 可靠性 > 灵活性
RocketMQ
金融级可靠性、事务消息、顺序性强
多语言支持弱(主要依赖 Java)
金融交易、订单核心流程、事务场景
可靠性 > 吞吐 > 生态(Java 优先)
RabbitMQ
路由灵活、延迟低(微秒级)、多语言友好
吞吐量有限(千级 TPS)
通知推送、复杂路由、中小业务
灵活性 > 延迟 > 吞吐
Pulsar
云原生、多租户、冷热数据分离
社区成熟度略低、运维中等复杂度
云环境、多团队共享、混合消息 / 流场景
云原生 > ...
面试题
未读MyBatis 面试重点集中在 核心原理(组件、流程)、映射机制(参数 / 结果 / 动态 SQL)、缓存、插件 等方面,需结合实际使用场景理解,而非死记硬背。
谈一下你对mybatis的认识?MyBatis 是一款半自动化 ORM 框架,它对 JDBC 操 作数据库的过程进行了封装,使得开发者只需关注 SQL 本身,而无需处理如注册驱动、创建连接、关闭资源等繁杂的过程。
核心组件及其作用:
SqlSessionFactory:会话工厂,由 SqlSessionFactoryBuilder 基于配置文件 / 注解构建,是 MyBatis 入口,线程安全。
SqlSession:与数据库交互的会话对象,非线程安全,需手动关闭,提供增删改查方法。
Mapper 接口:定义数据操作方法,MyBatis 动态生成代理实现类,与 Mapper XML 绑定。
Executor:SQL 执行器(核心组件),负责 SQL 执行和缓存管理(默认 SimpleExecutor,支持 BatchExecutor 等)。
StatementHandler:处理 SQL 编译 ...
Redis 是面试中的高频考点,重点集中在 数据结构、持久化机制、高可用(主从 / 哨兵 / 集群)、缓存问题(穿透 / 击穿 / 雪崩)、性能优化 等方面。
什么是RedisRedis(Remote Dictionary Server)是一个开源的高性能键值对(key-value)数据库,它将数据存储在内存中,因此具有极高的读写速度,同时也支持数据持久化到磁盘,以防止数据丢失。
基于内存存储:数据主要存于内存,读写速度极快(毫秒级响应),适合高频访问场景。
支持多种数据结构:不仅支持字符串(String),还包括哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、地理空间(Geospatial)等,灵活满足不同业务需求。
持久化机制:通过 RDB(快照)和 AOF(日志追加)两种方式将内存数据持久化到磁盘,平衡性能与数据安全性。
高并发与扩展性:支持主从复制、哨兵模式(Sentinel)和集群(Cluster),可实现高可用和水平扩展,应对海量请求。
丰富的功能:提供事务、发布订阅、Lu ...
聊聊你对spring框架的理解?Spring 是一种轻量级开发框架,旨在提高开发人员的 开发效率以及系统的可维护性,其中有几个核心概念:依赖注入、IOC(控制反转)、AOP(面向切面编程)、事务管理。
IOC(控制反转)它是一种创建对象和获取对象的一个技术思想,将对象交给Spring容器进行管理。我们不用手动的创建对象,而是由IOC容器来帮我实现实例化对象。
核心的话是通过依赖注入,依赖注入有三种方式:注解、XML配置、构造器注入
IOC的底层的话是通过反射机制+工厂模式+配置解析:
IOC 容器启动时,首先会加载并解析描述对象(Bean)及其依赖关系的配置信息。
容器根据解析后的配置,通过反射机制动态创建对象(Bean),而非硬编码 new 操作。
对象创建后,容器会根据配置或注解解析其依赖项(如 UserService 依赖 UserDao),并自动完成依赖注入。
AOP(面向切面编程)是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,以减少系统的重复代码,降低模块间的耦合度。
在AOP里面有几个概念:
横切关注点:系统中分散在多个模块、且 ...
基础NOSQL和SQL的区别SQL(关系型数据库,Relational Database) 基于表结构、行列模型存储数据,使用 SQL(结构化查询语言) 操作数据,数据之间有严格的关系约束。 代表:MySQL、Oracle、PostgreSQL、SQL Server
NoSQL(非关系型数据库,Not Only SQL) 用于应对 高并发、大数据量、灵活结构 的场景,数据模型灵活,不一定用表格结构。 代表:Redis(键值型)、MongoDB(文档型)、Elasticsearch(搜索引擎型)、HBase(列族型)
数据库三大范式第一范式:数据表中的每一列都必须是不可再分的最小数据单元,也就是说字段的值必须是原子值。
第二范式:在满足 1NF 的前提下,每个非主属性必须完全依赖于主键,而不能依赖主键的一部分。
第三范式:非主属性只能依赖主键,不能依赖于另一个非主属性。
在业务系统中(如电商、CRM、点餐系统),通常不会强行做到 3NF。 因为过度拆表会影响查询性能,导致频繁 JOIN。
常见做法:
核心业务表遵循 3NF;
查询频繁的表可适当反范式化(冗余字段、缓存冗余);
数据库 ...
JVM是什么JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范。引入Java虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。
JVM的内存结构Java 虚拟机的内存空间分为 5 个部分:
程序计数器
Java 虚拟机栈
本地方法栈
堆
方法区
程序计数器 可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的Java方法的JVM指令地址。如果线程执行的是Native方法,计数器值为null。是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域,生命周期与线程相同。
程序计数器的特点
是一块较小的内存空间。
线程私有,每条线程都有自己的程序计数器。
生命周期:随着线程的创建而创建,随着线程的结束而销毁。
是唯一一个不会出现 OutOfMe ...













