适用人群
本文适合具备基本Linux操作基础、了解HTML/Java/Go/Python其中任意一门语言的开发者,正在学习微服务概念但苦于不知如何从零搭建生产环境的初级架构师,以及尝试将单体应用拆分为微服务但屡屡在部署环节“卡壳”的技术团队新人,如果你已经能独立写“Hello World”但还没亲手把服务跑在公网上,这篇文章就是为你准备的。
完整建站流程:从域名到集群
第一步:服务器选型与采购(避开“过分廉价”的坑)
别一上来就盯着云厂商的“1核1G”新手套餐,微服务架构需要至少三个独立节点(网关、业务服务、数据库/中间件),最低配置建议:2核4G起步,硬盘40GB+SSD,推荐先买两台“入门型”(2核4G)和一台“计算型”(4核8G),操作系统统一选CentOS 7.9或Ubuntu 20.04,核心原则:内存比CPU更重要,因为Java/Go服务、Nginx和Redis都吃内存。
配置要点:
- 购买时勾选“分配公网IP”,默认带宽选5Mbps以上(小站够用)
- 安全组/防火墙先放行22(SSH)、80(HTTP)、443(HTTPS)、3306(MySQL内网)、6379(Redis内网)
- 避免使用阿里云“轻量应用服务器”直接跑微服务——它的磁盘IO和网络QoS受限,后期扩容麻烦
第二步:域名解析与环境初始化
- 在域名注册商(如GoDaddy、阿里云、腾讯云)购买一个.com或.cn域名。不要买奇怪的.top或.win,兼容性差、用户信任度低。
- 解析设置:添加A记录 和
www指向你网关服务器的公网IP,TTL设置600秒(调试期)或10分钟(稳定后)。 - 所有服务器执行:
# 关闭防火墙(开发环境) systemctl stop firewalld && systemctl disable firewalld # 设置主机名,避免容器间DNS混乱 hostnamectl set-hostname node1 # 第2台设node2,第3台设node3 echo "127.0.0.1 $(hostname)" >> /etc/hosts
踩坑提醒:很多新手在“防火墙已关”的情况下还访问不了8080端口,那是因为云平台的安全组规则没放行。云安全组和服务器防火墙是两个独立层,必须同时检查。
从零开始建站,微服务架构落地实战手册
第三步:Docker+Kubernetes集群搭建(你将成为“家庭作坊式”管理员)
强烈建议直接上Docker Compose(2-4个服务)或Kubernetes(5个以上服务),此处以Kubernetes为例:
- 所有节点安装Docker和kubeadm。
- 主节点初始化:
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=主节点内网IP
注意:
--apiserver-advertise-address必须用内网IP!否则节点间通信会走公网,延迟高且流量费爆炸。 - 安装Weave或Calico作为网络插件。
- 工作节点用kubeadm join加入集群。
- 安装Kubernetes Dashboard(可视化管理,方便新手观察Pod状态)。
配置要点:
- 所有节点docker的cgroup驱动必须与kubelet一致(推荐systemd)
- 如果服务器内存小于2GB,必须给kubelet加
--fail-swap-on=false(踩坑高频点) - 别忘了安装nfs-utils,否则动态存储卷会报错
第四步:程序打包与部署(从源码到镜像)
假设你已有三个微服务:user-service(用户)、order-service(订单)、api-gateway(网关)。
- 每个项目根目录创建
Dockerfile:FROM openjdk:11-jre-slim COPY target/*.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.profiles.active=prod"]
- 用
docker build -t yourname/service:v1 .构建镜像。 - 不想搭建私有仓库?用公共Docker Hub临时顶替(注意打不同tag避免冲突)。
- 编写Kubernetes Deployment YAML文件,关键是:
- 容器组(Pod)设置
resources: requests: memory: 512Mi防止超卖 - 环境变量
SPRING_PROFILES_ACTIVE=prod - 挂载配置文件(ConfigMap)和数据库密钥(Secret)
- 容器组(Pod)设置
踩坑提醒:新手常把数据库密码硬编码在代码里,或者通过环境变量写在Dockerfile中,正确做法:用Kubernetes Secret管理敏感信息,通过volume挂载到容器内。
第五步:网关层与SSL证书配置
微服务前端必须经过统一网关,Nginx或Kong都行,小团队推荐Nginx Ingress Controller。
- 安装Ingress Controller:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml
- 申请SSL证书:用LetsEncrypt的Certbot,但自动续期时,如果你的Kubernetes集群在NAT环境(内网IP),Certbot验证会失败,解决方案:使用DNS-01验证方式,在域名托管商处申请API Token,让Certbot自动写TXT记录。
- 编写Ingress资源:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: yourdomain.com http: paths: - path: /api/user pathType: Prefix backend: service: name: user-service port: number: 80 - path: /api/order pathType: Prefix backend: service: name: order-service port: number: 80
常见踩坑提醒(帮你少熬三个通宵)
- Pod持续CrashLoopBackOff:90%原因是
application.yml里的数据库连接串写错了,先kubectl logs pod名看错误日志,不要盲目重启。 - 域名解析生效但访问403:检查Ingress的SSL证书是否过期,或者后端Service的targetPort写错。
- 服务间调用超时:检查Kubernetes的Service名称解析是否正常,Pod内部执行
nslookup user-service,如果解析失败,检查CoreDNS是否正常。 - 数据库性能急剧下降:微服务模式下每个服务都有自己的数据库实例?错,小型项目依然建议共享一个主库,通过schema区分,每个服务单独一个数据库实例会极大增加运维复杂度。
- 日志散落在各Pod中:务必在部署初期就搭建ELK或Loki日志中心,否则当某Pod因OOM被杀死,日志随着容器消失,你连事故原因都查不到。
上线前最后检查清单
- [ ] 所有服务已通过Ingress暴露并正常返回200
- [ ] 数据库连接池大小适配(默认10太小,建议设为50)
- [ ] 至少配置一个健康检查端点(
/actuator/health) - [ ] 监控:Prometheus+Grafana已接入,可以看到CPU/内存/Pod状态
- [ ] 备份策略:每天凌晨dump数据库并上传到OSS
从刻板印象中的“大厂专用”到如今的中小网站标配,微服务架构的门槛正在快速降低,只要你从今天开始,把一台服务器变成两个Pod,就已经完成了最关键的一步,下一个30分钟,请打开购买链接,开始你第一次的集群搭建。



发表评论