Spring Cloud là một bộ công cụ mã nguồn mở được xây dựng trên nền tảng Spring Framework, chuyên hỗ trợ phát triển các hệ thống phân tán và kiến trúc vi dịch vụ. Thay vì xử lý thủ công các vấn đề như phát hiện dịch vụ, cân bằng tải, cách ly lỗi hay quản trị cấu hình, Spring Cloud cung cấp các thành phần tích hợp sẵn để tự động hóa và chuẩn hóa quy trình.
1. Máy Chủ Đăng Ký Dịch Vụ – Eureka Server
Eureka đóng vai trò trung tâm trong việc quản lý vòng đời của các dịch vụ: mỗi dịch vụ (provider) đăng ký thông tin như host, cổng và trạng thái hoạt động lên Eureka; các dịch vụ khác (consumer) không cần biết chi tiết triển khai mà chỉ cần truy vấn tên dịch vụ để nhận danh sách endpoint khả dụng. Cơ chế "heartbeat" định kỳ giữa client và server đảm bảo tính chính xác của bảng dịch vụ — nếu một instance ngừng gửi tín hiệu trong thời gian quy định, nó sẽ bị loại khỏi danh sách.
Cài đặt cơ bản:
- Thêm phụ thuộc cho máy chủ:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- Cấu hình
application.yml:
server:
port: 8761
spring:
application:
name: discovery-server
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka/
- Các ứng dụng client kích hoạt phát hiện dịch vụ bằng chú giải
@EnableDiscoveryClientvà cấu hình kết nối tới Eureka quaeureka.client.service-url.defaultZone.
2. Cân Bằng Tải Ở Phía Khách Hàng – Ribbon
Ribbon là thư viện client-side load balancing tích hợp sẵn trong Spring Cloud Netflix. Nó cho phép một ứng dụng gọi đến tên dịch vụ (ví dụ: service-order) thay vì URL cố định, sau đó tự động chọn một instance đang hoạt động dựa trên chiến lược như round-robin, random hoặc weighted response time.
Kích hoạt:
- Không cần thêm dependency riêng nếu đã dùng Eureka — Ribbon được tải ngầm.
- Đánh dấu
RestTemplatevới chú giải@LoadBalanced:
@Bean
@LoadBalanced
public RestTemplate createLoadBalancedTemplate() {
return new RestTemplate();
}
- Sử dụng tên dịch vụ trong URL:
String url = "http://service-payment/payment/process/" + txId;
PaymentResponse resp = restTemplate.getForObject(url, PaymentResponse.class);
3. Bảo Vệ Hệ Thống Với Hystrix
Hystrix giúp ngăn chặn hiệu ứng "bão tố lan truyền" (cascading failure) khi một dịch vụ phụ thuộc gặp sự cố. Bằng cách bao bọc các lệnh gọi mạng trong một "mạch điện", nó có thể cắt đứt tạm thời luồng yêu cầu (circuit breaker), thực thi hành vi dự phòng (fallback), hoặc giới hạn tài nguyên (thread isolation).
Triển khai:
- Thêm dependency:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- Kích hoạt mạch ngắt tại lớp khởi tạo:
@SpringBootApplication
@EnableCircuitBreaker
public class OrderApplication { ... }
- Áp dụng
@HystrixCommandvới phương thức gọi dịch vụ bên ngoài:
@HystrixCommand(fallbackMethod = "getInventoryFallback")
public InventoryStatus checkStock(Long skuId) {
return inventoryClient.getStatus(skuId);
}
private InventoryStatus getInventoryFallback(Long skuId) {
return new InventoryStatus(skuId, "UNAVAILABLE", 0);
}
4. Giao Tiếp Dịch Vụ Đơn Giản Hóa – OpenFeign
OpenFeign chuyển đổi các yêu cầu HTTP thành các interface Java thuần túy, giúp loại bỏ việc xây dựng URL thủ công và xử lý JSON thô. Mỗi interface đại diện cho một dịch vụ từ xa, được đánh dấu bằng @FeignClient, và các phương thức tương ứng với các endpoint REST.
Cách dùng:
- Thêm starter:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- Kích hoạt Feign:
@SpringBootApplication
@EnableFeignClients
public class CartApplication { ... }
- Định nghĩa client:
@FeignClient(name = "inventory-service", fallback = InventoryFallback.class)
public interface InventoryClient {
@GetMapping("/api/v1/stock/{sku}")
StockInfo getStock(@PathVariable("sku") String sku);
}
- Triển khai fallback (tùy chọn):
@Component
public class InventoryFallback implements InventoryClient {
@Override
public StockInfo getStock(String sku) {
return new StockInfo(sku, 0, "OUT_OF_STOCK");
}
}
5. Cổng Điều Khiển Tập Trung – Zuul Gateway
Zuul hoạt động như một cổng vào duy nhất cho toàn bộ hệ thống, thực hiện định tuyến yêu cầu, kiểm tra quyền truy cập, thêm header, ghi log hoặc giới hạn tốc độ. Các quy tắc định tuyến được cấu hình theo tên dịch vụ đã đăng ký tại Eureka, giúp tách biệt logic nghiệp vụ khỏi hạ tầng mạng.
Cấu hình cơ bản:
- Thêm dependency:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
- Định nghĩa route trong
application.yml:
zuul:
routes:
order-service:
path: /orders/**
serviceId: order-service
payment-service:
path: /payments/**
serviceId: payment-service
- Kích hoạt cổng:
@EnableZuulProxy
@SpringBootApplication
public class ApiGateway { ... }
Bộ lọc tùy chỉnh: kế thừa ZuulFilter để viết logic xác thực, kiểm tra token hoặc ghi nhật ký trước/sau khi chuyển tiếp yêu cầu.