CHÀO! Tên tôi là Viacheslav Aksenov và tôi là nhà phát triển phụ trợ chuyên phát triển các hệ thống phụ trợ phức tạp bằng Java và Kotlin. Ngoài ra, tôi có nhiều dự án thú cưng nhỏ mà bạn có thể tìm thấy trên GitHub của tôi:
Microservice là gì?
Microservice là một dịch vụ nhỏ, độc lập được thiết kế để thực hiện một tác vụ cụ thể hoặc một nhóm tác vụ trong một ứng dụng lớn hơn. Mỗi microservice được phát triển và triển khai độc lập với các microservice khác trong hệ thống và giao tiếp với các microservice khác thông qua API.
Microservices cũng cung cấp một số lợi ích khác, bao gồm khả năng mở rộng được cải thiện, khả năng chịu lỗi tốt hơn và tăng tính linh hoạt. Bằng cách chia nhỏ ứng dụng thành các dịch vụ nhỏ hơn, độc lập hơn, nhà phát triển có thể dễ dàng tăng hoặc giảm quy mô các thành phần riêng lẻ khi cần và có thể nhanh chóng đáp ứng những thay đổi về nhu cầu của người dùng hoặc điều kiện thị trường.
Tuy nhiên, microservice cũng đưa ra một số thách thức, chẳng hạn như nhu cầu quản lý API mạnh mẽ, khám phá dịch vụ và theo dõi phân tán. Việc thiết kế và triển khai microservice đúng cách đòi hỏi phải lập kế hoạch và phối hợp cẩn thận trong nhóm phát triển, cũng như hiểu biết sâu sắc về các yêu cầu và hạn chế riêng của hệ thống đang được phát triển.
Khi nào ứng dụng khách HTTP cần thiết cho vi dịch vụ?
Để trả lời câu hỏi này, chúng ta cần trả lời câu hỏi “Dịch vụ hiện tại này chịu trách nhiệm về cái gì?”
Rất thường xuyên trong logic kinh doanh dịch vụ, có một tình huống khi chúng ta cần nhận phản hồi từ API của bên thứ ba. Hoặc hơn nữa, chúng tôi có một số dịch vụ siêu nhỏ trong chuỗi để xử lý quy trình kinh doanh của mình. Trong những tình huống này, chúng tôi phải triển khai ứng dụng khách HTTP trong microservice của mình.
Trong kiến trúc vi dịch vụ, máy khách HTTP là một thành phần phần mềm giao tiếp với các vi dịch vụ khác qua giao thức HTTP. Máy khách HTTP chịu trách nhiệm đưa ra các yêu cầu đối với các vi dịch vụ khác và nhận phản hồi trở lại.
Khi một vi dịch vụ cần giao tiếp với một vi dịch vụ khác, nó thường gửi một yêu cầu HTTP đến điểm cuối thích hợp của vi dịch vụ khác. Yêu cầu HTTP có thể bao gồm một trọng tải dữ liệu, chẳng hạn như đối tượng JSON hoặc tài liệu XML, mà vi dịch vụ nhận có thể sử dụng để thực hiện tác vụ của nó.
Làm cách nào để triển khai ứng dụng khách HTTP trong microservice Spring Boot?
Có một số cách bạn có thể chọn để triển khai ứng dụng khách HTTP trong dịch vụ Khởi động mùa xuân. Trước hết, bạn cần chọn - nó sẽ là máy khách đồng bộ hay không đồng bộ?
Ví dụ: nếu bạn có kiến trúc đồng bộ, bạn có thể chọn một trong các giải pháp do Spring Boot cung cấp.
Trong Spring Boot, máy khách HTTP đồng bộ là một thành phần được sử dụng để thực hiện các yêu cầu HTTP đến các dịch vụ hoặc điểm cuối khác và chặn luồng hiện tại cho đến khi nhận được phản hồi. Spring Boot cung cấp một số tùy chọn để triển khai các máy khách HTTP đồng bộ, bao gồm các lớp RestTemplate
và WebClient
.
RestTemplate
là một lựa chọn phổ biến để triển khai các máy khách HTTP đồng bộ trong Spring Boot. Nó cung cấp một API đơn giản và trực quan để thực hiện các yêu cầu HTTP và xử lý phản hồi, đồng thời hỗ trợ nhiều phương thức HTTP, loại yêu cầu và phản hồi cũng như trình chuyển đổi thông báo. Để sử dụng RestTemplate
, bạn cần định cấu hình nó dưới dạng bean trong ngữ cảnh ứng dụng của mình, sau đó sử dụng nó để thực hiện các yêu cầu HTTP bằng cách gọi các phương thức khác nhau của nó.
Có ví dụ về cách sử dụng RestTemplate cho yêu cầu POST HTTP:
public RegisterResponse registerUser(UserDto userDto) { HttpEntity<UserDto> requestEntity = new HttpEntity<>(user, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, RegisterResponse.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { RegisterResponse response = responseEntity.getBody(); // handle the response } else { // handle the error } }
Một tùy chọn khác để triển khai các máy khách HTTP đồng bộ trong Spring Boot là sử dụng lớp WebClient
. WebClient
là ứng dụng khách HTTP phản ứng cung cấp API không chặn để thực hiện các yêu cầu HTTP và xử lý phản hồi, đồng thời rất phù hợp cho các ứng dụng yêu cầu mức độ đồng thời hoặc khả năng mở rộng cao. Để sử dụng WebClient
, bạn cần định cấu hình nó dưới dạng bean trong ngữ cảnh ứng dụng của mình, sau đó sử dụng nó để thực hiện các yêu cầu HTTP bằng cách gọi các phương thức khác nhau của nó.
public RegisterResponse registerUser(UserDto userDto) { Mono<String> responseMono = webClient.post() .uri(endpointPath) .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(user), UserDto.class) .retrieve() .bodyToMono(RegisterResponse.class); responseMono.subscribe(response -> { // handle the response }, error -> { // handle the error }); }
Điều quan trọng cần lưu ý là việc sử dụng máy khách HTTP đồng bộ có thể chặn chuỗi hiện tại, điều này có thể có tác động tiêu cực đến hiệu suất tổng thể và khả năng mở rộng của ứng dụng của bạn. Do đó, bạn nên sử dụng các ứng dụng khách HTTP không đồng bộ, chẳng hạn như WebClient
với lập trình phản ứng, khi có thể để cải thiện khả năng phản hồi của ứng dụng và sử dụng tài nguyên.
Có một số nhược điểm khi sử dụng RestTemplate và WebClient:
- bạn cần viết nhiều logic soạn sẵn để xử lý các tình huống tích cực và tiêu cực
- bạn cần cấu hình thủ công từng máy khách
- các phương thức cho yêu cầu HTTP GET/POST thông thường có ngữ nghĩa phức tạp và bạn cần nhớ nó
Làm thế nào để làm cho nó đơn giản hơn?
Câu trả lời ngắn - bạn có thể sử dụng thư viện Feign. Nó là gì?
Feign là một thư viện Java cho phép các nhà phát triển tạo các máy khách HTTP một cách dễ dàng, được thiết kế đặc biệt để xây dựng các dịch vụ siêu nhỏ RESTful. Nó cung cấp một cách khai báo để xác định các API HTTP có thể được gọi từ mã của bạn như thể chúng là các lệnh gọi phương thức cục bộ, giúp làm việc với các API và tiêu thụ tài nguyên trên các vi dịch vụ khác nhau dễ dàng hơn.
Với Feign, bạn có thể dễ dàng tạo các giao diện xác định các phương thức HTTP, tham số yêu cầu và loại phản hồi cho các điểm cuối RESTful của mình. Sau đó, Feign sẽ lo phần còn lại, bao gồm tuần tự hóa và giải tuần tự hóa các yêu cầu và phản hồi, mã hóa URL, xử lý lỗi và quản lý kết nối.
Đây là một ví dụ về yêu cầu POST để đăng ký người dùng bằng Feign:
// Client describes as interface with configuration: @FeignClient(name = "exampleRegisterClient") public interface RegisterClient { @PostMapping("/register") RegisterResponse registerUser(@RequestBody UserDto user); } // Bean creation in Spring configuration: @Bean public RegisterClient registerUserApi() { return Feign.builder().target(RegisterClient.class, "//localhost:9090/api); }
Feign cung cấp một cách đơn giản và có tính khai báo để tương tác với các API HTTP, cho phép các nhà phát triển tập trung vào logic nghiệp vụ của các dịch vụ siêu nhỏ của họ thay vì các chi tiết của việc thực hiện các yêu cầu HTTP.
Phần kết luận.
Tóm lại, Spring Boot cung cấp nhiều tùy chọn để triển khai ứng dụng khách HTTP trong microservice, bao gồm RestTemplate, WebClient và Feign. RestTemplate là một ứng dụng khách đơn giản và được sử dụng rộng rãi, cung cấp giao tiếp HTTP đồng bộ. WebClient là một giải pháp thay thế phản ứng và hiện đại hơn, cung cấp giao tiếp HTTP không bị chặn với API kiểu chức năng. Feign là một ứng dụng khách khai báo và an toàn về loại, tạo mã dựa trên các định nghĩa API, cung cấp giao diện dễ sử dụng cho các vi dịch vụ RESTful.
Khi chọn sử dụng ứng dụng khách HTTP nào, điều quan trọng là phải xem xét các yêu cầu của vi dịch vụ của bạn, chẳng hạn như hiệu suất, khả năng mở rộng và tính dễ sử dụng. RestTemplate là một lựa chọn tốt cho các trường hợp sử dụng đơn giản yêu cầu giao tiếp đồng bộ. WebClient là một lựa chọn tốt cho các trường hợp sử dụng phản ứng và không chặn yêu cầu hiệu suất cao và khả năng mở rộng. Feign là một lựa chọn tốt cho các trường hợp sử dụng khai báo và an toàn loại yêu cầu API đơn giản hóa và cải thiện trải nghiệm của nhà phát triển.
Bất kể bạn chọn ứng dụng khách HTTP nào, điều quan trọng là phải viết các bài kiểm tra tích hợp để đảm bảo rằng vi dịch vụ của bạn hoạt động chính xác khi tương tác với các dịch vụ bên ngoài. Bằng cách thử nghiệm ứng dụng khách HTTP, bạn có thể đảm bảo rằng vi dịch vụ của mình hoạt động như mong đợi trong các tình huống khác nhau, chẳng hạn như lỗi mạng hoặc phản hồi không mong muốn từ các dịch vụ bên ngoài.
Bạn có thể tìm thấy các ví dụ của tôi về cách triển khai các cách viết ứng dụng khách HTTP khác nhau trên GitHub của tôi: Ảnh của trên