Spring Boot Actuator là gì: Cách quản lý ứng dụng trên production 

Khi một ứng dụng Spring Boot được triển khai trên môi trường production, làm thế nào để bạn biết nó đang hoạt động ổn định, hiệu suất ra sao, hay các cấu hình đã chính xác chưa? Đây chính là lúc Spring Boot Actuator phát thay thế mạnh của mình. Bài viết sau sẽ giúp bạn hiểu rõ Spring Boot Actuator là gì – một công cụ không thể thiếu giúp lập trình viên và DevOps tự tin hơn khi vận hành ứng dụng trong môi trường thực tế.

Đọc bài viết này để hiểu rõ:

  • Spring Boot Actuator hoạt động thế nào? Mang lại lợi ích gì?
  • Các endpoint quan trọng trong Spring Boot Actuator
  • Cách cài đặt và cấu hình Spring Boot Actuator
  • Các phương pháp bảo mật cho các endpoints
  • Các thao tác nâng cao với Spring Boot Actuator

Spring Boot Actuator là gì?

Hiểu một cách đơn giản, Spring Boot Actuator là một sub-project (dự án con) của Spring Boot, được sinh ra để bổ sung các tính năng hỗ trợ triển khai và vận hành trong môi trường thực tế (production) cho ứng dụng của bạn. Khi tích hợp Actuator, nó sẽ tự động tạo ra các endpoint (điểm truy cập) dưới dạng API (thường là REST) để bạn có thể giám sát và tương tác với ứng dụng đang chạy.

Sử dụng Actuator mang lại nhiều lợi ích thiết thực, giúp việc vận hành ứng dụng trở nên đơn giản và minh bạch hơn rất nhiều.

Cơ chế hoạt động của Spring Boot Actuator

Cơ chế hoạt động cốt lõi của Spring Boot Actuator rất đơn giản. Khi bạn thêm thư viện Actuator vào dự án, nó sẽ tự động quét và cấu hình một loạt các endpoint bên trong ứng dụng của bạn.

Hình ảnh trên mô tả kiến trúc hoạt động của một ứng dụng Spring Boot sử dụng Spring Boot Actuator với các thành phần chính như sau:

  • Application Endpoint: Địa chỉ (URL) mà người dùng từ Internet sử dụng để truy cập ứng dụng của bạn 
  • Spring Boot Actuator: Thành phần trung tâm có nhiệm vụ nhận yêu cầu {serves} từ các endpoint và sau đó xử lý {runs} chạy trên 1 máy chủ tập trung cũng như nhận cảnh báo {alert} các lỗi trong quá trình xử lý từ Spring Boot Actuator Gateway (một trung tâm giám sát hoạt động  của hệ thống).
  • Spring Boot-VM-test: Máy chủ ảo (Virtual Machine) nơi ứng dụng Spring Boot của bạn được cài đặt và đang chạy được cung cấp bởi Amazon

Mỗi endpoint được thiết kế để thực hiện một nhiệm vụ giám sát hoặc quản lý cụ thể. Chúng được “phơi bày” (expose) ra ngoài thông qua hai giao thức chính:

  1. HTTP/HTTPS: Đây là cách phổ biến nhất. Actuator tạo ra các URL mà bạn có thể truy cập bằng trình duyệt hoặc các công cụ dòng lệnh như cURL. Ví dụ, truy cập vào http://your-app/actuator/health sẽ trả về thông tin sức khỏe của ứng dụng dưới dạng JSON.
  2. JMX (Java Management Extensions): Đối với các công cụ giám sát chuyên dụng hơn như JConsole hoặc VisualVM, bạn có thể kết nối và quản lý ứng dụng thông qua các MBean (Managed Beans) mà Actuator đã đăng ký.

Khi một yêu cầu được gửi đến một endpoint của Actuator, nó sẽ thu thập dữ liệu tương ứng từ bên trong Application Context của Spring (ví dụ: thông tin về beans, cấu hình, trạng thái kết nối) và trả về cho người dùng. Nhờ cơ chế này, bạn có thể “nhìn” sâu vào bên trong ứng dụng đang chạy một cách an toàn và có kiểm soát.

Để hiểu thêm về cơ chế hoạt động của Spring Boot Actuator, bạn có thể đọc bài blog này: The mechanics behind Spring Boot Actuator metrics configuration

 Lợi ích chính khi sử dụng Actuator

  • Giám sát độ ổn định hoạt động của ứng dụng và hệ thống (Health Checks) : Đây là một trong những tính năng quan trọng nhất. Actuator cung cấp một endpoint /health giúp bạn kiểm tra nhanh trạng thái tổng thể của ứng dụng. Không chỉ dừng lại ở việc báo “UP” hay “DOWN”, nó còn có thể kiểm tra tình trạng kết nối tới các thành phần phụ thuộc như database, message queue, hay các dịch vụ bên ngoài khác.
  • Thu thập và theo dõi số liệu (Metrics): Bạn cần biết ứng dụng đang dùng bao nhiêu bộ nhớ, CPU hoạt động ở mức nào, hay có bao nhiêu request HTTP đã được xử lý? Endpoint /metrics sẽ cung cấp tất cả các số liệu chi tiết này. Việc tích hợp với các hệ thống giám sát như Prometheus hay Grafana cũng trở nên vô cùng dễ dàng, giúp bạn có một cái nhìn trực quan về hiệu suất hệ thống theo thời gian.
  • Quản lý linh hoạt ngay khi chạy: Một số endpoint của Actuator cho phép bạn tương tác và thay đổi trạng thái của ứng dụng mà không cần khởi động lại. Ví dụ, bạn có thể thay đổi mức độ log (logging level) của một package cụ thể ngay lập tức để debug một vấn đề mà không làm gián đoạn dịch vụ.
  • Tăng cường khả năng chẩn đoán lỗi (Diagnostics): Khi có sự cố, việc truy cập vào các thông tin như cấu hình môi trường đang được áp dụng (/env), các bean đã được khởi tạo trong hệ thống (/beans), hay dấu vết của các request HTTP gần nhất (/httptrace) là cực kì quan trọng. Actuator giúp bạn truy xuất những thông tin này một cách nhanh chóng, rút ngắn đáng kể thời gian tìm ra nguyên nhân gốc rễ của vấn đề.

Các endpoint quan trọng nhất trong Spring Boot Actuator

Spring Boot Actuator cung cấp một tập hợp các endpoint mạnh mẽ để giám sát và quản lý ứng dụng. Dưới đây là những endpoint quan trọng nhất:

EndpointChức năng
/actuatorEndpoint gốc, liệt kê tất cả các endpoint khác đang hoạt động.
/actuator/healthKiểm tra trạng thái tổng quan của ứng dụng, bao gồm các thành phần phụ thuộc như database, dung lượng ổ đĩa, v.v.
/actuator/infoHiển thị thông tin tùy chỉnh về ứng dụng như phiên bản, thông tin build, v.v.
/actuator/metricsCung cấp số liệu chi tiết về hiệu suất ứng dụng: bộ nhớ JVM, số lượng request HTTP, CPU, v.v.
/actuator/loggersXem và thay đổi mức độ log của từng logger trong runtime mà không cần restart ứng dụng.
/actuator/envHiển thị tất cả biến môi trường và thuộc tính cấu hình hiện tại của ứng dụng.
/actuator/beansLiệt kê toàn bộ các Spring Bean đã được tạo và quản lý trong ứng dụng.
/actuator/shutdownCho phép tắt ứng dụng một cách an toàn (graceful shutdown); mặc định bị vô hiệu hóa.

Bắt đầu với Spring Boot Actuator: Cài đặt và Cấu hình

Việc tích hợp Spring Boot Actuator vào dự án của bạn cực kỳ đơn giản. Chỉ với vài bước cấu hình, bạn đã có thể mở khóa bộ công cụ giám sát mạnh mẽ này.

Bước 1: Thêm dependency

Đầu tiên, bạn cần khai báo dependency spring-boot-starter-actuator vào file quản lý của dự án.

Đối với Maven

Mở file pom.xml và thêm dependency sau vào trong thẻ <dependencies>:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Đối với Gradle

Mở file build.gradle và thêm vào đoạn code dependencies sau: 

dependencies { 
     implementation 'org.springframework.boot:spring-boot-starter-actuator' 
}

Sau khi thêm dependency và build lại dự án, Spring Boot sẽ tự động cấu hình Actuator cho bạn.

Bước 2: Expose các Endpoints

Vì lý do bảo mật, kể từ phiên bản Spring Boot 2.x, chỉ có hai endpoint được hiển thị (expose) mặc định qua HTTP là /actuator/health/actuator/info. Hầu hết các endpoint khác như /metrics, /env, /beans… đều được kích hoạt nhưng không thể truy cập qua web để tránh rò rỉ thông tin nhạy cảm.

Để có thể truy cập các endpoint khác, bạn cần khai báo chúng một cách tường minh trong file cấu hình application.properties hoặc application.yml.

Cách cấu hình

Mở file src/main/resources/application.properties (hoặc .yml) và thêm vào cấu hình sau:

Expose tất cả các endpoint (Thường dùng cho môi trường DEV):

Trong application.properties: management.endpoints.web.exposure.include=*

Trong application.yml:

management:

  endpoints:

    web:

      exposure:

        include: "*"

Lưu ý: Dấu * là một lựa chọn tiện lợi cho môi trường phát triển, nhưng hãy cẩn thận khi sử dụng trong môi trường production vì nó có thể làm lộ thông tin nhạy cảm.

Expose các endpoint cụ thể (Khuyến khích cho môi trường PROD)

Bạn nên liệt kê chính xác những endpoint mình cần.

Trong application.properties:

management.endpoints.web.exposure.include=health,info,metrics,prometheus

Trong application.yml:

management:
  endpoints:
    web:
      exposure:
        include: "health,info,metrics,prometheus"

Sau khi cấu hình xong, hãy khởi động lại ứng dụng. Giờ đây bạn có thể truy cập các endpoint đã expose qua URL, ví dụ: dùng lệnh sau để kiểm tra:  $ curl 'http://localhost:8080/actuator/metrics' -i -X GET Kết quả sau khi truy cập, bạn sẽ nhận được kết quả sau:

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 154

{
  "names" : [ "jvm.buffer.count", "jvm.buffer.memory.used", "jvm.buffer.total.capacity", "jvm.memory.committed", "jvm.memory.max", "jvm.memory.used" ]
}

Bảo mật cho Actuator endpoint

Tại sao phải bảo mật?

Việc có thể xem sâu vào bên trong ứng dụng là một lợi thế lớn, nhưng cũng đi kèm với rủi ro. Nếu không được bảo vệ, các endpoint của Actuator có thể trở thành một lỗ hổng bảo mật nghiêm trọng.

Hãy tưởng tượng một kẻ xấu có thể truy cập vào các endpoint của bạn:

  • Lộ thông tin nhạy cảm: Endpoint /env có thể phơi bày toàn bộ biến môi trường, bao gồm cả mật khẩu database, API keys, và các thông tin bí mật khác.
  • Thực hiện hành động nguy hiểm: Nếu endpoint /shutdown được kích hoạt và không bảo vệ, bất kỳ ai cũng có thể tắt ứng dụng của bạn chỉ bằng một request. Các endpoint khác như /loggers cũng có thể bị lợi dụng để thay đổi hành vi của ứng dụng.

Vì vậy, bảo mật các endpoint của Actuator là việc bắt buộc trong môi trường production.

Các phương pháp bảo mật

Dưới đây là các phương pháp phổ biến và hiệu quả để bảo vệ các endpoint của bạn.

  • Chạy trên một cổng (port) khác

Đây là một biện pháp giúp cô lập truy cập. Bạn có thể cấu hình để các endpoint của Actuator chạy trên một cổng mạng riêng biệt so với cổng chính của ứng dụng. Điều này cho phép bạn thiết lập các quy tắc tường lửa dễ dàng hơn cho cổng quản lý.

Cấu hình trong application.properties:

# Cổng chính của ứng dụng
server.port=8080
# Cổng riêng cho Actuator
management.server.port=9090

Bây giờ, ứng dụng sẽ chạy trên cổng 8080, nhưng các endpoint Actuator sẽ chỉ có thể truy cập qua cổng 9090 

  • Tích hợp với Spring Security

Đây là phương pháp mạnh mẽ và được khuyến khích nhất. Bằng cách thêm Spring Security vào dự án, tất cả các endpoint của Actuator (trừ /health/info trong một số cấu hình) sẽ tự động được bảo vệ và yêu cầu xác thực.

Chỉ cần thêm dependency spring-boot-starter-security, Spring Boot sẽ tự động cấu hình một lớp bảo mật cơ bản (HTTP Basic Authentication) cho tất cả các endpoint quản lý.

  • Hạn chế Expose Endpoints

Nguyên tắc cơ bản nhất: “Đừng phơi bày những gì bạn không cần”. Như đã đề cập ở phần trước, trong môi trường production, bạn chỉ nên expose những endpoint thực sự cần thiết.

Cấu hình trong application.properties:

# Chỉ cho phép truy cập health và prometheus để giám sát

management.endpoints.web.exposure.include=health,prometheus

  • Bảo mật qua Tường lửa/Mạng

Đây là một lớp bảo vệ ở tầng hạ tầng. Bạn nên cấu hình tường lửa (firewall) hoặc các quy tắc mạng (network policies) để chặn tất cả truy cập từ internet công cộng vào cổng quản lý của Actuator. Chỉ cho phép truy cập từ những dải IP tin cậy, chẳng hạn như mạng nội bộ của công ty hoặc qua VPN. Phương pháp này đặc biệt hiệu quả khi kết hợp với việc chạy Actuator trên một cổng riêng.

Các thao tác nâng cao: Tích hợp với Prometheus và Grafana

Mặc dù các endpoint của Actuator rất hữu ích để kiểm tra nhanh, sức mạnh thực sự của nó được phát huy khi kết hợp với các hệ thống giám sát chuyên nghiệp. PrometheusGrafana là bộ đôi “tiêu chuẩn vàng” trong thế giới giám sát hệ thống hiện đại, giúp bạn theo dõi hiệu suất ứng dụng một cách trực quan và liên tục.

Luồng hoạt động

Luồng dữ liệu hoạt động theo một chu trình đơn giản nhưng mạnh mẽ:

  1. Spring Boot Actuator: Thu thập các chỉ số (metrics) của ứng dụng và expose chúng tại một endpoint đặc biệt (/actuator/prometheus) dưới định dạng mà Prometheus có thể đọc được.
  2. Prometheus: Là một cơ sở dữ liệu chuỗi thời gian (time-series database). Nó được cấu hình để định kỳ truy cập (gọi là “cào” – scrape) vào endpoint /actuator/prometheus của ứng dụng để lấy dữ liệu metrics và lưu trữ lại.
  3. Grafana: Là công cụ trực quan hóa dữ liệu. Grafana kết nối tới Prometheus như một nguồn dữ liệu, sau đó cho phép bạn tạo ra các biểu đồ, bảng điều khiển (dashboard) đẹp mắt, dễ theo dõi và tùy biến cao từ các metrics đã được lưu trữ.

Các bước cấu hình cơ bản

Để thiết lập luồng hoạt động này, bạn cần thực hiện các bước sau:

Bước 1: Thêm Dependency cho Prometheus

Đầu tiên, bạn cần thêm thư viện micrometer-registry-prometheus vào dự án. Thư viện này giúp Actuator có thể xuất metrics theo định dạng của Prometheus.

  • Đối với Maven (pom.xml):
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
  • Đối với Gradle (build.gradle): implementation ‘io.micrometer:micrometer-registry-prometheus’

Bước 2: Expose Endpoint /prometheus

Tiếp theo, hãy chắc chắn rằng endpoint /prometheus được expose qua web trong file cấu hình của bạn.

  • Trong application.properties:
    management.endpoints.web.exposure.include=health,info,prometheus
  • Trong application.yml
management:
  endpoints:
    web:
      exposure:
        include: "health,info,prometheus"

Sau khi khởi động lại, ứng dụng của bạn sẽ có một endpoint tại http://localhost:8080/actuator/prometheus để Prometheus lấy dữ liệu.

Bước 3: Cấu hình Prometheus

Bạn cần có một server Prometheus đang chạy. Trong file cấu hình prometheus.yml của server đó, bạn thêm một “scrape job” mới để nó biết cần lấy dữ liệu từ đâu.

crape_configs:
  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus' # Đường dẫn tới endpoint
    static_configs:
      - targets: ['YOUR_APP_IP:8080'] # Địa chỉ IP và port của ứng dụng

Bước 4: Tạo Dashboard trên Grafana

Cuối cùng, bạn cài đặt Grafana, kết nối nó với server Prometheus của bạn như một “Data Source”. Từ đó, bạn có thể bắt đầu tạo các dashboard. Bạn có thể tự xây dựng các biểu đồ từ đầu hoặc import các dashboard có sẵn dành cho Spring Boot từ cộng đồng Grafana để có ngay một giao diện giám sát hoàn chỉnh.

Các câu hỏi thường gặp về Spring Boot Actuator

Có bắt buộc phải dùng Spring Security để bảo vệ Actuator không?

Không bắt buộc. Nhưng đó là cách được khuyến khích và phổ biến nhất. Ngoài Spring Security, bạn có thể áp dụng các biện pháp khác như:

  • Chạy Actuator trên một cổng (port) riêng và dùng tường lửa để giới hạn truy cập.
  • Đặt ứng dụng sau một API Gateway và cấu hình quyền truy cập tại Gateway.

Tuy nhiên, tích hợp với Spring Security cung cấp cơ chế bảo vệ linh hoạt và mạnh mẽ nhất ngay tại tầng ứng dụng.

Spring Boot Actuator khác gì với các công cụ APM như Datadog, New Relic?

  • Spring Boot Actuator đóng vai trò là một nhà cung cấp dữ liệu (Data Provider). Nó là công cụ tích hợp sẵn, miễn phí, giúp “phơi bày” các chỉ số, trạng thái sức khỏe, và thông tin vận hành từ bên trong ứng dụng Spring Boot. Nó cung cấp dữ liệu thô.
  • Các công cụ APM (Application Performance Management) như Datadog hay New Relic là các nền tảng giám sát toàn diện (Monitoring Platform). Chúng thu thập dữ liệu từ nhiều nguồn (bao gồm cả việc “cào” dữ liệu từ endpoint của Actuator), lưu trữ, phân tích, trực quan hóa và cung cấp các tính năng cao cấp như cảnh báo thông minh, phân tích sâu (distributed tracing), và phát hiện bất thường.

Tôi có thể tự tạo ra endpoint của riêng mình không?

Hoàn toàn có thể. Spring Boot Actuator rất linh hoạt và cho phép bạn định nghĩa các endpoint tùy chỉnh để thực hiện các hành động hoặc hiển thị thông tin đặc thù của ứng dụng.

Bạn có thể làm điều này bằng cách tạo một class với annotation @Endpoint và các phương thức với annotation @ReadOperation, @WriteOperation hoặc @DeleteOperation.

Ví dụ: 

  • Tạo một endpoint /clear-cache để xóa cache của ứng dụng mà không cần khởi động lại.
  • Tạo một endpoint /app-version để hiển thị phiên bản và ngày build của ứng dụng.

Quản lý Actuator trong môi trường Microservices như thế nào?

Khi bạn có hàng chục hoặc hàng trăm microservice, việc theo dõi từng endpoint của từng service riêng lẻ là không khả thi. Khi đó bạn cần đến Spring Boot Admin.

Spring Boot Admin là một ứng dụng web riêng biệt, do cộng đồng phát triển, cung cấp một giao diện người dùng tập trung để quản lý và giám sát tất cả các ứng dụng Spring Boot của bạn. Mỗi microservice sẽ “đăng ký” với Spring Boot Admin Server, và từ giao diện của Admin, bạn có thể xem trạng thái sức khỏe, metrics, cấu hình, thay đổi mức log… của tất cả các service một cách tập trung. Nó chính là công cụ “anh em” với Actuator trong kiến trúc microservices.

Tổng kết

Tóm lại, Spring Boot Actuator là một công cụ không thể thiếu để bạn tự tin đưa ứng dụng Spring Boot vào môi trường production. Nó cung cấp các khả năng giám sát và quản lý cốt lõi, giúp biến ứng dụng từ một “hộp đen” thành một hệ thống minh bạch. Việc tích hợp Actuator không chỉ giúp bạn nhanh chóng chẩn đoán sự cố mà còn là một bước đi quan trọng hướng tới việc xây dựng các hệ thống có khả năng quan sát (observable) cao.

TÁC GIẢ
Tien Tran
Tien Tran

iOS Developer

Có 4 năm kinh nghiệm trong lĩnh vực phát triển ứng dụng mobile, được chứng minh qua lịch sử làm việc ở các công ty lớn (VCCorp, KiotViet, Vega Fintech). Với đam mê tìm hiểu, nghiên cứu những kiến thức chuyên môn cần có của một lập trình viên mobile hiện nay như Swift, Objective C, Flutter, Kotlin,... Tiến mong muốn chia sẻ kinh nghiệm làm việc và truyền cảm hứng cho mọi người muốn theo đuổi con đường trở thành một nhà phát triển ứng dụng di động chuyên nghiệp trong tương lai.