3. 环境搭建:JDK、Maven、MySQL、Redis、RabbitMQ、Nginx的安装与配置

好,咱们开始动手了。这一章我带你把整个秒杀系统的地基打牢。说白了,后面所有的代码都要跑在这些组件上。我见过不少新手,代码写得挺溜,结果环境配了一周,各种版本冲突、端口占用,心态直接崩了。

我个人习惯,先把所有软件的版本定死。别用最新的,也别用太老的。下面这张表是我反复验证过的组合,你照着来,基本不会踩坑。

组件 推荐版本 备注
JDK 1.8 (8u202) 最后一个免费商用版本,稳定
Maven 3.6.3 兼容性好,别用3.8+,有坑
MySQL 5.7.35 8.0也行,但5.7更稳
Redis 6.2.6 支持ACL,性能足够
RabbitMQ 3.9.13 配合Erlang 24.x
Nginx 1.20.2 稳定版,模块丰富

3.1 JDK 安装:别小看这一步

JDK 1.8,我用了快十年了。你可能会问,现在都出到17了,为什么还用1.8?嗯,这里要注意:秒杀系统追求的是极致的稳定。1.8的生态最成熟,各种中间件、框架的兼容性最好。

安装步骤其实很简单,但我还是想啰嗦两句:

  1. 下载:去Oracle官网下载jdk-8u202-linux-x64.tar.gz。别下错了,要Linux版本的。
  2. 解压tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/
  3. 配置环境变量:编辑 /etc/profile,在末尾加上:
export JAVA_HOME=/usr/local/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

然后执行 source /etc/profile 让它生效。最后 java -version 验证一下。

我曾经踩过的坑: 有一次我忘了配置 CLASSPATH,结果编译的时候老是报找不到类。你想想看,一个简单的 HelloWorld 都跑不起来,排查了半天才发现是环境变量漏了。所以,这三行一个都不能少。

3.2 Maven:管理依赖的利器

Maven 说白了就是帮你下载 jar 包的工具。但它的精髓在于 settings.xml 的配置。我个人习惯,一定要配阿里云的镜像仓库,不然下载速度会让你怀疑人生。

安装步骤:

  1. 下载 apache-maven-3.6.3-bin.tar.gz
  2. 解压到 /usr/local/maven
  3. 配置环境变量,跟 JDK 类似,加个 MAVEN_HOME 就行
  4. 修改 conf/settings.xml,在 <mirrors> 标签里加上:
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>
小技巧: 我建议你同时配置一下本地仓库路径,默认在 ~/.m2/repository,如果你 C 盘空间紧张,可以改到其他盘。在 settings.xml 里加一行:<localRepository>/data/maven-repo</localRepository>

3.3 MySQL:数据存储的核心

MySQL 5.7,我推荐用二进制包安装,别用 yum。为什么?因为 yum 安装的版本往往不是最新的,而且目录结构比较乱。二进制包安装,所有文件都在一个目录下,管理起来方便。

安装步骤:

  1. 下载 mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
  2. 解压到 /usr/local/mysql
  3. 创建 mysql 用户:useradd -r -s /sbin/nologin mysql
  4. 初始化数据库:bin/mysqld --initialize --user=mysql

初始化完成后,会生成一个临时密码,记得记下来。然后启动 MySQL,用临时密码登录,再修改密码。

# 启动
bin/mysqld_safe --user=mysql &

# 登录
mysql -uroot -p

# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPassword123!';

秒杀系统的数据库优化点:

  • innodb_buffer_pool_size 设置为物理内存的 70%
  • 关闭 query_cache,秒杀场景下没用
  • 开启 binlog,方便数据恢复

3.4 Redis:扛住高并发的关键

Redis 安装最简单,编译一下就完事。但配置上,有几个参数必须调优。

# 下载、解压、编译
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make

# 修改 redis.conf
daemonize yes          # 后台运行
requirepass yourpass   # 设置密码,生产环境必须
maxmemory 4gb          # 限制最大内存
maxmemory-policy allkeys-lru  # 淘汰策略

为什么用 allkeys-lru?因为秒杀场景下,热点数据会频繁变化。LRU 策略能保证最近访问的数据留在内存里。我遇到过有人用 volatile-lru,结果过期时间没设置好,内存直接爆了。

3.5 RabbitMQ:削峰填谷的利器

RabbitMQ 依赖 Erlang,所以得先装 Erlang。版本一定要匹配,不然启动不了。

# 安装 Erlang 24.x
wget https://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/esl-erlang_24.3.3-1~centos~7_amd64.rpm
rpm -ivh esl-erlang_24.3.3-1~centos~7_amd64.rpm

# 安装 RabbitMQ
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.13/rabbitmq-server-3.9.13-1.el7.noarch.rpm
rpm -ivh rabbitmq-server-3.9.13-1.el7.noarch.rpm

启动后,记得开启管理插件:rabbitmq-plugins enable rabbitmq_management。然后访问 http://你的IP:15672,默认账号 guest/guest。

注意: 生产环境一定要改默认密码,而且建议创建一个专门用于秒杀系统的 vhost,跟其他业务隔离。我曾经见过一个事故,就是因为不同项目共用一个 vhost,结果一个队列满了,把整个 RabbitMQ 拖垮了。

3.6 Nginx:流量入口的守门员

Nginx 的安装,我推荐用源码编译。虽然麻烦点,但可以按需加载模块,性能更好。

# 下载源码
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2

# 编译安装
./configure --prefix=/usr/local/nginx \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-http_gzip_static_module

make && make install

配置方面,秒杀系统最核心的是限流和负载均衡。我一般会在 http 块里加上:

# 限流配置
limit_req_zone $binary_remote_addr zone=seckill:10m rate=100r/s;

# 负载均衡
upstream backend {
    server 192.168.1.10:8080 weight=5;
    server 192.168.1.11:8080 weight=5;
    server 192.168.1.12:8080 backup;
}

这样配置后,每个 IP 每秒最多请求 100 次,超过的直接返回 503。同时,三台后端服务器做负载均衡,其中一台作为备用。

我的经验: 刚开始做秒杀时,我总觉得 Nginx 配置越复杂越好。后来发现,简单才是王道。限流、负载均衡、静态资源缓存,这三样配好了,能挡住 90% 的流量冲击。其他的,交给业务层去处理。

好了,环境搭建就到这里。你把这些组件都装好、配好,后面的开发工作才能顺利进行。下一章,我们开始搭建项目骨架,写真正的秒杀代码。