Kiểm soát cách một proxy thực thi với các luồng

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Bất kỳ mô hình lập trình ứng dụng nào cũng bao gồm một cách kiểm soát luồng xử lý. Trong một API proxy, được thực hiện với luồng. Đối với flow, bạn có thể thêm logic, câu lệnh điều kiện, cách xử lý lỗi và v.v. Bạn sử dụng luồng để kiểm soát điều gì xảy ra và thời điểm xảy ra.

Luồng là các giai đoạn tuần tự cùng với lộ trình xử lý yêu cầu API. Khi bạn thêm logic proxy, chẳng hạn như để xác minh khoá API, bạn sẽ thêm logic dưới dạng một bước trong trình tự do luồng chỉ định. Khi xác định một điều kiện để chỉ định liệu có thực thi logic hay không và khi nào logic thực thi, bạn sẽ thêm điều kiện đó vào luồng.

Ví dụ về cấu hình luồng sau đây xác định một luồng trong đó chính sách VerifyAPIKey thực thi nếu đường dẫn yêu cầu đến kết thúc bằng / và HTTP của yêu cầu động từ là GET.

<Flow name="Get Food Carts">
    <Description>Get Food Carts</Description>
    <Request>
        <Step>
            <Name>Verify-API-Key</Name>
        </Step>
    </Request>
    <Condition>(proxy.pathsuffix MatchesPath "/") and (request.verb = "GET")</Condition>
</Flow>

Giá trị Verify-API-Key trong phần tử <Name> của luồng phân phát để thêm một chính sách được định cấu hình ở nơi khác trong proxy bằng XML, chẳng hạn như sau:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VerifyAPIKey async="false" continueOnError="false" enabled="true" name="Verify-API-Key">
    <DisplayName>Verify API Key</DisplayName>
    <Properties/>
    <APIKey ref="request.header.x-api-key"/>
</VerifyAPIKey>

Thiết kế trình tự thực thi luồng

Bạn cấu trúc các luồng dữ liệu để có thể thực thi logic theo trình tự phù hợp dọc theo lộ trình xử lý.

Khi quyết định nơi cần thêm logic, trước tiên, bạn cần chọn xem có thêm logic đó vào điểm cuối proxy hay điểm cuối đích. Proxy API phân chia mã của nó cho mã tương tác với ứng dụng khách (điểm cuối proxy) và mã không bắt buộc tương tác với mục tiêu phụ trợ của proxy, nếu có (điểm cuối mục tiêu).

Cả hai điểm cuối đều chứa các luồng, như mô tả dưới đây:

Loại thiết bị đầu cuối Mô tả Các luồng được hỗ trợ
ProxyEndpoint Chứa các luồng proxy API gần nhất với ứng dụng. Cung cấp các vị trí để logic hành động trước tiên là theo yêu cầu từ ứng dụng, sau đó mới nhất là phản hồi gửi đến máy khách. PreFlow, quy trình có điều kiện, PostFlow, PostClientFlow
TargetEndpoint Chứa các luồng proxy API gần nhất với tài nguyên phụ trợ. Cung cấp các vị trí cho logic để chuẩn bị yêu cầu, sau đó xử lý phản hồi từ tài nguyên phụ trợ. PreFlow, quy trình có điều kiện, PostFlow

Bạn định cấu hình luồng bằng XML để chỉ định điều gì sẽ xảy ra và thứ tự diễn ra. Nội dung sau đây Hình minh hoạ cách các luồng được sắp xếp tuần tự trong một điểm cuối proxy và đích điểm cuối:

Yêu cầu từ máy khách HTTP truyền Điểm cuối proxy đến Điểm cuối mục tiêu trên phần phụ trợ để truy cập vào dịch vụ HTTP. Mỗi bảng điều khiển yêu cầu và phản hồi cho thấy luồng trước, luồng có điều kiện và luồng sau. Ngoài ra, ví dụ về điểm cuối proxy và điểm cuối đích cũng được cung cấp.

Điểm cuối proxy và điểm cuối đích đều chứa các luồng mà bạn có thể sắp xếp trong trình tự sau:

Vị trí Loại quy trình Mô tả
1 PreFlow

Hữu ích khi bạn cần đảm bảo rằng một số mã nhất định sẽ thực thi trước khi thực hiện bất cứ điều gì khác xảy ra.

Nếu PreFlow nằm trong một điểm cuối mục tiêu, thì PreFlow sẽ thực thi sau PostFlow.

2 Luồng có điều kiện

Vị trí cho logic có điều kiện. Thực thi sau PreFlow và trước PostFlow.

Chỉ một luồng có điều kiện được thực thi cho mỗi phân đoạn--luồng đầu tiên có điều kiện có giá trị là true (đúng). Điều đó có nghĩa là bạn có thể thực thi một luồng có điều kiện như một phần của từng loại:
  • Quy trình yêu cầu của ProxyEndpoint
  • Quy trình yêu cầu của TargetEndpoint
  • Quy trình phản hồi của ProxyEndpoint
  • Quy trình phản hồi của TargetEndpoint
3 PostFlow

Một nơi phù hợp để ghi nhật ký dữ liệu, gửi thông báo cho biết đã có điều gì đó xảy ra trong khi xử lý yêu cầu, v.v. Thực thi sau các luồng có điều kiện và PreFlow.

Nếu PostFlow nằm trong một điểm cuối proxy và có một điểm cuối đích, thì proxy điểm cuối PostFlow thực thi trước điểm cuối mục tiêu PreFlow.

4 PostClientFlow (chỉ luồng proxy) Một quy trình để ghi nhật ký thông điệp sau khi phản hồi được trả về máy khách.

Yêu cầu thực thi mã đầu tiên với PreFlow

PreFlow rất hữu ích khi bạn cần đảm bảo rằng một số mã nhất định sẽ thực thi trước khi thực thi bất cứ điều gì khác xảy ra.

Trong điểm cuối proxy, PreFlow là nơi phù hợp để mã xác thực ứng dụng và giới hạn lưu lượng truy cập từ máy khách. Trong điểm cuối mục tiêu, nơi điểm cuối bắt đầu chuẩn bị gửi yêu cầu đến mục tiêu phụ trợ, PreFlow phù hợp cho các bước đầu tiên khi chuẩn bị gửi yêu cầu.

Ví dụ: bạn thường không muốn phục vụ một ứng dụng đã vượt quá hạn mức. Người nhận để hỗ trợ các yêu cầu này, bạn sẽ đưa các chính sách bảo mật và hạn mức vào phân đoạn PreFlow. Bằng cách đó, bạn không cần lo lắng về việc một điều kiện không đánh giá được trong một luồng có điều kiện sau này. Chiến lược phát hành đĩa đơn các chính sách trong quy trình này sẽ luôn thực thi trước khi diễn ra bất kỳ quá trình xử lý nào khác.

Trong ví dụ sau, các chính sách SpikeArrest và Hạn mức sẽ thực thi trước khi xử lý thẻ và vé đến luồng có điều kiện.

<PreFlow name="MyPreFlow">
    <Request>
        <Step>
            <Name>Spike-Arrest</Name>
        </Step>
        <Step>
            <Name>Quota</Name>
        </Step>
    </Request>
    <Response/>
</PreFlow>

Có được mã thực thi có điều kiện bằng luồng có điều kiện

Giữa PreFlow và PostFlow, bạn có thể có các luồng thực thi có điều kiện. Điều này mang lại cho bạn cơ hội định cấu hình nhiều chuỗi logic, nhưng chỉ có một chuỗi được thực thi dựa trên trạng thái proxy của bạn. Không bắt buộc phải sử dụng luồng có điều kiện nếu bạn có thể thực thi tất cả logic trong PreFlow hoặc PostFlow và không cần điều kiện nào (nói cách khác, chỉ có một đường dẫn qua điểm cuối là được hỗ trợ).

Mỗi luồng chỉ định một điều kiện để kiểm thử các giá trị trạng thái khác nhau. Điều này một cách hiệu quả các nhánh thực thi dựa trên các điều kiện. Ví dụ: có thể bạn chỉ muốn chuyển đổi XML sang JSON khi ứng dụng yêu cầu đang chạy trên thiết bị di động.

Ở đây, các ràng buộc về hạn mức chỉ được thực thi nếu yêu cầu đó là một yêu cầu GET có Mẫu URI /issue/** (/vấn đề/ với bất kỳ giá trị nào trong URI sau lượt chuyển tiếp gần đây nhất dấu gạch chéo).

<Flow name="MyFlow">
    <Description/>
    <Request>
        <Step>
            <Name>Quota</Name>
        </Step>
    </Request>
    <Response/>
    <Condition>(proxy.pathsuffix MatchesPath "/issue/**") and (request.verb = "GET")</Condition>
</Flow>

Bạn sẽ sử dụng các biến luồng để chỉ định các điều kiện. Để biết thêm về cách sử dụng các biến theo điều kiện, hãy xem phần Các điều kiện có biến luồng.

Để biết ví dụ về cách sử dụng phương thức so khớp mẫu trong các điều kiện, hãy xem phần So khớp mẫu.

Có mã thực thi sau logic cốt lõi bằng PostFlow

PostFlow là một nơi tuyệt vời để thực hiện các thao tác sau logic cốt lõi của điểm cuối và trước khi kết thúc quá trình xử lý điểm cuối. PostFlow thực thi sau các luồng có điều kiện và PreFlow.

PostFlow là nơi phù hợp để ghi nhật ký một số dữ liệu, gửi thông báo về điều gì đó đã xảy ra, chuyển đổi định dạng tin nhắn phản hồi, v.v.

Trong ví dụ sau, chính sách SendMessage có tên là SetResponseHeaders đặt tiêu đề của tin nhắn phản hồi trước khi Apigee Edge gửi phản hồi lại cho khách hàng.

<PostFlow>
    <Response>
        <Step>
            <Name>SetResponseHeaders</Name>
        </Step>
    </Response>
 </PostFlow>

Yêu cầu thực thi mã sau khi máy khách nhận được phản hồi của proxy bằng PostClientFlow

PostClientFlow có thể bao gồm các chính sách sau:

* Chính sách FlowAnnotation chỉ có thể gọi các luồng được chia sẻ mà bản thân các luồng đó đáp ứng tiêu chí để đưa vào PostClientFlow (tức là chỉ chứa các chính sách tương thích).

Nếu bạn đưa vào đó, PostClientFlow sẽ là luồng cuối cùng để thực thi, thực thi sau một phản hồi được gửi đến máy khách.

PostClientFlow phù hợp để ghi nhật ký lần cuối. Ngoài ra, bạn có thể ghi lại dấu thời gian bắt đầu và kết thúc cho tin nhắn phản hồi.

Dưới đây là ví dụ về PostClientFlow có chính sách MessageLogging được đính kèm.

    ...
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <PostClientFlow>
        <Request/>
        <Response>
            <Step>
                <Name>Message-Logging-1</Name>
            </Step>
        </Response>
    </PostClientFlow>
    ...

Video: Xem video ngắn này hướng dẫn bạn cách tạo PostClientFlow sử dụng chính sách MessageLogging của chuỗi video dài 4 phút dành cho nhà phát triển (4MV4D).

Để biết thêm thông tin, hãy xem các bài viết sau:

Thêm logic vào luồng

Khi thêm logic vào proxy, bạn thực hiện việc này bằng cách thêm chính sách vào luồng của proxy. Giống như Các luồng thực thi theo trình tự (PreFlow rồi đến Flow rồi đến PostFlow, như được mô tả trong chủ đề này), nội dung của luồng thực thi theo trình tự.

Cấu hình luồng ví dụ sau đây tham chiếu đến 3 chính sách (được định cấu hình ở nơi khác trong tệp XML của riêng chúng). Chính sách mà Verify-API-Key tham chiếu sẽ thực thi trước khi chính sách được Remove-API-Key dẫn chiếu; cả hai đều được tuân theo bởi chính sách được trình bày bằng Quota.

<Flow name="Get Food Cart Menus">
    <Description>Get Food Cart Menus</Description>
    <Request>
        <Step>
            <Name>Verify-API-Key</Name>
        </Step>
        <Step>
            <Name>Remove-API-Key</Name>
        </Step>
        <Step>
            <Name>Quota</Name>
        </Step>
    </Request>
    <Condition>(proxy.pathsuffix MatchesPath "/") and (request.verb = "GET")</Condition>
</Flow>

Bảng điều khiển Apigee Edge trình bày trình tự chính sách này dưới dạng một hàng biểu tượng mà trong đó mỗi biểu tượng trình bày chính sách.

Bảng điều khiển Apigee Edge trình bày trình tự các chính sách này dưới dạng một hàng biểu tượng, trong đó mỗi biểu tượng đại diện cho chính sách. Các biểu tượng xuất hiện trên đường dẫn yêu cầu bao gồm: Xác minh khoá API, Xoá khoá API và Hạn mức

Quy trình gỡ lỗi

Công cụ Apigee Edge Trace cung cấp một cách thức đồ hoạ để xem logic trong proxy API của bạn thực thi sau một yêu cầu. Công cụ này minh hoạ quá trình xử lý giữa yêu cầu và phản hồi. Nó không minh hoạ cụ thể sự khác biệt giữa PreFlow, luồng có điều kiện và PostFlow.

Để biết thêm thông tin về cách theo dõi proxy, hãy xem phần Sử dụng công cụ Theo dõi.

Xử lý lỗi trong luồng

Bạn có thể nêu lỗi từ nhiều vị trí trong proxy API, bao gồm cả lỗi từ luồng.

Sau đây là ví dụ về đoạn thông tin phản hồi từ PreFlow trong một điểm cuối mục tiêu – trong đó là mã sẽ thực thi ngay khi nhận được phản hồi từ mục tiêu phụ trợ. Trong ví dụ này, lỗi sẽ xuất hiện nếu phản hồi từ mục tiêu không phải là 200 (thành công).

<PreFlow name="PreFlow">
    <Response>
        <Step>
            <Name>RaiseFault</Name>
            <Condition>(response.status.code GreaterThan "200")</Condition>
        </Step>
    </Response>
</PreFlow>

Để biết thêm thông tin về cách xử lý lỗi, hãy xem phần Xử lý lỗi.