微服务

  • 微服务:拆分单体为多个独立服务,独立部署扩容,引入分布式难题。
  • 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-service

10.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

面板地址:http://10.0.0.100:9000

账号: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)。:

  1. Bucket(桶):顶层容器,相当于根目录,全局名称唯一;
  2. Object(对象):桶内存放的文件(图片、文档、视频等);
  3. Key:对象名称,用来定位桶内文件;
  4. 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

更多推荐