Các dịch vụ có nên nói chuyện trực tiếp với nhau trong kiến ​​trúc microservice không?


10

Tôi có một số dịch vụ web tạo thành một ứng dụng web. Khách hàng có thể truy cập các dịch vụ này thông qua các lệnh gọi API REST.

Những dịch vụ này có thể nói chuyện trực tiếp với nhau không? Nếu vậy thì điều đó có khiến họ trở thành cặp đôi đi ngược lại khái niệm trên microservice không?

Khách hàng có nên gọi họ trực tiếp lần lượt để lấy dữ liệu cần thiết để tải lên một trang web trên máy khách không?

Hoặc tôi nên có một lớp khác trên đầu các dịch vụ của mình, xử lý một yêu cầu từ máy khách, lấy dữ liệu cho yêu cầu đó và sau đó gửi lại cho máy khách?


Nếu mọi thứ hoàn toàn tách rời thì chúng là những sản phẩm hoàn toàn riêng biệt. Vì vậy, người dùng sẽ phải đăng nhập vào Đăng nhập Contoso, sau đó Đăng nhập Contoso sẽ nói "Bạn hiện đã đăng nhập!" ... và sau đó họ truy cập vào Lưu trữ dữ liệu nhạy cảm của Contoso, đánh dấu vào ô có nội dung "Có, tôi đã đăng nhập "... Sau đó sao chép-dán dữ liệu từ đó vào Bộ xử lý dữ liệu Contoso ...
user253751

Câu trả lời:


15

Nếu bạn muốn các dịch vụ của mình trông giống như trong bức tranh này, thì có: nhập mô tả hình ảnh ở đây Không phải là bạn không thể làm điều đó, nhưng hầu hết thời gian nó sẽ có hậu quả xấu. Giao tiếp thông qua REST sẽ không tách rời đáng kể các dịch vụ của bạn. Khi một số giao diện dịch vụ thay đổi, tất cả các dịch vụ phụ thuộc rất có thể phải được thay đổi và triển khai lại. Ngoài ra, trong khi triển khai lại dịch vụ, bạn sẽ phải đặt tất cả các dịch vụ phụ thuộc xuống, đây không được coi là một thiết kế tốt cho các tiêu chuẩn sẵn sàng cao.

Cuối cùng, bạn sẽ có ứng dụng microservice chậm hơn ứng dụng nguyên khối thay thế, nhưng có hầu hết các vấn đề tương tự!

Tôi phải không đồng ý với @Robert Harvey

Tuy nhiên, trên thực tế, một hoặc nhiều dịch vụ siêu nhỏ của bạn (có lẽ là tất cả trong số họ) sẽ nói chuyện với một số kho dữ liệu trung tâm như cơ sở dữ liệu SQL.

Cơ sở dữ liệu tích hợp là antipotype nổi tiếng

Một giải pháp tốt hơn nhiều là sử dụng mẫu đăng ký xuất bản để làm cho giao tiếp giữa các dịch vụ của bạn không đồng bộ:

nhập mô tả hình ảnh ở đây

Xin hãy xem cách CQRS / ES thực hiện phương thức giao tiếp này, Greg Young và những người khác cung cấp hàng tấn video hay về chủ đề này. Chỉ cần google cho từ khóa "CQRS / ES". Theo cách tiếp cận này, mỗi dịch vụ sẽ trở thành nhà xuất bản và người đăng ký cùng một lúc, cho phép các dịch vụ được kết nối ít hơn nhiều.

Dưới đây là một loạt các bài viết hay về microservice làm sáng tỏ những tranh cãi xung quanh chủ đề này. Giải thích rất chi tiết với hình minh họa đẹp.


2
Chà, trước hết, tôi chưa từng nghe cụm từ "cơ sở dữ liệu tích hợp" ở bất cứ đâu ngoại trừ từ Fowler. Đừng coi điều gì đó là phúc âm chỉ vì một anh chàng nói điều đó. Thứ hai, bạn không có đủ thông tin để gọi những gì tôi mô tả là "cơ sở dữ liệu tích hợp". Thứ ba, Fowler thực sự gọi các cơ sở dữ liệu như vậy hữu ích trong các trường hợp phù hợp, trong cùng một bài viết mà bạn đã liên kết. Tôi thích ý tưởng về một chiếc xe buýt sự kiện, mặc dù tôi không thấy nó khác biệt như thế nào so với việc gọi API thông thường của microservice trừ khi bạn có thể tăng hiệu quả.
Robert Harvey

Cảm ơn Robert, tôi đã liên kết bài viết của Fowler để minh họa rõ hơn ý tưởng, không tranh luận từ chính quyền. Cách bạn mô tả phương pháp đó nghe rất giống cơ sở dữ liệu tích hợp. Nếu nó khác biệt - điều đó không rõ ràng chút nào. Về hoàn cảnh phù hợp - Tôi nghĩ rằng việc tích hợp microservice thông qua cơ sở dữ liệu không phải là một ý tưởng hay vì nó đẩy chúng ta trở lại một kiến ​​trúc nguyên khối.
IlliakaillI

1
Chắc chắn: mỗi microservice sẽ nói chuyện với cơ sở dữ liệu riêng của họ hoặc với các bảng trong cùng một cơ sở dữ liệu không liên quan đến các bảng của các dịch vụ khác. Theo cách này, các dịch vụ không bao giờ trao đổi thông tin thông qua cơ sở dữ liệu, có nghĩa là bạn có thể dễ dàng mở rộng quy mô theo chiều ngang và sẽ có ít tắc nghẽn hơn. Và bởi vì họ không chia sẻ cùng một bảng - những thay đổi trong một phần của ứng dụng sẽ ít ảnh hưởng đến các phần khác.
IlliakaillI

1
Bạn không thể nói rõ rằng đó là một điều tuyệt đối. Có thể có hai dịch vụ cần cùng một thông tin trong cùng một cơ sở dữ liệu, đôi khi chúng chỉ cần nó, không có vấn đề mở rộng để truy cập theo cách đó, hai dịch vụ đã truy cập cơ sở dữ liệu cho các mục đích khác, vì vậy hãy đứng lên một xe buýt dịch vụ hoặc điểm cuối API chỉ để thực hiện điều đó sẽ là vô lý.
Robert Harvey

1
Nhưng để đạt được giá trị kinh doanh, bạn muốn kết hợp dữ liệu - "hiển thị cho tôi tất cả các hệ thống thoát nước sẽ không đủ dung lượng lưu trữ với dữ liệu radar sau đây về mưa tới và tô màu bản đồ đô thị này bằng kết quả". Nếu bạn chia tất cả dữ liệu của mình thành các dịch vụ, điều đó chỉ có nghĩa là bạn chỉ có thể kết hợp dữ liệu sau này. Nếu bạn cấm các dịch vụ nói chuyện với nhau, bạn chỉ cần buộc mình di chuyển tất cả dữ liệu đến một số khách hàng và tham gia dữ liệu ở đó. Bạn muốn ghép dữ liệu ở đâu đó, vì đó là những gì cuối cùng mang lại giá trị ứng dụng.
RemcoGerlich

8

Bạn sẽ nhận được rất nhiều ý tưởng rất hay từ việc đọc những gì Udi Dahan nói về SOA .

Một dịch vụ là cơ quan kỹ thuật cho một khả năng kinh doanh cụ thể. Bất kỳ phần dữ liệu hoặc quy tắc phải được sở hữu bởi chỉ một dịch vụ.

Điều này có nghĩa là ngay cả khi các dịch vụ xuất bản và đăng ký vào các sự kiện của nhau, chúng tôi luôn biết nguồn sự thật có thẩm quyền là gì cho mỗi phần dữ liệu và quy tắc.

Ngoài ra, khi nhìn vào các dịch vụ từ lăng kính về khả năng kinh doanh, điều chúng ta thấy là nhiều giao diện người dùng trình bày thông tin thuộc các khả năng khác nhau - giá của sản phẩm cùng với việc có tồn kho hay không. Để chúng tôi tuân thủ định nghĩa dịch vụ ở trên, điều này dẫn đến chúng tôi hiểu rằng các giao diện người dùng như vậy thực sự là một bản hòa trộn - với mỗi dịch vụ có đoạn UI xử lý dữ liệu cụ thể của nó.

Cụ thể liên quan đến thành phần UI, bài viết của Mauro Servienti về Thành phần UI là một điểm khởi đầu tốt. Xem thêm video của Udi, có sẵn ở đây .

Những dịch vụ này có thể nói chuyện trực tiếp với nhau không? Nếu vậy thì điều đó có khiến họ trở thành cặp đôi đi ngược lại khái niệm trên microservice không?

Nếu hai dịch vụ trao đổi tin nhắn với nhau, thì bạn sẽ nhận được một số khớp nối. Câu trả lời chính là họ kết hợp với API của dịch vụ kia - hợp đồng mà dịch vụ hứa hẹn sẽ giữ ổn định ngay cả khi nội bộ của nó đang thay đổi.

Ngoài ra, các kỹ thuật như khám phá dịch vụ có thể giảm bớt sự phụ thuộc vào một nhà cung cấp dịch vụ cụ thể và các nhà môi giới tin nhắn có thể tách rời các nhà sản xuất và người tiêu dùng (họ vẫn cần hiểu các thông điệp của nhau và cách tương tác với API của nhà môi giới tin nhắn - không có phép thuật nào ).


7

Nó phụ thuộc vào những gì bạn có nghĩa là "trực tiếp".

Theo kiến ​​trúc microservice, việc có các dịch vụ siêu nhỏ gọi các dịch vụ siêu nhỏ khác, trên máy chủ của bạn hoặc thậm chí trên các máy chủ bên ngoài, thông qua một số giao diện như REST.

Điều không tốt, là để một microservice gọi một dịch vụ khác bằng cách sử dụng các phương thức trực tiếp; điều đó sẽ làm cho cả hai microservice trở thành một phần của cùng một khối.


nó không ổn và sẽ có hậu quả xấu Xem câu trả lời của tôi để biết thêm chi tiết.
IlliakaillI

@IlliakaillI Tôi đang nói rằng nó ổn "theo kiến ​​trúc microservice". Tôi không gợi ý rằng kiến ​​trúc microservice không có hậu quả hoặc không có cải tiến nào có thể được thực hiện đối với nó. Câu hỏi ở đây là "là X bởi cuốn sách, hay không?" và câu trả lời đúng là đưa ra định nghĩa đúng về X, đó là bởi cuốn sách.
Mike Nakis

Có một "cuốn sách tham khảo" nào cho bạn biết cách xây dựng "kiến trúc microservice" thực sự không? Ngày nay, microservice trở thành một từ thông dụng và nhiều người đã viết sách về cách xây dựng các khối đá nguyên khối trên đỉnh REST. Chỉ cần nhìn vào sơ đồ đầu tiên trong câu trả lời của tôi, sẽ không có ý nghĩa gì khi xây dựng hệ thống theo kiểu đó. Nếu bạn làm vì một lý do kỳ lạ - bạn chắc chắn làm sai. Thay vào đó, bạn nên đi với nguyên khối. Nếu bạn ủng hộ các lựa chọn thiết kế của mình bằng cách tham khảo một cách mù quáng một số cuốn sách (đưa ra lập luận từ chính quyền) thì đó không phải là một cách đúng đắn để tiếp cận thiết kế phần mềm.
IlliakaillI

5

Những dịch vụ này có thể nói chuyện trực tiếp với nhau không? Nếu vậy thì điều đó có khiến họ trở thành cặp đôi đi ngược lại khái niệm trên microservice không?

Khớp nối không phải là một từ xấu. Mỗi ứng dụng đã có một mức độ khớp nối nhất định; các ứng dụng nói chuyện với microservice của bạn đã được ghép nối với microservice, nếu không chúng sẽ không hoạt động.

Những gì bạn thực sự sau với microservice là khớp nối lỏng lẻo ; bạn có thể đạt được điều đó bằng cách đơn giản là có một microservice thẩm vấn người kia thông qua API công khai hoặc sử dụng xe buýt sự kiện.

Trong thực tế, tuy nhiên, một hoặc nhiều dịch vụ siêu nhỏ của bạn (có lẽ là tất cả chúng) sẽ nói chuyện với một số kho dữ liệu trung tâm như cơ sở dữ liệu SQL. Tùy thuộc vào cách bạn muốn thực hiện mục tiêu của mình, bạn có thể chỉ cần một microservice thay đổi dữ liệu cơ sở dữ liệu theo một cách nào đó, mà microservice khác sẽ truy vấn để nhận thay đổi.


3
"Cơ sở dữ liệu tích hợp" là antipotype nổi tiếng, xem câu trả lời của tôi để biết thêm chi tiết.
IlliakaillI

2

Dường như khi nói về kiến ​​trúc và kiến ​​trúc nói chung, mọi người bị cuốn vào ngữ nghĩa và biệt ngữ. Điều gì làm cho một dịch vụ "vi mô"? Cuối cùng, có một số đặc điểm mà trong bất kỳ "hệ thống tính điểm" nào bạn đang sử dụng, rõ ràng không làm cho dịch vụ trở nên "không vi mô". Tòa án tối cao nói gì về sự không đứng đắn? "Tôi sẽ biết nó khi tôi nhìn thấy nó."

Tôi chắc rằng một số người sẽ nói đây là câu trả lời không đúng, nhưng sau đó họ đang thiếu điểm. Kiến trúc vi dịch vụ nhằm tránh một số vấn đề, trong số đó có vấn đề "khớp nối chặt chẽ". Vì vậy, nếu bạn kết thúc việc tạo ra một mớ dịch vụ vi mô phụ thuộc vào quá nhiều chi tiết tốt của nhau, bạn đã tạo ra một khớp nối chặt chẽ - cho dù bạn đang sử dụng xe buýt tin nhắn quán rượu / phụ hoặc cuộc gọi trực tiếp - phá hủy khả năng của bạn để soạn các giải pháp mới từ các mảnh, cấu hình lại các mảnh riêng lẻ mà không làm giảm toàn bộ hệ thống, v.v.


1

Khách hàng có nên gọi họ trực tiếp lần lượt để lấy dữ liệu cần thiết để tải lên một trang web trên máy khách không?

Nó phụ thuộc; tuy nhiên, tôi khuyên bạn nên cung cấp các khả năng có thể sử dụng trực tiếp cho khách hàng và ẩn (đóng gói) các chi tiết về cách kết quả được lắp ráp (ví dụ: thông qua nhiều dịch vụ vi mô).

Nếu có quá nhiều logic liên quan đến việc kết hợp các kết quả dịch vụ vi mô riêng lẻ của khách hàng, điều đó có thể vô tình khiến một số logic kinh doanh len vào máy khách. Nó cũng có thể hiển thị nhiều kiến ​​trúc nội bộ của bạn cho khách hàng hơn bạn muốn, cản trở việc tái cấu trúc các dịch vụ sau này.

Vì vậy, điều đó có nghĩa là với microservice, đôi khi thật hữu ích khi có một microservice bao bọc cung cấp cho khách hàng một điểm cuối có sự trừu tượng hữu ích và thực hiện sự phối hợp ở cấp độ cao hơn của các dịch vụ siêu nhỏ khác (có lẽ là nội bộ hơn).


(Hơn nữa, các chuyến đi khứ hồi đến khách hàng có thể đắt hơn so với từ các dịch vụ siêu nhỏ của bạn cho nhau.)


Ví dụ, nếu bạn nhìn vào hướng được thực hiện bởi GraphQL, bạn sẽ thấy các khách hàng đưa ra các truy vấn có liên quan trực tiếp đến điểm cuối, có thể hoặc không thể được triển khai dưới dạng tập hợp các dịch vụ micrs. Vì kiến ​​trúc của microservice bị ẩn đằng sau GraphQL, điều đó làm cho kiến ​​trúc dễ tái cấu trúc hơn và cũng thân thiện hơn với máy khách. Xem, ví dụ: /programming//a/38079681/471129 .


1

Mục đích chính của các dịch vụ vi mô là làm cho ứng dụng của bạn được kết nối lỏng lẻo. Do đó, các dịch vụ không thể gọi cho nhau. Nếu không, nó sẽ được gắn chặt. Nhưng chúng ta sẽ làm gì nếu có hai dịch vụ cần chia sẻ dữ liệu? Câu trả lời là Message Broker. Vì vậy, dịch vụ nhận dữ liệu từ máy khách có thể chia sẻ dữ liệu cho nhà môi giới tin nhắn trung tâm, sau đó các dịch vụ phải sử dụng dữ liệu đó có thể sử dụng dữ liệu đó, chuyển đổi dữ liệu và đưa vào lưu trữ dữ liệu của chính nó. Tôi khuyên bạn nên Kafka vì bạn có thể tham gia dữ liệu từ các chủ đề khác nhau khi đang di chuyển với Kafka Stream. Tái bút tốt hơn để phân tách các dịch vụ vi mô của bạn theo tính năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.