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
Mọi mô hình lập trình ứng dụng đều có cách kiểm soát quy trình xử lý. Trong một proxy API, việc này được thực hiện bằng các luồng. Bạn có thể thêm logic, câu lệnh điều kiện, cách xử lý lỗi, v.v. vào các luồng. Bạn sử dụng các luồng để kiểm soát những gì xảy ra và thời điểm xảy ra.
Flow là các giai đoạn tuần tự trong quá trình xử lý yêu cầu API. Khi thêm logic proxy, chẳng hạn như để xác minh khoá API, bạn sẽ thêm logic đó làm một bước trong trình tự do một luồng chỉ định. Khi xác định một điều kiện để chỉ định xem và khi nào logic thực thi, bạn sẽ thêm điều kiện đó vào một 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à động từ HTTP của yêu cầu 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 dùng để đưa 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 quy trình
Bạn có thể cấu trúc các luồng để có thể thực thi logic theo đúng trình tự dọc theo đường dẫn xử lý.
Khi quyết định thêm logic, trước tiên, bạn sẽ chọn thêm logic vào điểm cuối của proxy hay điểm cuối của mục tiêu. Một proxy API chia mã của mình thành mã tương tác với máy khách của proxy (điểm cuối của 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 của mục tiêu).
Cả hai điểm cuối đều chứa các luồng, như được mô tả ở đây:
| Loại điểm cuối | Mô tả | Các luồng được hỗ trợ |
|---|---|---|
| ProxyEndpoint | Chứa các luồng proxy API gần với ứng dụng nhất. Cung cấp các vị trí để logic hoạt động trước tiên trên yêu cầu từ ứng dụng, sau đó là cuối cùng trên phản hồi cho ứng dụng. | PreFlow, luồng có điều kiện, PostFlow, PostClientFlow |
| TargetEndpoint | Chứa các luồng proxy API gần với tài nguyên phụ trợ nhất. Cung cấp các vị trí cho logic để chuẩn bị một yêu cầu, sau đó xử lý phản hồi từ mộ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 những gì sẽ xảy ra và theo thứ tự nào. Hình minh hoạ sau đây cho thấy cách các luồng được sắp xếp tuần tự trong một điểm cuối của proxy và điểm cuối đích:

Điểm cuối của proxy và điểm cuối đích đều chứa các luồng mà bạn có thể sắp xếp theo 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 có bất kỳ điều gì khác xảy ra. Nếu PreFlow nằm trong một điểm cuối đích, thì PreFlow sẽ thực thi sau PostFlow của điểm cuối proxy. |
| 2 | Luồng có điều kiện |
Nơi dành 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 đánh giá là đúng. Điều đó có nghĩa là bạn có thể thực thi một luồng có điều kiện trong mỗi luồng sau:
|
| 3 | PostFlow |
Đây là nơi phù hợp để ghi nhật ký dữ liệu, gửi thông báo cho biết đã xảy ra lỗi 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ì PostFlow của điểm cuối proxy sẽ thực thi trước PreFlow của điểm cuối đích. |
| 4 | PostClientFlow (chỉ luồng proxy) | Một quy trình ghi nhật ký tin nhắn sau khi phản hồi được trả về cho ứng dụng khách. |
Thực thi mã trước bằng 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 có bất kỳ mã nào khác xảy ra.
Trong điểm cuối của proxy, PreFlow là nơi lý tưởng cho mã xác thực ứng dụng và giới hạn lưu lượng truy cập từ ứng dụng. Trong một điểm cuối đích, nơi bắt đầu chuẩn bị gửi yêu cầu đến một đích đến phụ trợ, PreFlow phù hợp với các bước đầu tiên trong việc 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 khách đã vượt quá hạn mức. Để hỗ trợ các yêu cầu này, bạn đặt các chính sách về hạn mức và bảo mật trong phân đoạn PreFlow. Nhờ đó, 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 quy trình có điều kiện sau này. Các chính sách trong quy trình này sẽ luôn được thực thi trước khi bất kỳ quy trình xử lý nào khác diễn ra.
Trong ví dụ sau, các chính sách SpikeArrest và Quota sẽ thực thi trước khi xử lý các đường chuyền cho các 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>Thực thi mã có điều kiện bằng một 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 cho phép bạn định cấu hình nhiều chuỗi logic, nhưng chỉ có một chuỗi thực thi dựa trên trạng thái của proxy. Luồng có điều kiện là không bắt buộc 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ỉ một đường dẫn thông qua điểm cuối được hỗ trợ).
Mỗi luồng chỉ định một điều kiện để kiểm tra các giá trị trạng thái khác nhau. Điều này sẽ phân nhánh quá trình thực thi dựa trên các điều kiện. Ví dụ: bạn có thể 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 hạn chế về hạn mức chỉ được thực thi nếu yêu cầu là yêu cầu GET có mẫu URI là /issue/** (/issue/ với mọi nội dung trong URI sau dấu gạch chéo cuối cùng).
<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ử dụng các biến luồng để chỉ định điều kiện. Để biết thêm thông tin về cách sử dụng các biến trong điều kiện, hãy xem phần Điều kiện có biến luồng.
Để xem ví dụ về cách sử dụng tính năng so khớp mẫu trong điều kiện, hãy xem phần So khớp mẫu.
Thực thi mã sau logic cốt lõi bằng PostFlow
PostFlow là nơi lý tưởng để 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 quá trình xử lý điểm cuối kết thúc. 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 cho biết đã xảy ra một sự kiện, chuyển đổi định dạng thông báo phản hồi, v.v.
Trong ví dụ sau, một chính sách AssignMessage có tên là SetResponseHeaders sẽ đặt tiêu đề của thông báo phản hồi trước khi Apigee Edge gửi phản hồi trở lại cho ứng dụng.
<PostFlow>
<Response>
<Step>
<Name>SetResponseHeaders</Name>
</Step>
</Response>
</PostFlow>Thực thi mã sau khi ứng dụng 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 ExtensionCallout
- Chính sách về chú thích trong luồng*
- Chính sách MessageLogging
- Chính sách về chú thích dịch vụ
* Chính sách FlowCallout chỉ có thể gọi các luồng dùng chung đáp ứng các tiêu chí để có trong PostClientFlow (tức là chỉ chứa các chính sách tương thích).
Nếu bạn thêm một PostClientFlow, thì đây sẽ là luồng cuối cùng được thực thi, thực thi sau khi một phản hồi được gửi đến ứng dụng.
PostClientFlow phù hợp để ghi nhật ký cuối cùng. Ngoài ra, bạn có thể ghi lại dấu thời gian bắt đầu và kết thúc cho thông báo phản hồi.
Sau đâ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: Mời bạn xem video ngắn này để biết cách tạo PostClientFlow bằng chính sách MessageLogging trong loạt video Bốn 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:
- Tài liệu tham khảo về cấu hình proxy API
- Tutorial : Apigee Edge - Post Client Flow community article
Thêm logic vào quy trình
Khi thêm logic vào proxy, bạn sẽ thêm các chính sách vào các luồng của proxy. Giống như các luồng thực thi theo trình tự (PreFlow, Flow rồi đến PostFlow, như mô tả trong chủ đề này), nội dung của một luồng cũng thực thi theo trình tự.
Cấu hình luồng sau đây tham chiếu đến 3 chính sách (được định cấu hình ở nơi khác trong các tệp XML riêng). Chính sách được tham chiếu theo Verify-API-Key sẽ thực thi trước chính sách được tham chiếu theo Remove-API-Key; cả hai chính sách này đều được theo sau bởi chính sách do Quota đại diện.
<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 chuỗi 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.

Gỡ lỗi luồng
Công cụ Apigee Edge Trace cung cấp một cách thức đồ hoạ để xem cách logic trong API proxy của bạn thực thi theo 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ự tách biệt giữa PreFlow, các luồng có điều kiện và PostFlow.
Để biết thêm về việc theo dõi các 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ể tăng số lỗi từ nhiều nơi trong một proxy API, kể cả từ các luồng.
Ví dụ sau đây là phần phản hồi từ PreFlow trong một điểm cuối đích – nói cách khác, đây là mã thực thi ngay khi nhận được phản hồi từ một đích phụ trợ. Trong ví dụ này, một lỗi sẽ xảy ra nếu phản hồi từ đích đến 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.