2. 环境搭建:Node.js版本管理(nvm)、Docker与Docker Compose安装、Kubernetes(minikube)本地集群搭建
好,咱们正式开始动手了。这一章说白了就是「磨刀」——把开发环境搭好,后面写代码才不卡壳。我见过太多同学在环境上折腾一整天,结果还没开始写代码就心态崩了。别急,跟着我的节奏来,半小时搞定。
2.1 Node.js 版本管理:为什么非用 nvm 不可?
你想想看,微服务项目往往不止一个。有的服务跑在 Node 14,有的已经升级到 Node 18 甚至 20。如果全局只装一个版本,切换项目时就会遇到各种兼容性问题。我在项目中就吃过这个亏——一个老项目死活装不上依赖,最后发现是 Node 版本太高了。
nvm(Node Version Manager)就是来解决这个痛点的。它让你能在同一台机器上安装、切换多个 Node 版本,互不干扰。
安装 nvm
macOS 或 Linux 用户,打开终端执行:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Windows 用户我建议用 nvm-windows,去 GitHub 下载安装包就行。我个人习惯用 macOS,所以后面的命令都以 Unix 系为例。
安装完成后,重启终端或执行:
source ~/.bashrc
验证一下:
nvm --version
看到版本号就说明装好了。
常用命令速查
| 命令 | 说明 |
|---|---|
nvm ls |
查看已安装的 Node 版本 |
nvm ls-remote |
列出所有可安装的版本 |
nvm install 18.17.0 |
安装指定版本 |
nvm use 18.17.0 |
切换当前会话的 Node 版本 |
nvm alias default 18.17.0 |
设置默认版本 |
.nvmrc 文件,里面只写版本号,比如 18.17.0。这样进入项目时执行 nvm use,它会自动读取并切换。团队协作时特别有用。
2.2 Docker 与 Docker Compose:容器化是微服务的基础
微服务为什么离不开 Docker?说白了,每个服务都有自己的依赖环境。没有 Docker 之前,你部署一个服务要手动装各种包,还要担心跟别的服务冲突。Docker 把每个服务连同它的环境打包成一个「集装箱」,到哪都能跑。
安装 Docker Desktop
去 Docker 官网 下载对应系统的安装包。macOS 和 Windows 都有图形化安装器,一路下一步就行。Linux 用户用包管理器:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
安装完验证:
docker --version
docker compose version
Docker Compose 的作用
一个微服务系统通常有多个容器:数据库、消息队列、服务 A、服务 B……手动一个个启动太累了。Docker Compose 让你用一个 docker-compose.yml 文件定义所有服务,一条命令全部启动。
举个简单的例子,咱们后面会用到:
version: '3.8'
services:
redis:
image: redis:7-alpine
ports:
- "6379:6379"
postgres:
image: postgres:15
environment:
POSTGRES_DB: microservices
POSTGRES_USER: user
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
保存为 docker-compose.yml,然后执行:
docker compose up -d
两个服务就同时跑起来了。是不是很方便?
2.3 Kubernetes 本地集群:用 minikube 快速上手
Kubernetes(简称 K8s)是容器编排的事实标准。但说实话,在生产环境搭一个 K8s 集群挺复杂的。本地开发时,我们不需要那么大的阵仗,minikube 就是最好的选择——它能在你的笔记本上跑一个单节点的 K8s 集群。
安装 minikube
macOS 用户:
brew install minikube
Linux 用户:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
Windows 用户可以用 Chocolatey 安装:
choco install minikube
启动集群
minikube start --driver=docker
这里指定用 Docker 作为驱动,因为咱们已经装好了 Docker。minikube 会在 Docker 里创建一个虚拟机,然后在里面跑 K8s 组件。
启动后验证:
kubectl get nodes
看到 Ready 状态就说明集群跑起来了。
- Pod: K8s 里最小的部署单元,一个 Pod 可以包含一个或多个容器
- Service: 给 Pod 提供稳定的网络入口,因为 Pod 的 IP 是会变的
- Deployment: 管理 Pod 的副本数、滚动更新等
- ConfigMap / Secret: 管理配置和敏感信息
常用 kubectl 命令
| 命令 | 说明 |
|---|---|
kubectl get pods |
查看所有 Pod |
kubectl get services |
查看所有 Service |
kubectl apply -f file.yml |
应用一个 YAML 配置文件 |
kubectl logs pod-name |
查看 Pod 的日志 |
kubectl describe pod pod-name |
查看 Pod 的详细信息 |
minikube service 服务名 来暴露端口。或者用 kubectl port-forward 做端口转发。
2.4 验证环境:跑一个 Hello World
环境搭好了,咱们跑个简单的 Node.js 服务验证一下。创建一个 app.js:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Microservices!\n');
});
server.listen(3000, () => {
console.log('Server running on port 3000');
});
本地跑一下:
node app.js
浏览器访问 http://localhost:3000,看到「Hello from Microservices!」就说明 Node.js 环境没问题。
然后把它容器化。创建 Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY app.js .
EXPOSE 3000
CMD ["node", "app.js"]
构建镜像并运行:
docker build -t hello-microservice .
docker run -p 3000:3000 hello-microservice
同样能访问到。最后部署到 minikube:
kubectl create deployment hello --image=hello-microservice
kubectl expose deployment hello --type=NodePort --port=3000
minikube service hello
浏览器会自动打开,看到同样的输出。嗯,到这里,咱们的开发环境就全部就绪了。
- nvm 解决多版本 Node 切换问题,每个项目用
.nvmrc锁定版本 - Docker 让服务环境一致,Docker Compose 一键启动多服务
- minikube 提供本地 K8s 集群,适合开发和测试
- 三个工具配合使用,就是微服务开发的「三驾马车」
下一章咱们开始写第一个微服务,到时候这些环境就派上用场了。有什么问题欢迎随时交流。