14.3 Truyền RSocket qua WebSocket
Theo mặc định, giao tiếp RSocket diễn ra qua socket TCP. Nhưng trong một số trường hợp, TCP không phải là một lựa chọn khả thi. Hãy xem xét hai tình huống sau:
- Ứng dụng khách được viết bằng JavaScript và đang chạy trong trình duyệt web của người dùng.
- Ứng dụng khách phải vượt qua một cổng vào hoặc tường lửa để đến máy chủ, và tường lửa không cho phép giao tiếp qua các cổng tùy ý.
Hơn nữa, bản thân WebSocket không hỗ trợ định tuyến, yêu cầu các chi tiết định tuyến phải được định nghĩa ở cấp độ ứng dụng. Bằng cách triển khai RSocket trên WebSocket, WebSocket sẽ được hưởng lợi từ khả năng định tuyến tích hợp sẵn của RSocket.
Trong những tình huống như vậy, RSocket có thể được truyền qua WebSocket. Giao tiếp WebSocket diễn ra qua HTTP, vốn là phương thức giao tiếp chính trong tất cả các trình duyệt web và thường được cho phép vượt qua các tường lửa.
Để chuyển từ giao thức truyền TCP sang WebSocket, bạn chỉ cần thực hiện một vài thay đổi nhỏ ở phía máy chủ và ứng dụng khách. Trước hết, vì WebSocket hoạt động qua HTTP, bạn cần đảm bảo rằng ứng dụng phía máy chủ hỗ trợ xử lý các yêu cầu HTTP. Nói cách khác, bạn cần thêm phần phụ thuộc WebFlux starter vào file cấu hình build của dự án (nếu nó chưa có):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>Bạn cũng cần chỉ định rằng bạn muốn sử dụng giao thức truyền WebSocket trong cấu hình phía máy chủ bằng cách đặt thuộc tính spring.rsocket.server.transport. Ngoài ra, bạn cần thiết lập đường dẫn HTTP mà giao tiếp RSocket sẽ diễn ra bằng cách thiết lập spring.rsocket.server.mapping-path. Cấu hình phía máy chủ sẽ trông như thế này trong file application.yml:
spring:
rsocket:
server:
transport: websocket
mapping-path: /rsocketKhông giống như truyền qua TCP, giao tiếp qua một cổng cụ thể, giao thức truyền qua WebSocket hoạt động trên một đường dẫn HTTP cụ thể. Do đó, không cần phải thiết lập spring.rsocket.server.port như khi sử dụng RSocket qua TCP.
Đó là tất cả những gì bạn cần làm ở phía máy chủ để bật giao thức truyền WebSocket cho RSocket. Mọi thứ khác sẽ hoạt động hoàn toàn giống như khi sử dụng TCP.
Ở phía ứng dụng khách, chỉ cần một thay đổi nhỏ. Thay vì tạo một requester dựa trên TCP, bạn cần tạo một requester dựa trên WebSocket bằng cách gọi phương thức websocket() trên RSocketRequester.Builder, như sau:
RSocketRequester requester = requesterBuilder.websocket(
URI.create("ws://localhost:8080/rsocket"));
requester
.route("greeting")
.data("Hello RSocket!")
.retrieveMono(String.class)
.subscribe(response -> log.info("Got a response: " + response));Và đó là tất cả những gì cần thiết để truyền RSocket qua WebSocket!
