概述

Webhook Java 快速入門介紹了如何快速使用神策智慧運營工具類快速啟動一個用於接收和處理神策智慧運營 Webhook 請求的方法。 本文將結合使用場景對工具類進行更多介紹。

簡單接收和處理

Webhook Java快速入門的示例實現了[ com.sensorsdata.webhook.processor.SfWebhookProcessor|https://github.com/sensorsdata/sf-webhook-helper/blob/master/src/main/java/com/sensorsdata/webhook/processor/SfWebhookProcessor.java] 介面。 介面定義如下:

public interface SfWebhookProcessor { void handleWebhookEntries(List<SfWebhookEntry> entries); }


  • 參數entries 包含一組來自神策智慧運營伺服器的請求,其中 SfWebhookEntry 包含了每個請求的[ request|https://github.com/sensorsdata/sf-webhook-helper/blob/master/src/main/java/com/sensorsdata/webhook/entry/SfWebhookRequestEntry.java] 和[ response|https://github.com/sensorsdata/sf-webhook-helper/blob/master/src/main/java/com/sensorsdata/webhook/entry/SfWebhookResponseEntry.java] 。
  • 若一個 entry 處理失敗,可以通過調用 entry.getResponse().failed("some reason"); 返回錯誤原因給神策智慧運營伺服器,以供排查。
  • 若沒有顯式對 response 設置是否成功,預設按處理成功返回。
  • 該介面可以滿足大部分使用場景,並可以通過增加服務線程數(Jetty 線程池大小)來增加併發度,具體方法請見本文關於 Bootstrap 類的介紹。
  • 該實現函數可能被多個線程同時調用。
  • 簡易範例代碼

異步中間人請求轉發

一種Webhook 處理場景:當我們接到一個來自神策智慧運營伺服器的 Webhook 請求後,會對請求內容進行一定變換,拼裝成一個新的請求,再發送到其他伺服器的HTTP API。 一個例子是某短信發送平台對外提供 HTTP API介面,並提供了請求規範,包括請求內容如何封裝,這時就需要有一個「中間人」中轉神策智慧運營 Webhook 的請求。 這種場景可以用上面第二節的「簡單接收和處理」實現,但如需要實現更高性能的異步轉發,可以實現我們封裝的抽象類 com.sensorsdata.webhook.middleman.SfWebhookMiddleManProcessor ,類定義如下:

public abstract class SfWebhookMiddleManProcessor { /** * 將 webhook 請求轉換成向下游請求的內容 ** @param requestEntries原 webhook 請求* @param httpClient* @return 向下游請求的 request body */ public abstract Request handleWebhookRequest(List<SfWebhookRequestEntry> requestEntries,HttpClient httpClient) throws Exception; /** *如果目標服務有 response body,將調用該請求將 response 轉化為對神策智慧運營請求結果 ** @param responseStatusCode 目標服務的返回碼 * @param responseBody 目標服務的 response body,可能為 null* @param requestEntries 本次請求對應的神策智慧運營request* @return 返回空集合表示全部成功 */ public List< SfWebhookResponseEntry> handleNewEndpointResponse( int responseStatusCode,String responseBody,List< SfWebhookRequestEntry> requestEntries) throws Exception { return Collections.emptyList(); }}


  • 實現該抽象類可以將轉發的請求異步執行。
  • handleWebhookRequest 實現只需要根據 requestEntries 構造並返回[ Request |https://www.eclipse.org/jetty/javadoc/current/org/eclipse/jetty/client/api/Request.html]物件 ,不需要實際執行這個請求。
  • Request 物件描述了對範本的請求,包括使用哪種 HTTP Method,Cookie、Header、Request Body 等。
  • 向目標 API 請求結束後,工具框架將調用 handleNewEndpointResponse 方法,以解析目標 API 的請求結果,返回空陣列或 null 表示本次所有請求都是成功的。
  • 該實現類的方法可能會被多個線程同時訪問。 範例使用代碼可以參考代碼實現樣例

用 Bootstrap 類啟動服務

您可以在您的 Java 程式中合適的位置啟動 Webhook 服務,Bootstrap 封裝了用於啟動的參數:

參數名

說明

必須

注意

localPort

服務綁定的埠。


webhookProcessor

一個實現了SfWebhookProcessor 介面的對象實例。


與 webhookProcessor 互斥,只能配置一個

middleManProcessor

一個實現了SfWebhookMiddleManProcessor 抽象類的物件實例。


與 middleManProcessor 互斥,只能配置一個。

secretTokenForSignatureCheck

用於檢查請求是來自神策智慧運營伺服器的 Secret Token。

需要在神策智慧運營服務端配置 Secret Token 後使用。 可以不傳值,但傳值意味著一定會校驗,校驗原理可以參考[ 驗證數據來自神策智慧運營

#scroll-bookmark-1] 。

serverThreadPoolMaxSize

用於接收新請求和處理請求的線程池大小。