Trong môi trường sản xuất phức tạp, có thể triển khai hàng ngàn dịch vụ Dubbo với lưu lượng liên tục và các dịch vụ giao tiếp với nhau. Hệ thống phân tán có thể gặp sự cố do lưu lượng tăng đột biến, tải hệ thống cao hoặc độ trễ mạng, dẫn đến dịch vụ không khả dụng. Nếu không kiểm soát phù hợp, có thể xảy ra lỗi dây chuyền ảnh hưởng đến tính khả dụng của dịch vụ. Do đó, việc quản lý lưu lượng hợp lý là chìa khóa đảm bảo ổn định dịch vụ.
Sentinel là sản phẩm kiểm soát lưu lượng mã nguồn mở từ Alibaba, tập trung vào kiến trúc dịch vụ phân tán. Nó tiếp cận thông qua lưu lượng, hỗ trợ bảo vệ tính ổn định dịch vụ từ nhiều góc độ như kiểm soát lưu lượng, cắt mạch giảm tải và bảo vệ tải hệ thống.
Kết nối nhanh với Sentinel
Sentinel nâng cao tính khả dụng của dịch vụ trong các tình huống cực đoan bằng cách hạn chế lưu lượng ở cả nhà cung cấp và người tiêu dùng dịch vụ. Dưới đây là cách triển khai kỹ thuật.
Chỉ cần thêm các module sau (ví dụ với Maven):
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-apache-dubbo-adapter</artifactId>
<version>1.8.6</version>
</dependency>
<!-- Tùy chọn -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.6</version>
</dependency>
Sau khi thêm dependency, các interface và phương thức dịch vụ Dubbo sẽ trở thành tài nguyên trong Sentinel. Khi cấu hình quy tắc, chúng tự động được bảo vệ bởi Sentinel.
sentinel-apache-dubbo-adapterchứa triển khai Sentinel Filter và sẽ tự động kích hoạt. Để tắt một Filter cụ thể, cấu hình ví dụ:dubbo.provider.filter="-sentinel.dubbo.consumer.filter".
Chi tiết ví dụ
Hạn chế lưu lượng phía Nhà cung cấp
Kiểm soát lưu lượng nhà cung cấp có hai khía cạnh: khả năng tự bảo vệ của nhà cung cấp và phân phối yêu cầu từ người tiêu dùng.
Thiết lập hạn chế dựa trên QPS
Để bảo vệ Provider khỏi bị quá tải bởi lưu lượng tăng đột biến, cấu hình hạn chế chế độ QPS. Khi số lượng yêu cầu mỗi giây vượt ngưỡng, các yêu cầu vượt mức sẽ tự động bị từ chối.
Cấu hình hạn chế QPS cấp dịch vụ với QPS tối đa là 10:
// Giới hạn ServiceDemo ở 10 QPS
FlowRule ruleQps = new FlowRule();
// Lưu ý: tên tài nguyên là tên interface
ruleQps.setResource(ServiceDemo.class.getName());
ruleQps.setCount(10);
ruleQps.setLimitApp("default");
ruleQps.setGrade(RuleConstant.FLOW_GRADE_QPS);
FlowRuleManager.loadRules(Collections.singletonList(ruleQps));
Cấu hình hạn chế QPS cấp phương thức với QPS tối đa là 5:
// Giới hạn phương thức greetAgain ở 5 QPS
FlowRule methodRule = new FlowRule();
// Lưu ý: tên tài nguyên bao gồm chữ ký phương thức
methodRule.setResource(ServiceDemo.class.getName() + ":greetAgain(java.lang.String)");
methodRule.setCount(5);
methodRule.setLimitApp("default");
methodRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
FlowRuleManager.loadRules(Collections.singletonList(methodRule));
Khởi chạy quy trình người tiêu dùng và liên tục gọi. Nhật ký sau khi hạn chế có hiệu lực:
2018-07-24 17:13:43|1|com.example.sentinel.demo.ServiceDemo:greetAgain(java.lang.String),FlowException,default,|5,0
Hạn chế QPS cho người tiêu dùng cụ thể
Hạn chế QPS trong phần trước áp dụng cho tất cả lưu lượng người tiêu dùng. Có thể hạn chế QPS từ người tiêu dùng cụ thể (nhận diện bằng tên ứng dụng dubbo) bằng flowRule.setLimitApp("consumer-app"); với consumer-app là tên ứng dụng người tiêu dùng:
//...
// Chỉ có hiệu lực với người tiêu dùng có tên ứng dụng "consumer-app"
ruleQps.setLimitApp("consumer-app");
ruleQps.setGrade(RuleConstant.FLOW_GRADE_QPS);
FlowRuleManager.loadRules(Collections.singletonList(ruleQps));
Nhật ký hạn chế sẽ ghi lại tên người gọi, ví dụ consumer-app:
2018-07-25 16:26:48|1|com.example.sentinel.demo.ServiceDemo:greetAgain(java.lang.String),FlowException,default,consumer-app|5,0
Lưu ý: Để
limitAppcó hiệu lực, cần gọiRpcContext.getContext().setAttachment("dubboApplication", "consumer-app")để xác định danh tính. Nếu người tiêu dùng đã bao gồmsentinel-apache-dubbo-adapter, không cần gọi thêm.
Thiết lập phương thức xử lý khi hạn chế
Gọi DubboAdapterGlobalConfig.setProviderFallback() để thiết lập callback khi hạn chế xảy ra, cho phép tùy chỉnh hành động:
DubboAdapterGlobalConfig.setProviderFallback((invoker, invocation, ex) -> {
System.out.println("Bị chặn bởi Sentinel: " + ex.getClass().getSimpleName() + ", " + invocation);
return AsyncRpcResult.newDefaultAsyncResult(ex.toRuntimeException(), invocation);
});
Hạn chế lưu lượng phía Người tiêu dùng
Kiểm soát lưu lượng người tiêu dùng bao gồm kiểm soát số luồng đồng thời và giảm tải dịch vụ.
Hạn chế số luồng đồng thời
Khuyến nghị cấu hình hạn chế chế độ số luồng cho Consumer để đảm bảo bản thân không bị ảnh hưởng bởi dịch vụ không ổn định. Ở chế độ này, không cần cách ly thread pool rõ ràng. Sentinel kiểm soát số luồng của tài nguyên, từ chối yêu cầu vượt mức cho đến khi xử lý xong các luồng tích lũy, đạt hiệu quả cách ly tín hiệu.
Thiết lập số luồng đồng thời tối đa cho phương thức processConsumerFlow, hạn chế xảy ra khi vượt quá 3 luồng:
FlowRule threadRule = new FlowRule();
threadRule.setResource("org.apache.dubbo.samples.sentinel.ServiceDemo:processConsumerFlow(java.lang.String)");
threadRule.setCount(3);
threadRule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
FlowRuleManager.loadRules(Collections.singletonList(threadRule));
Thiết lập callback khi hạn chế xảy ra (tùy chọn):
DubboAdapterGlobalConfig.setConsumerFallback((invoker, invocation, ex) -> {
System.out.println("Bị chặn bởi Sentinel: " + ex.getClass().getSimpleName() + ", " + invocation);
return AsyncRpcResult.newDefaultAsyncResult(ex.toRuntimeException(), invocation);
});
Cắt mạch giảm tải dịch vụ
Khi dịch vụ phụ thuộc vào nhiều dịch vụ phía dưới và một dịch vụ chậm, nó ảnh hưởng đến dịch vụ hiện tại. Sử dụng tính năng cắt mạch giảm tải của Sentinel, cấu hình quy tắc giảm tải dựa trên RT trung bình. Khi RT trung bình của một cuộc gọi tăng, vượt quá ngưỡng RT đã cấu hình trong một số lần nhất định, Sentinel sẽ giảm tải tài nguyên gọi, từ chối ngay lập tức các cuộc gọi tiếp theo cho đến khi hết thời gian phục hồi, bảo vệ dịch vụ khỏi ảnh hưởng của điểm yếu phía gọi. Kết hợp với chức năng fallback để xử lý khi bị giảm tải.
Thiết lập chiến lược giảm tải cho processConsumerDowngrade, tự động giảm tải khi tỷ lệ lỗi cuộc gọi đạt 70%:
@Component
static class SentinelDowngradeConfig implements CommandLineRunner {
@Override
public void run(String... args) {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource("org.apache.dubbo.samples.sentinel.ServiceDemo:processConsumerDowngrade(java.lang.String)");
degradeRule.setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType());
degradeRule.setCount(0.7); // Ngưỡng tỷ lệ lỗi 70%
degradeRule.setMinRequestAmount(100);
degradeRule.setStatIntervalMs(30000); // 30 giây
degradeRule.setTimeWindow(10);
rules.add(degradeRule);
DegradeRuleManager.loadRules(rules);
}
}
Bảng điều khiển Sentinel
Bảng điều khiển Sentinel là điểm vào để quản lý và cấu hình thống nhất quy tắc kiểm soát lưu lượng, cắt mạch giảm tải, đồng thời cung cấp chức năng giám sát đa chiều. Trên bảng điều khiển:
- Cấu hình quy tắc động và xem hiệu quả kiểm soát lưu lượng thời gian thực
- Xem danh sách máy và tình trạng sức khỏe
Cách kết nối ứng dụng với bảng điều khiển
Các bước kết nối (phải thực hiện đầy đủ):
- Khởi động bảng điều khiển theo tài liệu Sentinel
- Ứng dụng thêm dependency
sentinel-transport-simple-httpđể bảng điều khiển có thể kéo thông tin - Thêm tham số khởi động cho ứng dụng và khởi chạy. Các tham số cần cấu hình:
-Dcsp.sentinel.api.port: Cổng client để báo cáo thông tin (mặc định 8719)-Dcsp.sentinel.dashboard.server: Địa chỉ bảng điều khiển-Dproject.name: Tên ứng dụng, hiển thị trên bảng điều khiển
Sau khi khởi chạy ứng dụng, có thể tìm thấy ứng dụng trên bảng điều khiển.
Giới thiệu chức năng bảng điều khiển
- Giám sát thiết bị đơn lẻ: Khi thấy máy trong danh sách, nghĩa là đã kết nối thành công. Có thể xem tên máy, địa chỉ IP, cổng, trạng thái sức khỏe và thời gian heartbeat.
- Giám sát chuỗi liên kết: Chuỗi điểm cụm kéo trạng thái hoạt động của tài nguyên client theo thời gian thực. Có hai chế độ hiển thị: cấu trúc cây hiển thị chuỗi cuộc gọi tài nguyên và chế độ phẳng không phân biệt chuỗi cuộc gọi. Qua giám sát chuỗi liên kết, có thể xem lịch sử trạng thái hạn chế lưu lượng và giảm tải của mỗi tài nguyên.
- Giám sát tổng hợp: Thông tin điểm cụm từ tất cả máy trong cùng dịch vụ được tổng hợp, giám sát thời gian thực với độ chính xác đến giây.
- Cấu hình quy tắc: Xem các quy tắc hạn chế, giảm tải và bảo vệ hệ thống hiện có, và cấu hình thời gian thực.