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.
Chuyển đến tài liệu về Apigee X.
thông tin

Proxy API là một thành phần tượng trưng được quản lý cho các dịch vụ phụ trợ. Một cấu hình proxy API cơ bản bao gồm 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 sự linh hoạt cao cho việc xây dựng hành vi tinh vi ngoài 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 đến dịch vụ phụ trợ hoặc chỉnh sửa phản hồi nhận được từ dịch vụ phụ trợ trước khi chuyển tiếp yêu cầu đó đến máy khách. Bạn có thể gọi các dịch vụ khác bằ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í là tạo proxy API không gọi dịch vụ phụ trợ.

Phản mẫu

Về mặt kỹ thuật, 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ó tuyến đến điểm cuối mục tiêu nào là khả thi, nhưng sẽ làm mất dữ liệu phân tích về hiệu suất của dịch vụ bên ngoài.

Proxy API không chứa các tuyến mục tiêu 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 thực hiện tất cả quá trình xử lý cần thiết. Ví dụ: ProxyEndpoint có thể truy xuất dữ liệu từ một lượt tra cứu tới kho lưu trữ khoá/giá trị của dịch vụ API và trả về phản hồi mà không cần gọi dịch vụ phụ trợ.

Bạn có thể xác định Tuyến null trong proxy API, như minh hoạ dưới đây:

<RouteRule name="noroute"/>

Một proxy sử dụng tuyến rỗng là proxy "không có mục tiêu" vì nó 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.

Mức độ tác động

  • Không có thông tin phân tích về hoạt động 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 logic proxy tổng thể, khiến việc hiểu và sử dụng lại trở nên khó khăn hơn.

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 mục tiêu của proxy API. Một proxy không có quy tắc định tuyến đến điểm cuối đích sẽ không được gọi dịch vụ phụ trợ bằng chính sách ServiceChú thích.

Cấu hình proxy sau đây triển khai hành vi tương tự 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 dữ liệu, 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 đích. Chú thích dịch vụ không nhằm thay thế lệnh gọi điểm cuối mục tiêu.

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