Centos7 k8s 集群 - Mysql主从架构

项目地址

  • MysqlCluster

configMap

mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: mysqllabels:app: mysql
data:primary.cnf: |# 主节点MySQL的配置文件[mysqld]# 使用二进制日志文件的方式进行主从复制,这是一个标准的设置log-binreplica.cnf: |# 从节点MySQL的配置文件[mysqld]# 代表的是从节点会拒绝除了主节点的数据同步操作之外的所有写操作,即:它对用户是只读的super-read-only

configmap资源

kubectl apply -f mysql-configmap.yaml

service

mysql-services.yaml

# Headless Service。类似绑定了mysql-0的IP地址
# 通过为 Pod 分配 DNS 记录来固定它的拓扑状态,比如“mysql-0.mysql”和“mysql-1.mysql”这样的 DNS 名字
# 其中,编号为 0 的节点就是我们的主节点
# 写请求,则必须直接以 DNS 记录的方式访问到 MySQL 的主节点
apiVersion: v1
kind: Service
metadata:name: mysqllabels:app: mysql
spec:ports:- name: mysqlport: 3306clusterIP: Noneselector:app: mysql
---
# 常规的 Service。用于负载均衡
# 所有用户的读请求,都必须访问第二个 Service 被自动分配的 DNS 记录
# 即:“mysql-read”(当然,也可以访问这个 Service 的 VIP)
# 读请求就可以被转发到任意一个 MySQL 的主节点或者从节点上
apiVersion: v1
kind: Service
metadata:name: mysql-readlabels:app: mysql
spec:ports:- name: mysqlport: 3306selector:app: mysql

创建service资源

kubectl apply -f mysql-services.yaml

StatefulSet

mysql-statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:selector:# 这个 StatefulSet 要管理的 Pod 必须携带 app=mysql 标签# 它声明要使用的 Headless Service 的名字是:mysqlmatchLabels:app: mysqlapp.kubernetes.io/name: mysqlserviceName: mysql# 这个 StatefulSet 的 replicas 值是 3,表示它定义的 MySQL 集群有三个节点# 一个 Master 节点,两个 Slave 节点replicas: 3template:metadata:labels:app: mysqlapp.kubernetes.io/name: mysqlspec:# InitContainer 应该是排头兵,做了一系列的准备工作:确定M/S角色、拷贝配置文件、挂载存储卷# 当 InitContainer 复制完配置文件退出后,后面启动的 MySQL 容器只需要直接声明挂载这个名叫 conf 的 Volume# 它所需要的.cnf 配置文件已经出现在里面了initContainers:- name: init-mysqlimage: mysql:5.7command:- bash- "-c"- |set -ex# 从Pod的序号, 生成server-id# 通过这个序号,判断当前 Pod 到底是 Master 节点(即:序号为 0)还是 Slave 节点(即:序号不为 0)[[ $HOSTNAME =~ -([0-9]+)$ ]] || exit 1ordinal=${BASH_REMATCH[1]}echo [mysqld] > /mnt/conf.d/server-id.cnf# 由于server-id=0有特殊含义, 我们给ID加一个100来避开它echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf# 如果Pod序号是0, 说明它是Master节点, 从ConfigMap里把Master的配置文件拷贝到/mnt/conf.d/目录. 否则,拷贝Slave的配置文件if [[ $ordinal -eq 0 ]]; thencp /mnt/config-map/primary.cnf /mnt/conf.d/elsecp /mnt/config-map/replica.cnf /mnt/conf.d/fi          volumeMounts:# 而文件拷贝的目标目录,即容器里的 /mnt/conf.d/ 目录# 对应的则是一个名叫 conf 的、emptyDir 类型的 Volume- name: confmountPath: /mnt/conf.d# ConfigMap 里保存的内容,就会以文件的方式出现在它的 /mnt/config-map 目录- name: config-mapmountPath: /mnt/config-map- name: clone-mysql# 在 Slave Pod 启动前,从 Master 或者其他 Slave Pod 里拷贝数据库数据到自己的目录下# image: yizhiyong/xtrabackupcommand:- bash- "-c"- |set -ex# 拷贝操作只需要在第一次启动时进行,所以如果数据已经存在,跳过[[ -d /var/lib/mysql/mysql ]] && exit 0# Master节点(序号为0)不需要做这个操作[[ `hostname` =~ -([0-9]+)$ ]] || exit 1ordinal=${BASH_REMATCH[1]}[[ $ordinal -eq 0 ]] && exit 0# 使用ncat指令,远程地从前一个节点拷贝数据到本地.保证上一个pod是启动运行状态的# 3307 是一个特殊端口,运行着一个专门负责备份 MySQL 数据的辅助进程ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql# 执行--prepare,这样拷贝来的数据就可以用作恢复了xtrabackup --prepare --target-dir=/var/lib/mysql          volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dcontainers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ALLOW_EMPTY_PASSWORDvalue: "1"ports:- name: mysqlcontainerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 500mmemory: 1GilivenessProbe:exec:command: ["mysqladmin", "ping"]initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5readinessProbe:exec:# Check we can execute queries over TCP (skip-networking is off).command: ["mysql", "-h", "127.0.0.1", "-uroot", "-e", "SELECT 1"]initialDelaySeconds: 5periodSeconds: 2timeoutSeconds: 1- name: xtrabackup# 如何在 Slave 节点的 MySQL 容器第一次启动之前,执行初始化 SQLimage: yizhiyong/xtrabackupports:- name: xtrabackupcontainerPort: 3307command:- bash- "-c"- |set -excd /var/lib/mysql# 从备份信息文件里读取MASTER_LOG_FILEM和MASTER_LOG_POS这两个字段的值,用来拼装集群初始化SQLif [[ -f xtrabackup_slave_info && "x$(<xtrabackup_slave_info)" != "x" ]]; then# 如果xtrabackup_slave_info文件存在,说明这个备份数据来自于另一个Slave节点# 这种情况下,XtraBackup工具在备份的时候,就已经在这个文件里自动生成了"CHANGE MASTER TO" SQL语句# 所以,我们只需要把这个文件重命名为change_master_to.sql.in,后面直接使用即可cat xtrabackup_slave_info | sed -E 's/;$//g' > change_master_to.sql.in# 所以,也就用不着xtrabackup_binlog_info了rm -f xtrabackup_slave_info xtrabackup_binlog_infoelif [[ -f xtrabackup_binlog_info ]]; then# 如果只存在xtrabackup_binlog_inf文件,那说明备份来自于Master节点# 我们就需要解析这个备份信息文件,读取所需的两个字段的值[[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1rm -f xtrabackup_binlog_info xtrabackup_slave_infoecho "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.infi# 如果change_master_to.sql.in存在,就意味着需要做集群初始化工作if [[ -f change_master_to.sql.in ]]; then# 但一定要先等MySQL容器启动之后才能进行下一步连接MySQL的操作echo "Waiting for mysqld to be ready (accepting connections)"until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; doneecho "Initializing replication from clone position"# 将文件change_master_to.sql.in改个名字,防止这个Container重启的时候# 因为又找到了change_master_to.sql.in,从而重复执行一遍这个初始化流程mysql -h 127.0.0.1 \-e "$(<change_master_to.sql.in), \MASTER_HOST='mysql-0.mysql', \MASTER_USER='root', \MASTER_PASSWORD='', \MASTER_CONNECT_RETRY=10; \START SLAVE;" || exit 1# 使用change_master_to.sql.orig的内容,也是就是前面拼装的SQL,组成一个完整的初始化和启动Slave的SQL语句mv change_master_to.sql.in change_master_to.sql.origfi# 使用ncat监听3307端口。它的作用是,在收到传输请求的时候# 直接执行"xtrabackup --backup"命令,备份MySQL的数据并发送给请求者exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \"xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"          volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 100mmemory: 100Mivolumes:- name: confemptyDir: {}# 一个名叫 conf 的、emptyDir 类型的 Volume- name: config-mapconfigMap:name: mysql# PVC 模板。来为每个 Pod 定义 PVC# 这个 PVC 模板的 resources.requests.strorage 指定了存储的大小为 10 GiBvolumeClaimTemplates:- metadata:name: dataspec:storageClassName: rook-ceph-block# ReadWriteOnce 指定了该存储的属性为可读写,并且一个 PV 只允许挂载在一个宿主机上accessModes: ["ReadWriteOnce"]resources:requests:storage: 10Gi

创建mysql资源

kubectl apply -f mysql-statefulset.yaml

容器启动查询

init-mysql

[root@master ~]# kubectl logs mysql-0 init-mysql
+ [[ mysql-0 =~ -([0-9]+)$ ]]
+ ordinal=0
+ echo '[mysqld]'
+ echo server-id=100
+ [[ 0 -eq 0 ]]
+ cp /mnt/config-map/primary.cnf /mnt/conf.d/

mysql

[root@master ~]# kubectl logs mysql-0 init-mysql
+ [[ mysql-0 =~ -([0-9]+)$ ]]
+ ordinal=0
+ echo '[mysqld]'
+ echo server-id=100
+ [[ 0 -eq 0 ]]
+ cp /mnt/config-map/primary.cnf /mnt/conf.d/
[root@master ~]#  kubectl logs mysql-0 mysql
2023-03-24 07:09:15+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2023-03-24 07:09:15+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2023-03-24 07:09:15+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2023-03-24T07:09:15.578039Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-03-24T07:09:15.579656Z 0 [Note] mysqld (mysqld 5.7.36-log) starting as process 1 ...
2023-03-24T07:09:15.580982Z 0 [Warning] No argument was provided to --log-bin, and --log-bin-index was not used; so replication may break when this MySQL server acts as a master and has his hostname changed!! Please use '--log-bin=mysql-0-bin' to avoid this problem.
2023-03-24T07:09:15.607203Z 0 [Note] InnoDB: PUNCH HOLE support available
2023-03-24T07:09:15.607219Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2023-03-24T07:09:15.607222Z 0 [Note] InnoDB: Uses event mutexes
2023-03-24T07:09:15.607224Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2023-03-24T07:09:15.607226Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2023-03-24T07:09:15.607229Z 0 [Note] InnoDB: Using Linux native AIO
2023-03-24T07:09:15.607506Z 0 [Note] InnoDB: Number of pools: 1
2023-03-24T07:09:15.607671Z 0 [Note] InnoDB: Using CPU crc32 instructions
2023-03-24T07:09:15.609449Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2023-03-24T07:09:15.617162Z 0 [Note] InnoDB: Completed initialization of buffer pool
2023-03-24T07:09:15.620370Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2023-03-24T07:09:15.644357Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
2023-03-24T07:09:16.057153Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2023-03-24T07:09:16.057222Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2023-03-24T07:09:19.387580Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2023-03-24T07:09:19.388076Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
2023-03-24T07:09:19.388095Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
2023-03-24T07:09:19.388889Z 0 [Note] InnoDB: Waiting for purge to start
2023-03-24T07:09:19.446231Z 0 [Note] InnoDB: 5.7.36 started; log sequence number 12666149
2023-03-24T07:09:19.447072Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2023-03-24T07:09:19.447166Z 0 [Note] Plugin 'FEDERATED' is disabled.
2023-03-24T07:09:19.694456Z 0 [Note] InnoDB: Buffer pool(s) load completed at 230324  7:09:19
2023-03-24T07:09:19.787835Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them.
2023-03-24T07:09:19.787892Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.
2023-03-24T07:09:19.787897Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2023-03-24T07:09:19.787898Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2023-03-24T07:09:19.790876Z 0 [Warning] CA certificate ca.pem is self signed.
2023-03-24T07:09:19.790926Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
2023-03-24T07:09:19.794145Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
2023-03-24T07:09:19.794362Z 0 [Note] IPv6 is available.
2023-03-24T07:09:19.794440Z 0 [Note]   - '::' resolves to '::';
2023-03-24T07:09:19.794469Z 0 [Note] Server socket created on IP: '::'.
2023-03-24T07:09:19.795754Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2023-03-24T07:09:20.029315Z 0 [Note] Failed to start slave threads for channel ''
2023-03-24T07:09:20.567496Z 0 [Note] Event Scheduler: Loaded 0 events
2023-03-24T07:09:20.568119Z 0 [Note] mysqld: ready for connections.
Version: '5.7.36-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
2023-03-24T07:09:46.837520Z 9 [Warning] IP address '10.244.4.62' could not be resolved: Name or service not known
2023-03-24T07:09:46.844496Z 9 [Note] Start binlog_dump to master_thread_id(9) slave_server(101), pos(mysql-0-bin.000006, 756)
2023-03-24T07:10:40.115743Z 43 [Warning] IP address '10.244.3.116' could not be resolved: Name or service not known
2023-03-24T07:10:40.173087Z 43 [Note] Start binlog_dump to master_thread_id(43) slave_server(102), pos(mysql-0-bin.000006, 756)

xtrabackup

[root@master ~]# kubectl logs mysql-0 xtrabackup
+ cd /var/lib/mysql
+ [[ -f xtrabackup_slave_info ]]
+ [[ -f xtrabackup_binlog_info ]]
+ [[ -f change_master_to.sql.in ]]
+ exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c 'xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root'

案例验证

POD 查询

[root@master ~]# kubectl get pod -l app=mysql
NAME      READY   STATUS    RESTARTS   AGE
mysql-0   2/2     Running   0          4m5s
mysql-1   2/2     Running   0          3m10s
mysql-2   2/2     Running   0          2m45s

表创建

kubectl run mysql-client --image=mysql:5.7 -i --rm --restart=Never --\mysql -h mysql-0.mysql -uroot -e'
CREATE DATABASE test;
CREATE TABLE test.messages (message VARCHAR(250));
INSERT INTO test.messages VALUES ('hello');
'

表查询

kubectl run mysql-client --image=mysql:5.7 -i --rm --restart=Never -- mysql -h mysql-read -uroot -e'SELECT * FROM test.messages'If you don't see a command prompt, try pressing enter.
message
hello
pod "mysql-client" deleted

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

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

相关文章

掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容

摘要/导言&#xff1a; 在本文中&#xff0c;我们将探讨如何使用 C# 中的 HttpClient 类和爬虫代理IP技术来获取今日头条的内容。我们还将实现多线程技术&#xff0c;以提高数据采集的效率。 背景/引言&#xff1a; 随着信息时代的到来&#xff0c;数据已经成为了一种非常宝…

Spring Boot 3登录开发进阶:图形验证码接口的实现

内容简介 上文我们已经整合好了jwt,本文我们开始实现图形验证码接口的实现。 前置条件 本文衔接上文&#xff0c;请从上文开始 spring boot3登录开发(整合jwt)_springboot3 jwt-CSDN博客 图形验证码接口实现 1、导入工具依赖 pom.xml: <dependency> <groupId&g…

开发日志2024-04-11

开发日志2024/04/11 1、会员/普通用户预约完成后&#xff0c;技师对应的积分添加预约完成的项目价格添加到统计表的业绩字段中&#xff0c;同时对应的服务次数字段1 实现代码&#xff1a; 前端 shHandler(){this.$confirm(确定操作?, "提示", {confirmButtonText…

HarmonyOS实战开发-拼图、如何实现获取图片,以及图片裁剪分割的功能。

介绍 该示例通过ohos.multimedia.image和ohos.multimedia.mediaLibrary接口实现获取图片&#xff0c;以及图片裁剪分割的功能。 效果预览 使用说明&#xff1a; 使用预置相机拍照后启动应用&#xff0c;应用首页会读取设备内的图片文件并展示获取到的第一个图片&#xff0c;…

go的option模式

go的option模式 1.函数option 把option定义为函数。 package mainimport "fmt"// ServerConfig 定义服务器配置 type ServerConfig struct {Port intTimeout int }// Option 定义函数选项类型 type Option func(*ServerConfig)// WithPort 设置服务器端口 // 这…

word中插入mathtype版的符号后,行间距变大解决方法

问题 解决方法 选中该段&#xff0c;设置固定值行距。如果是宋体&#xff0c;小四&#xff0c;1.25行距&#xff0c;那么固定值就为20磅。 成功解决。

ELK 企业级日志分析 ELFK

一 ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源 工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索引擎的…

微服务支持平台--限流算法

微服务支持平台–限流 限流算法 限流算法&#xff1a; 算法含义备注令牌桶以恒定速度往一个桶内增加令牌&#xff0c;当桶内令牌满了后&#xff0c;就停止增加令牌适用于流量比较平稳的情况&#xff0c;只能承受小的突发流量滑动窗口将时间周期分为N个小周期&#xff0c;分别记…

Java后端基础知识(String类型)

String类的创建方式 String的特点 1.引用数据类型 2.是final类&#xff0c;一旦创建内容不可修改 3.String类对象相等的判断用equals&#xff08;&#xff09;方法完成&#xff0c;是判断地址数值 String的创建方式 1.直接创建 String str"hello";注意&#xff…

Android进程类型及优先级(前台进程/可见进程/服务进程/缓存进程/空进程)

Android进程类型及优先级 一、Android 进程优先级 Android 进程优先级 :前台进程 > 可见进程 >服务进程 >缓存进程 > 空进程 ; 关键优先级进程 : 活动进程 ;高优先级进程 : 可见进程 , 服务进程 ;低优先级进程 : 后台进程 , 空进程 ; Android 系统中会尽量保证…

09 Php学习:数组和排序

数组概念 在PHP中&#xff0c;数组是一种复合数据类型&#xff0c;用于存储多个值。以下是关于PHP数组的详细解释&#xff1a; 索引数组&#xff1a;索引数组是最基本的数组类型&#xff0c;其中每个元素都有一个唯一的数字索引&#xff0c;从0开始递增。 关联数组&#xff…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…

【蓝桥杯每日一题】4.11 更小的数(不用区间DP)

题目来源&#xff1a; 蓝桥杯 2023 省 A]更小的数 - 洛谷 这题只需要用到双指针就OK~ 思路1&#xff1a; 翻转数组的子数组&#xff0c;然后进行比较大小将翻转后的数组存储在字符串 k k k中&#xff0c;然后将字符串 k k k与字符串 a a a进行逐一元素比较&#xff08;因为…

橘子学JDK之JMH-02(BenchmarkModes)

一、案例二代码 这次我们来搞一下官网文档的第二个案例&#xff0c;我删除了一些没用的注释&#xff0c;然后对代码做了一下注释的翻译&#xff0c;可以看一下意思。 package com.levi;import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import …

MySQL优化常见面试题

文章目录 1.在MySQL中如何定位慢查询2.SQL语句执行很慢&#xff0c;如何分析3.什么是索引4.索引的底层结构了解过嘛5.B树和B树的区别是什么6.什么是聚簇索引什么是非聚簇索引7.什么是回表查询8.什么是覆盖索引9.MySQL超大分页如何处理10.索引创建原则有哪些11.什么情况下索引会…

【算法练习】29:插入排序学习笔记

一、插入排序的算法思想 原理&#xff1a;将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。 时间复杂度&#xff1a;插入排序的时间复杂度在最坏、平均和最好情况下的表现相同&#xff0c;均为 &#xff0c;其中 n 是待排序数…

极狐GitLab对接OAuth2实现SSO

本文作者&#xff1a;极狐(GitLab) 高级解决方案架构师 武让 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 企…

Python处理PDF:在PDF文档中插入页眉和页脚

在处理篇幅较长、结构复杂的PDF文档时&#xff0c;页眉和页脚的设计与插入就显得尤为重要。它们不仅扮演着美化文档、提升专业度的角色&#xff0c;更承担了导航指引、信息标注的重要功能。 页眉通常用于展示文档的标题或章节名称&#xff0c;有助于读者在翻阅过程中迅速定位所…

Java - 赋值运算符

在这个实战中&#xff0c;我们将学习赋值运算符的使用方法。首先&#xff0c;我们将介绍简单赋值运算符的基本概念和语法格式。然后&#xff0c;我们将通过案例演示来加深对赋值运算符的理解。接下来&#xff0c;我们将对比Java和Python这两种不同的编程语言&#xff0c;探讨它…

spring rest

controller 类的注解 Controller RequestMapping(“/api/ads”)类的方法的注解 ResponseBody GetMapping(“/postAds/{ad_id}”) - 查 PostMapping() - 增 PutMapping() - 改 DeleteMapping() PatchMapping()类的方法的参数的注解 PathVariable() RequestBody() RequestParam()…