Tắt VM thông qua giao diện REST
Đây thực sự là một ví dụ nổi tiếng, được đưa ra bởi Tim Bray vào năm 2009 .
Roy Fielding, thảo luận về vấn đề, đã chia sẻ quan sát này :
Cá nhân tôi thích các hệ thống coi trạng thái giám sát (như trạng thái sức mạnh) là không thể chỉnh sửa.
Nói tóm lại, bạn có một tài nguyên thông tin trả về một đại diện hiện tại của trạng thái được giám sát; đại diện đó có thể bao gồm một liên kết hypermedia đến một biểu mẫu để yêu cầu thay đổi trạng thái đó và biểu mẫu có một liên kết khác đến một tài nguyên để xử lý (mỗi) yêu cầu thay đổi.
Seth Ladd đã có những hiểu biết quan trọng trong vấn đề
Chúng tôi đã biến Chạy từ trạng thái đơn giản của một người thành Danh từ thực sự có thể được tạo, cập nhật và nói chuyện.
Lấy lại điều này để khởi động lại máy. Tôi sẽ lập luận rằng bạn sẽ POST lên / vdc / 434 / cluster / 4894 / server / 4343 / khởi động lại Sau khi bạn đăng, bạn có một URI đại diện cho khởi động lại này và bạn có thể NHẬN nó để cập nhật trạng thái. Thông qua sự kỳ diệu của siêu liên kết, đại diện của Reboot được liên kết với Máy chủ được khởi động lại.
Tôi nghĩ rằng không gian đúc URI là rẻ, và URI thậm chí còn rẻ hơn. Tạo một tập hợp các hoạt động, được mô hình hóa dưới dạng Danh từ và POST, PUT và XÓA đi!
Lập trình RESTful là bộ máy quan liêu Vogon ở quy mô web. Làm thế nào để bạn làm bất cứ điều gì RESTful? Phát minh ra giấy tờ mới cho nó, và số hóa giấy tờ.
Trong ngôn ngữ có phần khó hiểu hơn, những gì bạn đang làm là xác định giao thức ứng dụng miền cho "tắt máy ảo" và xác định các tài nguyên mà bạn cần để lộ / thực hiện giao thức đó
Nhìn vào ví dụ của riêng bạn
PATCH /api/virtualmachines/42
Content-Type:application/json
{ "state": "shutting down" }
Vậy là được rồi; bạn không thực sự coi yêu cầu đó là tài nguyên thông tin riêng biệt của mình, nhưng bạn vẫn có thể quản lý.
Bạn đã bỏ lỡ một chút trong đại diện của bạn về sự thay đổi.
Tuy nhiên, với PATCH, thực thể kèm theo chứa một tập hợp các hướng dẫn mô tả cách tài nguyên hiện đang cư trú trên máy chủ gốc nên được sửa đổi để tạo ra một phiên bản mới.
Ví dụ: hướng dẫn định dạng loại phương tiện Patch Patch như thể bạn đang trực tiếp sửa đổi tài liệu JSON
[
{ "op": "replace", "path": "state", "value": "shutting down" }
]
Trong lựa chọn của bạn, ý tưởng là gần, nhưng không rõ ràng chính xác. PUT
là một sự thay thế hoàn toàn trạng thái của tài nguyên tại URL mục tiêu , vì vậy bạn có thể sẽ không chọn một cách viết mà trông giống như một bộ sưu tập như là mục tiêu của một đại diện của một đơn thực thể.
POST /api/virtualmachines/42/actions
Phù hợp với giả tưởng rằng chúng tôi đang nối thêm một hành động vào hàng đợi
PUT /api/virtualmachines/42/latestAction
Phù hợp với giả tưởng rằng chúng tôi đang thực hiện cập nhật cho mục đuôi trong hàng đợi; Làm điều này hơi lạ một chút. Nguyên tắc ít ngạc nhiên nhất khuyên bạn nên cung cấp cho mỗi PUT đó là định danh duy nhất của riêng mình, thay vì đặt tất cả chúng vào một nơi và sửa đổi nhiều tài nguyên cùng một lúc.
Lưu ý rằng, cho đến nay chúng ta đang thảo luận về chính tả của URI - REST không quan tâm; /cc719e3a-c772-48ee-b0e6-09b4e7abbf8b
là một URI hoàn hảo có liên quan đến REST. Khả năng đọc, như với tên biến, là một mối quan tâm riêng biệt. Sử dụng cách viết phù hợp với RFC 3986 sẽ khiến mọi người hạnh phúc hơn rất nhiều.
CQRS
Điều gì xảy ra nếu chúng ta có một miền CQRS với nhiều "hành động" (còn gọi là các lệnh) có khả năng dẫn đến cập nhật nhiều tập hợp hoặc không thể ánh xạ tới các hoạt động CRUD trên tài nguyên cụ thể và tài nguyên phụ?
Greg Young trên CQRS
CQRS là một mẫu rất đơn giản cho phép nhiều cơ hội cho kiến trúc có thể không tồn tại. CQRS không phải là sự nhất quán cuối cùng, nó không phải là sự kiện, nó không phải là nhắn tin, nó không có các mô hình riêng biệt để đọc và viết, cũng không sử dụng nguồn sự kiện.
Khi hầu hết mọi người nói về CQRS, họ thực sự đang nói về việc áp dụng mẫu CQRS cho đối tượng đại diện cho ranh giới dịch vụ của ứng dụng.
Cho rằng bạn đang nói về CQRS trong bối cảnh HTTP / REST, có vẻ hợp lý khi cho rằng bạn đang làm việc trong bối cảnh sau này, vì vậy hãy đi với điều đó.
Điều này, đáng ngạc nhiên, thậm chí còn dễ dàng hơn so với ví dụ trước đây của bạn. Lý do cho điều này là đơn giản: các lệnh là tin nhắn .
Jim Webber mô tả HTTP là giao thức ứng dụng của văn phòng những năm 1950; công việc được thực hiện bằng cách lấy tin nhắn và đưa chúng vào hộp thư đến. Cùng một ý tưởng - chúng tôi nhận được một bản sao trống của một biểu mẫu, điền nó với các chi tiết cụ thể mà chúng tôi biết, cung cấp nó. Ta da
Chúng ta có nên cố gắng mô hình hóa nhiều lệnh như cụ thể tạo hoặc cập nhật trên các tài nguyên cụ thể, ở đâu có thể (theo cách tiếp cận đầu tiên từ ví dụ I) và sử dụng "điểm cuối hành động" cho phần còn lại không?
Đúng, trong chừng mực "tài nguyên cụ thể" là các thông điệp, chứ không phải là các thực thể trong mô hình miền.
Ý tưởng chính: API REST của bạn vẫn là một giao diện ; bạn sẽ có thể thay đổi mô hình cơ bản mà không cần khách hàng thay đổi tin nhắn. Khi bạn phát hành một mô hình mới, bạn phát hành một phiên bản mới của các điểm cuối web của bạn biết cách lấy giao thức miền của bạn và áp dụng nó cho mô hình mới.
Mô hình CQRS có phù hợp hơn với RPC như API không?
Không thực sự - đặc biệt, bộ nhớ cache web là một ví dụ tuyệt vời về "mô hình đọc cuối cùng nhất quán". Làm cho mỗi chế độ xem của bạn có thể truy cập độc lập, mỗi chế độ có quy tắc bộ đệm riêng, cung cấp cho bạn một loạt các tỷ lệ miễn phí. Có rất ít sự hấp dẫn đối với cách tiếp cận RPC dành riêng để đọc.
Đối với viết, đó là một câu hỏi khó hơn: gửi tất cả các lệnh đến một trình xử lý duy nhất tại một điểm cuối duy nhất hoặc một họ các điểm cuối, chắc chắn dễ dàng hơn . REST thực sự là nhiều hơn về cách bạn tìm thấy giao tiếp trong đó điểm cuối là máy khách.
Việc coi tin nhắn là tài nguyên duy nhất của riêng nó có lợi thế là bạn có thể sử dụng PUT, cảnh báo các thành phần trung gian về việc xử lý tin nhắn là không cần thiết, để chúng có thể tham gia vào một số trường hợp xử lý lỗi nhất định, là một điều tuyệt vời . (Lưu ý: theo quan điểm của khách hàng, nếu các tài nguyên có URI khác nhau, thì chúng là các tài nguyên khác nhau, thực tế là tất cả chúng đều có cùng mã xử lý yêu cầu trên máy chủ gốc là một chi tiết triển khai được ẩn bởi đồng phục giao diện).
Fielding (2008)
Tôi cũng cần lưu ý rằng phần trên chưa hoàn toàn RESTful, ít nhất là cách tôi sử dụng thuật ngữ này. Tất cả những gì tôi đã làm được mô tả các giao diện dịch vụ, không nhiều hơn bất kỳ RPC nào. Để làm cho RESTful, tôi cần thêm siêu văn bản để giới thiệu và xác định dịch vụ, mô tả cách thực hiện ánh xạ bằng các biểu mẫu và / hoặc mẫu liên kết và cung cấp mã để kết hợp trực quan hóa theo những cách hữu ích.