Phản mẫu: Sử dụng Chính sách chú thích dịch vụ để gọi một dịch vụ phụ trợ trong Proxy API không mục tiêu

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

API proxy là một lớp ngoài được quản lý cho các dịch vụ phụ trợ. Cấu hình cơ bản của proxy API bao gồm một ProxyEndpoint (xác định URL của proxy API) và một TargetEndpoint (xác định URL của dịch vụ phụ trợ).

Apigee Edge mang đến nhiều sự linh hoạt để xây dựng hành vi phức tạp dựa trên mẫu này. Ví dụ: bạn có thể thêm các chính sách để kiểm soát cách API xử lý yêu cầu của ứng dụng trước khi gửi yêu cầu đó đến dịch vụ phụ trợ, hoặc thao tác với phản hồi nhận được từ dịch vụ phụ trợ trước khi chuyển tiếp phản hồi đó đến ứng dụng. Bạn có thể gọi các dịch vụ khác bằng cách sử dụng chính sách chú thích dịch vụ, thêm hành vi tuỳ chỉnh bằng cách thêm mã Javascript và thậm chí tạo một proxy API không gọi dịch vụ phụ trợ.

Antipattern

Việc sử dụng chú thích dịch vụ để gọi một dịch vụ phụ trợ trong một proxy API mà không có các tuyến đến một điểm cuối đích là điều hoàn toàn có thể, nhưng sẽ dẫn đến việc mất dữ liệu phân tích về hiệu suất của dịch vụ bên ngoài.

Một proxy API không chứa các tuyến đích có thể hữu ích trong trường hợp bạn không cần chuyển tiếp thông báo yêu cầu đến TargetEndpoint. Thay vào đó, ProxyEndpoint sẽ thực hiện mọi quy trình xử lý cần thiết. Ví dụ: ProxyEndpoint có thể truy xuất dữ liệu từ một lệnh tra cứu đến kho khoá/giá trị của dịch vụ API và trả về phản hồi mà không cần gọi một dịch vụ phụ trợ.

Bạn có thể xác định một null Route trong một proxy API, như minh hoạ ở đây:

<RouteRule name="noroute"/>

Một proxy sử dụng tuyến đường rỗng là một proxy "không có mục tiêu", vì proxy này không gọi một dịch vụ phụ trợ mục tiêu.

Về mặt kỹ thuật, bạn có thể thêm chú thích dịch vụ vào một proxy không có mục tiêu để gọi một dịch vụ bên ngoài, như trong ví dụ bên dưới:

<!-- /antipatterns/examples/service-callout-no-target-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Name>ServiceCallout-InvokeBackend</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/no-target-proxy</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="noroute"/>
</ProxyEndpoint>

Tuy nhiên, proxy không thể cung cấp thông tin phân tích về hành vi của dịch vụ bên ngoài (chẳng hạn như thời gian xử lý hoặc tỷ lệ lỗi), gây khó khăn cho việc đánh giá hiệu suất của dịch vụ bên ngoài.

Tác động

  • Không có thông tin phân tích về lượt tương tác với dịch vụ bên ngoài ( mã lỗi, thời gian phản hồi, hiệu suất mục tiêu, v.v.)
  • Mọi logic cụ thể cần thiết trước hoặc sau khi gọi chú thích dịch vụ đều được đưa vào như một phần của logic proxy tổng thể, khiến bạn khó hiểu và khó sử dụng lại.

Phương pháp hay nhất

Nếu một proxy API chỉ tương tác với một dịch vụ bên ngoài, thì proxy đó phải tuân theo mẫu thiết kế cơ bản, trong đó dịch vụ phụ trợ được xác định là điểm cuối đích của proxy API. Một proxy không có quy tắc định tuyến đến một điểm cuối mục tiêu không được gọi dịch vụ phụ trợ bằng chính sách ServiceCallout.

Cấu hình proxy sau đây triển khai cùng một hành vi như ví dụ ở trên, nhưng tuân theo các phương pháp hay nhất:

<!-- /antipatterns/examples/service-callout-no-target-2.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request/>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/simple-proxy-with-route-to-backend</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
    </RouteRule>
</ProxyEndpoint>

Sử dụng chú thích Dịch vụ để hỗ trợ các trường hợp kết hợp, trong đó bạn muốn gọi các dịch vụ bên ngoài trước hoặc sau khi gọi điểm cuối mục tiêu. Chú thích dịch vụ không nhằm mục đích thay thế lệnh gọi điểm cuối đích.

Tài liệu đọc thêm