springboot应用可以在docker swarm中部署多个副本,每个副本都要进行监控,使用端口映射和host模式部署的就不方便了。可以配合Prometheus可以和springboot在同一个网络中,配置Prometheus的服务发现,即可实现多副本监控。可以搭配联邦集群,实现有层次的监控架构
1、部署Prometheus
docker-compose.yml文件
version: "3.8"
services:
prometheus:
container_name: prometheus
user: root
restart: no
networks:
- appNet
ports:
- "9090:9090"
volumes:
- ./conf:/etc/prometheus/
- /var/run/docker.sock:/var/run/docker.sock
image: prom/prometheus:v2.52.0
privileged: true
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention=200h'
networks:
appNet:
external: trueprometheus.yml
dockerswarm_sd_configs为dockerswarm的服务发现
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: [ 'localhost:9090' ]
- job_name: 'dsb-services'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
relabel_configs:
# 筛选出特定服务名称的任务
- source_labels: [ __meta_dockerswarm_service_name ]
regex: dsb-service_dsb
action: keep
# 抛弃特定的任务
- source_labels: [ __meta_dockerswarm_network_name ]
regex: ingress
action: drop
# 筛选处于运行的
- source_labels: [ __meta_dockerswarm_task_desired_state ]
regex: running
action: keep
# 使用服务名称作为job名称
- source_labels: [ __meta_dockerswarm_service_name ]
target_label: job
# 使用任务ID作为instance标签
- source_labels: [ __meta_dockerswarm_task_id ]
target_label: instance
- source_labels: [ __meta_dockerswarm_task_slot ]
target_label: task_slot
# 设置指标抓取路径
- target_label: __metrics_path__
replacement: /actuator/prometheus
- target_label: node_address
replacement: ${__meta_dockerswarm_node_address}
metrics_path: /actuator/prometheus
scheme: httplabel标签示例,__address__会作为prometheus请求服务指标的host
__address__="10.0.6.17:8080"
__meta_dockerswarm_container_label_com_docker_stack_namespace="dsb-service"
__meta_dockerswarm_network_id="xs1glu8dal23wccjgtr598o0w"
__meta_dockerswarm_network_ingress="false"
__meta_dockerswarm_network_internal="false"
__meta_dockerswarm_network_name="appNet"
__meta_dockerswarm_network_scope="swarm"
__meta_dockerswarm_node_address="198.19.248.65"
__meta_dockerswarm_node_availability="active"
__meta_dockerswarm_node_hostname="orbstack"
__meta_dockerswarm_node_id="gmjoalka1y5dg9vbsj0rfqt5p"
__meta_dockerswarm_node_platform_architecture="aarch64"
__meta_dockerswarm_node_platform_os="linux"
__meta_dockerswarm_node_role="manager"
__meta_dockerswarm_node_status="ready"
__meta_dockerswarm_service_id="ri0bcgyszju20qen9gg1xhshf"
__meta_dockerswarm_service_label_com_docker_stack_image="dsb:3.0"
__meta_dockerswarm_service_label_com_docker_stack_namespace="dsb-service"
__meta_dockerswarm_service_label_description="This dsb service label"
__meta_dockerswarm_service_mode="replicated"
__meta_dockerswarm_service_name="dsb-service_dsb"
__meta_dockerswarm_task_container_id="9ecca0b591024b812d72022632618cc91813f69529ede50587c5e2bf4360bbb4"
__meta_dockerswarm_task_desired_state="running"
__meta_dockerswarm_task_id="62ssm283ntugpho0plbt312h3"
__meta_dockerswarm_task_port_publish_mode="ingress"
__meta_dockerswarm_task_slot="1"
__meta_dockerswarm_task_state="running"
__metrics_path__="/actuator/prometheus"
__scheme__="http"
__scrape_interval__="15s"
__scrape_timeout__="10s"
job="dsb-services"启动命令:
docker-compose -f docker-compose.yml up -d

2、Springboot项目添加依赖
Springboot在docker中部署、jvm优化,docker分层构建可以查看往期的文章
<!-- Spring Boot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>application.yml配置端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: alwayscompose文件示例:
version: "3.8"
services:
dsb:
image: dsb:3.0
environment:
SERVICE_ID: '{{.Service.ID}}'
SERVICE_NAME: '{{.Service.Name}}'
SERVICE_LABELS: '{{.Service.Labels}}'
NODE_ID: '{{.Node.ID}}'
NODE_HOSTNAME: '{{.Node.Hostname}}'
NODE_PLATFORM: '{{.Node.Platform}}'
TASK_ID: '{{.Task.ID}}'
TASK_NAME: '{{.Task.Name }}'
TASK_SLOT: '{{.Task.Slot}}'
POD_NAME: 'dsb-{{.Task.Slot}}'
ports:
- "8080:8080"
networks:
- appNet
stop_grace_period: 10s
volumes:
- ./logs:/logs
deploy:
mode: replicated
replicas: 3
endpoint_mode: vip
labels:
description: "This dsb service label"
resources:
limits:
cpus: '1.50'
memory: 500M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
placement:
constraints:
- "node.role==manager"
update_config:
parallelism: 1
delay: 10s
order: start-first
failure_action: rollback
networks:
appNet:
driver: overlay
external: true启动命令:
docker stack deploy -c compose.yml dsb-service