微服务、APISIX 部署、对象存储与 ELK (二十)
微服务
- 微服务:拆分单体为多个独立服务,独立部署扩容,引入分布式难题。
- ZooKeeper:分布式协调工具,实现注册中心、配置管理、分布式锁、集群选主。
- Kafka:高吞吐消息队列,完成异步解耦、削峰填谷、日志传输。
- Nacos:一站式组件,兼具服务注册发现 + 动态配置中心。
- Sentinel:流量防护框架,实现限流、熔断、降级,防止服务雪崩。
- Seata:分布式事务框架,保障跨微服务的数据一致性。
- Spring Cloud Gateway:SpringCloud 官方微服务网关,统一入口,负责路由、鉴权、流量管控。
apisix的部署,Apache APISIX 集成 Nacos 实现服务发现项目
10.0.0.100:ETCD、Apache APISIX、APISIX Dashboard、Nacos
10.0.0.101:Provider 服务,端口 8001,注册服务名:
provider-service10.0.0.102:Consumer 服务,端口 8002 实验目标:APISIX 通过 Nacos 动态发现 Provider,客户端访问 APISIX,自动转发到 Provider,无需在网关写死后端 IP。
10.0.0.100 执行,安装 Docker
sudo apt update
sudo apt install docker.io -y
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
10.0.0.100 依次部署组件
创建容器网络
docker network create apisix-net
部署 Nacos(注册中心)
docker run -d \
--name nacos \
--network apisix-net \
-p 8848:8848 -p 9848:9848 \
-e MODE=standalone \
nacos/nacos-server:v2.3.2
访问地址:http://10.0.0.100:8848/nacos 账号:nacos|密码:nacos
部署 ETCD(APISIX 配置仓库)
docker run -d \
--name etcd \
--network apisix-net \
-p 2379:2379 \
-e ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 \
apache/apisix-etcd:3.8.0
部署 Apache APISIX(开启 Nacos 服务发现)
mkdir -p /data/apisix/conf
写入配置文件
cat > /data/apisix/conf/config.yaml <<'EOF'
apisix:
admin_key:
- name: admin
key: edd1c9f034335f136f87ad84b625c8f1
role: admin
discovery:
nacos:
host:
- "10.0.0.100"
port: 8848
namespace_id: "public"
group_name: "DEFAULT_GROUP"
EOF
启动 APISIX
docker run -d \
--name apisix \
--network apisix-net \
-p 9080:9080 \
-p 9180:9180 \
-v /data/apisix/conf:/usr/local/apisix/conf \
-e APISIX_ETCD_HOST=http://etcd:2379 \
apache/apisix:3.8.0
9080:业务流量入口
9180:管理 API 端口
部署 APISIX Dashboard(可视化面板)
docker run -d \
--name apisix-dashboard \
--network apisix-net \
-p 9000:9000 \
-e APISIX_ADMIN_API_URL=http://apisix:9180 \
apache/apisix-dashboard:3.0.0
账号:admin|密码:admin
业务服务配置
10.0.0.101 Provider 应用配置(SpringBoot)
application.yml
spring:
application:
name: provider-service
cloud:
nacos:
discovery:
server-addr: 10.0.0.100:8848
server:
port: 8001
启动项目,登录 Nacos 后台,确认服务列表出现 provider-service。
10.0.0.102 Consumer 应用
spring:
application:
name: provider-service
cloud:
nacos:
discovery:
server-addr: 10.0.0.100:8848
server:
port: 8001
启动项目,登录 Nacos 后台,确认服务列表出现 provider-service
10.0.0.102 Consumer 应用
Consumer 可调用 Provider
APISIX 创建路由,启用 Nacos 服务发现
在 10.0.0.100 终端执行:
curl http://127.0.0.1:9180/apisix/admin/routes/10 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-X PUT -d '{
"uri": "/provider/*",
"upstream": {
"service_name": "provider-service",
"discovery_type": "nacos",
"type": "roundrobin"
}
}'
discovery_type: "nacos" 开启服务发现,不再填写静态 IP;
service_name 和 Nacos 内注册服务名称保持一致。
防火墙放行(10.0.0.100)
sudo ufw allow 8848,2379,9080,9180,9000/tcp
验证实验
访问网关:
curl http://10.0.0.100:9080/provider/hello
对象存储
对象存储(Object Storage)是一种非结构化数据存储架构,数据以「对象」形式存放。 对象 = 文件数据 + 元数据 + 唯一标识(Object Key)。:
- Bucket(桶):顶层容器,相当于根目录,全局名称唯一;
- Object(对象):桶内存放的文件(图片、文档、视频等);
- Key:对象名称,用来定位桶内文件;
- Endpoint:对象存储服务访问地址。
对比文件存储:文件存储依赖目录层级;对象存储扁平化结构,适合海量图片、日志、附件存储,支持 RESTful API 访问,弹性扩容。
主流开源实现:MinIO(课程最常用);商用:阿里云 OSS、腾讯云 COS。
MinIO 是兼容 S3 协议的开源对象存储。核心概念:Bucket(桶)、Object(对象)。
MinIO 二进制部署
Ubuntu24.04 10.0.0.100
创建工作目录
mkdir -p /opt/minio/{bin,data,conf,logs}
cd /opt/minio/bin
下载 MinIO 二进制文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio
添加执行权限
chmod +x minio
配置环境变量(账号密码)
cat > /opt/minio/conf/minio.env <<EOF
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=12345678
EOF
创建 systemd 系统服务(后台常驻,开机自启)
cat > /etc/systemd/system/minio.service <<EOF
[Unit]
Description=MinIO Object Storage
After=network.target
[Service]
EnvironmentFile=/opt/minio/conf/minio.env
ExecStart=/opt/minio/bin/minio server /opt/minio/data --address 0.0.0.0:9000 --console-address 0.0.0.0:9001
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
加载服务、启动 MinIO
systemctl daemon-reload
systemctl start minio
systemctl enable minio
查看运行状态
systemctl status minio
防火墙放行端口
sudo ufw allow 9000,9001/tcp
浏览器:http://10.0.0.100:9001账号:admin 密码:12345678端口说明
9000:S3 API 服务端口(程序对接)
9001:Web 管理控制台
登录控制台,新建桶 demo-bucket
上传文件、预览、生成分享链接、删除对象
安装 mc 客户端远程管理
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/bin
# 连接minio
mc alias set myminio http://10.0.0.100:9000 admin 12345678
mc ls myminio
ELK
ELK = Elasticsearch + Logstash + Kibana
Elasticsearch(ES):分布式搜索引擎,存储、检索日志;
Logstash:日志采集、过滤、清洗、转发;
Kibana:可视化 Web 面板,查询、绘图、监控日志。 拓展:Filebeat(轻量采集器,替代 Logstash 做客户端采集,减少资源占用)
实验
10.0.0.100:Elasticsearch、Logstash、Kibana
10.0.0.101:Provider 服务,部署 Filebeat 采集日志
10.0.0.102:Consumer 服务,部署 Filebeat 采集日志
10.0.0.100 执行
安装 JDK17(ELK8.x 必备)
sudo apt update
sudo apt install openjdk-17-jdk -y
java -version
关闭内存交换
sudo swapoff -a
# 永久注释fstab关闭swap
sudo sed -i '/swap/s/^/#/' /etc/fstab
调整系统最大文件句柄
cat >> /etc/security/limits.conf <<EOF
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535
EOF
下载安装 ELK 8.11.0(二进制包安装)
统一存放目录 /opt/elk
mkdir -p /opt/elk
cd /opt/elk
Elasticsearch 部署
# 下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-8.11.0-linux-x86_64.tar.gz
mv elasticsearch-8.11.0 elasticsearch
# ES禁止root运行,创建用户
sudo useradd elasticsearch
sudo chown -R elasticsearch:elasticsearch /opt/elk/elasticsearch
修改配置 /opt/elk/elasticsearch/config/elasticsearch.yml
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
创建 systemd 服务
cat > /etc/systemd/system/elasticsearch.service <<EOF
[Unit]
Description=Elasticsearch
After=network.target
[Service]
User=elasticsearch
Group=elasticsearch
ExecStart=/opt/elk/elasticsearch/bin/elasticsearch
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start elasticsearch
systemctl enable elasticsearch
# 验证
curl http://10.0.0.100:9200
Logstash 部署
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.11.0-linux-x86_64.tar.gz
tar -zxvf logstash-8.11.0-linux-x86_64.tar.gz
mv logstash-8.11.0 logstash
新建采集配置 /opt/elk/logstash/config/logstash-sample.conf
input {
beats {
port => 5044
}
}
filter {
}
output {
elasticsearch {
hosts => ["http://10.0.0.100:9200"]
index => "service-log-%{+YYYY.MM.dd}"
}
}
logstash systemd 服务
cat > /etc/systemd/system/logstash.service <<EOF
[Unit]
Description=Logstash
After=network.target elasticsearch.service
[Service]
ExecStart=/opt/elk/logstash/bin/logstash -f /opt/elk/logstash/config/logstash-sample.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start logstash
systemctl enable logstash
Kibana 部署
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.11.0-linux-x86_64.tar.gz
tar -zxvf kibana-8.11.0-linux-x86_64.tar.gz
mv kibana-8.11.0 kibana
修改配置 /opt/elk/kibana/config/kibana.yml
server.host: "0.0.0.0"
server.port: 5601
elasticsearch.hosts: ["http://10.0.0.100:9200"]
xpack.security.enabled: false
Kibana systemd
cat > /etc/systemd/system/kibana.service <<EOF
[Unit]
Description=Kibana
After=network.target elasticsearch.service
[Service]
ExecStart=/opt/elk/kibana/bin/kibana
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kibana
systemctl enable kibana
访问 Kibana:http://10.0.0.100:5601
防火墙放行(10.0.0.100)
sudo ufw allow 9200,5044,5601/tcp
Filebeat 部署(10.0.0.101 / 10.0.0.102 两台业务机)
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.11.0-linux-x86_64.tar.gz
tar -zxvf filebeat-8.11.0-linux-x86_64.tar.gz
mv filebeat-8.11.0 filebeat
cd filebeat
修改 filebeat.yml
filebeat.inputs:
- type: filestream
paths:
- /opt/provider/logs/*.log # 修改为你的项目日志路径
output.logstash:
hosts: ["10.0.0.100:5044"]
前台测试启动:
./filebeat -e
更多推荐
所有评论(0)