GaGa's Blog

One GaGa, One World !

要一个 RockyLinux9 最小可用的多阶段构建镜像,能编译并运行 go-sqlite3因为 go-sqlite3 需要 sqlite-devel (编译阶段) + sqlite-libs (运行阶段),所以我们只要保证 builder 和 runtime 两个阶段分别装对依赖就行。

最小化的Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# ---------- builder 阶段 ----------
FROM rockylinux:9 AS builder

# 安装构建依赖 (gcc + sqlite-devel)
RUN dnf -y groupinstall "Development Tools" && \
dnf -y install golang sqlite-devel && \
dnf clean all

WORKDIR /app

# 设置 CGO
ENV CGO_ENABLED=1 \
GOOS=linux \
GOARCH=amd64

# 先下载依赖,避免源码频繁变动导致重复编译
COPY go.mod go.sum ./
RUN go mod download

# 拷贝源码并编译
COPY . .
RUN go build -ldflags="-w -s" -o app .

# ---------- runtime 阶段 ----------
FROM rockylinux:9 AS runtime

# 仅安装运行时依赖 (sqlite-libs),保持镜像尽量小
RUN dnf -y install sqlite-libs && \
dnf clean all

WORKDIR /app

# 从 builder 复制二进制
COPY --from=builder /app/app .

CMD ["./app"]

解释

Read more »

Tomcat 与 Redis 结合做 Session 管理的本质,是让 Tomcat 把原本本地内存中的 StandardManager 替换为一个分布式的 RedisSessionManager,所有节点共享同一个 Redis,实现真正的横向扩展

Tomcat 装 Session Manager 模块 → 修改 server.xml → 配置 Redis → 重启验证 → 多节点压测。

步骤一:准备 Redis 环境

  1. 单节点环境可先跑 Redis(不过生产必须 Redis Cluster / Sentinel)。

  2. 业务上需要注意:Redis 配持久化 RDB+AOF 或至少 AOF appendfsync everysec,避免宕机丢会话。

Read more »

Python 世界里,pip 就像是宇宙飞船的推进器,不装它你就只能在原地踏步。

1.检查系统里是否已有 pip

1
2
3
python3 -m pip --version
pip --version
pip3 --version

若已有 pip,会直接显示版本。

Read more »

在分布式架构里,Tomcat 的 Session 不再是单机,而要变成可跨节点访问的“共享状态”。核心目的是在多节点负载均衡时保持用户无感的一致会话体验

主流方案分为三类:

  • 会话复制
  • 集中存储
  • 彻底无状态化。

外部集中式会话存储

Read more »

alias vs root 的本质区别

1.1.root 是“前缀拼接”

root 会把 location 匹配到的 URI 片段“拼接”到文件系统路径后面。

location /img/ {
    root /data/www;
}
# 访问 /img/a.png → 文件路径 /data/www/img/a.png
Read more »

一、最常见的写法(主机 8000 → 容器 8082)

docker-compose.yml 里:

1
2
3
4
5
6
7
version: "3.8"

services:
web:
image: myapp:latest
ports:
- "8000:8082" # 主机:容器

解释:

Read more »

1.直接挂载宿主机 /etc/localtime/etc/timezone

1
2
3
4
5
6
services:
app:
image: myapp:latest
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro # centos7
  • :ro 表示只读挂载,防止容器修改宿主机时间。
  • 这样容器会使用宿主机的时区和时间。

Read more »

mvn clean package -Dmaven.test.skip=true -P pro

  • 1 clean
    清理项目的 target/ 目录,确保构建从干净环境开始。

  • 2 package
    执行 Maven 的生命周期到 package 阶段,通常会生成 .jar.war 包。

  • 3 -Dmaven.test.skip=true
    跳过测试用例的 执行编译
    这是一个 JVM 系统属性,Maven 构建时会跳过 Surefire/Failsafe 测试任务。

  • 4 -P pro
    它表示 激活 Maven Profile:pro
    Profile 是 Maven 用来实现“不同环境构建”的机制,例如 devtestprepro 等。

- P pro 在哪里读取配置

  • pom.xml(最常见)
    项目的 pom.xml 内部定义:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <profiles>
    <profile>
    <id>pro</id>
    <properties>
    <env>prod</env>
    </properties>
    <activation>
    <activeByDefault>false</activeByDefault>
    </activation>
    </profile>
    </profiles>
  • ~/.m2/settings.xml(用户级别配置)
    这里也可以定义 profile,例如仓库源、私服账号:

    1
    2
    3
    4
    5
    6
    7
    8
    <profiles>
    <profile>
    <id>pro</id>
    <properties>
    <nexus.url>http://nexus.example.com</nexus.url>
    </properties>
    </profile>
    </profiles>
  • 全局 settings.xml(Maven 安装目录 conf/settings.xml)

Read more »

集群脑裂(Split-Brain)像是“同一个大脑被硬生生裂成两个”,两个节点或多个节点因为通信中断,各自误以为对方挂了,于是纷纷把自己当成“合法主节点”。
这会导致一个危险局面:出现多个主节点同时对外提供写入服务,数据就像被两个平行宇宙分别改写,最终回到现实世界只能引爆混乱(数据冲突、版本不一致、服务错乱)。

脑裂是分布式系统的天敌,它本质是对“共识”失败的暴露:节点失去彼此的视野,让一致性算法失去了基础。

典型诱因包括:

  • 网络抖动、延迟、短暂隔离
  • 仲裁节点不够(例如偶数节点)
  • 心跳机制过于敏感或超时时间太短
  • 资源耗尽导致心跳丢包(CPU/RAM/IO 抖动)
Read more »

Java 启动时确实可以同时加载多个 agent,只要它们都通过 -javaagent: 形式添加即可。JVM 在启动阶段会按顺序依次调用每个agentpremain 方法(或在 attach 时调用 agentmain)。

1.启动示例

假设你有两个 Agent:A 和 B,启动 Java 时可以这样写:

java \
 -javaagent:/opt/agentA.jar=cfgA \
 -javaagent:/opt/agentB.jar=cfgB \
 -jar app.jar
Read more »

Linux 系统中,dns1dns2 通常表示 主 DNS(Primary DNS)备用 DNS(Secondary DNS),它们是系统用于域名解析的服务器地址


一、定义与作用

项目 含义 优先级 作用
DNS1 主 DNS 服务器 优先使用 首选的域名解析服务器
DNS2 备用 DNS 服务器 备用使用 当主 DNS 无响应或解析失败时使用
Read more »
0%