ApiBoot - ApiBoot Resource Load 使用文件

恆宇少年發表於2019-04-17

ApiBoot Resource Load

ApiBoot Resource Load是一款資源與業務完全分離的基礎框架,可以整合微服務(Feign、OpenFeign)進行負載均衡讀取固定型別、固定所屬業務的資源資訊,遵循一定的資源儲存規則完成自動化資源讀取、新增、更新、刪除、快取等。

使用場景

  • 業務圖片儲存
  • 業務音訊、視訊檔案儲存
  • 業務檔案
  • 其他資原始檔...

引入 ApiBoot Resource Load

pom.xml配置檔案內新增如下依賴:

<!--ApiBoot Resource Load-->
<dependency>
  <groupId>org.minbox.framework</groupId>
  <artifactId>api-boot-starter-resource-load</artifactId>
</dependency>
複製程式碼

ApiBoot所提供的依賴都不需要新增版本號,但是需要新增版本依賴,具體檢視ApiBoot版本依賴

瞭解ApiBootResourceStoreDelegate

ApiBootResourceStoreDelegate是一個資源資料讀取的委託驅動介面,在使用ApiBoot Resource Load時,需要實現該介面完成資源的讀取方法loadResourceUrl(),該方法的引數如下所示:

  1. 第一個引數sourceFieldValue,是查詢資源的業務編號,具體的配置詳見下面的示例。
  2. 第二個引數resourceType,是查詢資源的型別,相同的業務編號下很有可能存在多種型別,比如:使用者編號對應使用者頭像、使用者封面等。

ApiBootResourceStoreDelegate示例:

// 示例
@Service
public class ResourceLoadService implements ApiBootResourceStoreDelegate {
    /**
     * logger instance
     */
    static Logger logger = LoggerFactory.getLogger(ResourceLoadService.class);

    @Override
    public List<String> loadResourceUrl(String sourceFieldValue, String resourceType) throws ApiBootException {
        logger.info("查詢資源的業務邏輯欄位值:{}", sourceFieldValue);
        logger.info("資源型別:{}", resourceType);
        return Arrays.asList(new String[]{"http://test.oss.com/111.png"});
    }
}
複製程式碼

loadResourceUrl方法需要返回根據resourceFieldValueresourceType欄位查詢到的資源列表。

內建註解

  • @ResourceLoad

    標註方法需要進行ApiBoot Resource Load自動化讀取資源資訊,該註解必須新增,且只能新增在方法上。

  • @ResourceFields

    @ResourceField註解的集合

  • @ResourceField

    配置@ResourceLoad標註的方法具體有哪些欄位需要進行資源的自動對映,引數解釋如下所示:

    • name:查詢資源後設定到類內Field的名稱
    • source:查詢資源所需的業務邏輯編號類內Field的名稱
    • type:資源型別,自行定義
    • isArray:接收查詢後資源的Field型別是否為array,true:array
    • isList:接收查詢後資源的Field型別是否為list,true:list

單物件資源載入

資源載入一般都是實體類的方式進行返回的,下面我們先來建立一個實體類方便示例測試,如下所示:

/**
  * 示例物件
  */
@Data
class SampleUserInfo {
  public SampleUserInfo(String userId, int age) {
    this.userId = userId;
    this.age = age;
  }

  private String userId;
  private String headImage;
  private String shortImage;
  private int age;
}
複製程式碼

返回值為單物件資源載入示例:

/**
  * 返回值為單個物件的示例
  *
  * @return
  */
@ResourceLoad
@ResourceFields({
  @ResourceField(name = "headImage", source = "userId", type = "HEAD_IMAGE"),
  @ResourceField(name = "shortImage", source = "userId", type = "SHORT_IMAGE")
})
public SampleUserInfo singleObjectSample() {
  return new SampleUserInfo("yuqiyu", 24);
}
複製程式碼

在上面,我們配置讀取兩種型別的資源,分別是:HEAD_IMAGESHORT_IMAGE,而且配置的業務資源編號都是userId欄位,這兩個欄位也就是會傳遞給ApiBootResourceStoreDelegate#loadResourceUrl方法作為引數。

其中HEAD_IMAGE讀取到的資源路徑設定到SampleUserInfo類內的headImageSHORT_IMAGE讀取到的資源路徑設定到SampleUserInfo類內的shortImage欄位。

注意:如果你的方法返回物件只有一個資源物件需要對映,可以單獨配置使用@ResourceField註解。

List集合資源載入

/**
  * 返回值為list集合的示例
  *
  * @return
  */
@ResourceLoad
@ResourceFields({
  @ResourceField(name = "headImage", source = "userId", type = "HEAD_IMAGE"),
  @ResourceField(name = "shortImage", source = "userId", type = "SHORT_IMAGE")
})
public List<SampleUserInfo> listSample() {
  List<SampleUserInfo> users = new ArrayList();
  users.add(new SampleUserInfo("yuqiyu", 24));
  users.add(new SampleUserInfo("hengboy", 24));
  return users;
}
複製程式碼

在上面,會為返回值list內的每一個SampleUserInfo物件進行設定查詢的資源資訊。

Map集合資源載入

/**
  * 返回值為map集合的示例
  *
  * @return
  */
@ResourceLoad
@ResourceFields({
  @ResourceField(name = "headImage", source = "userId", type = "HEAD_IMAGE"),
  @ResourceField(name = "shortImage", source = "userId", type = "SHORT_IMAGE")
})
public Map<String, SampleUserInfo> mapSample() {
  Map<String, SampleUserInfo> users = new HashMap<>(2);
  users.put("yuqiyu", new SampleUserInfo("yuqiyu", 24));
  users.put("hengboy", new SampleUserInfo("hengboy", 24));
  return users;
}
複製程式碼

Map型別作為返回值時,其中注意map -> value必須是物件型別。

如果你有想要的使用方式,你就可以提交issuse!!!

相關文章