Skip to content

请求第三方 BS 服务

场景案例

A 服务中有一个用户列表接口(GET /user/list),该接口是用 Bean Searcher 驱动的,并且遵从了 Bean Searcher 的参数约定。

假设现在你正在开发一个 B 服务,在 B 服务中你需要远程调用 A 服务中的这个用户列表接口,那么你该如何组织参数呢?能否使用参数构建器呢?

不使用参数构建器

例如,你需要在一堆 用户ID 里去检索年龄最大的 20 个用户,你的代码可能会这样写:

java
List<Long> userIds = getUserIds();  // 用户ID
// 用户 ID 参数
Map<String, Object> params = new HashMap<>();
for (int i = 0; i < userIds.size(); i++) {
    params.put("id-" + i, userIds.get(i));
}
params.put("id-op", "il");
// 按年龄降序
params.put("sort", "age");
params.put("order", "desc");
// 分页参数
params.put("page", 0);
params.put("size", 20);
// 调用远程服务中的接口
List<User> users = romoteApi.getUserList(params);

使用参数构建器

v4.3.0 起,你也可以使用参数构建器提供的 buildForRpc() 方法,来生成远程调用的请求参数了:

java
List<Long> userIds = getUserIds();  // 用户ID
// 组织检索参数
Map<String, Object> params = MapUtils.builder()
        .field(User::getId, userIds).op(InList.class)
        .orderBy(User::getAge).desc()
        .page(0, 20)
        .buildForRpc();
// 调用远程服务中的接口
List<User> users = romoteApi.getUserList(params);

自定义参数名

如果远程服务中的 Bean Searcher 接口,自定义了一些参数名(比如:分页参数名使用 pageNopageSize,字段参数名分隔符使用了下划线 _),那么也可以使用参数构建器提供的 buildForRpc(RpcNames) 方法:

java
Map<String, Object> params = MapUtils.builder()
        .field(User::getId, userIds).op(InList.class)
        .page(0, 20)
        .buildForRpc(
            RpcNames.newNames()
                .separator("_")   // 字段参数名分隔符使用了下划线
                .page("pageNo")   // 分页页码参数使用 pageNo
                .size("pageSize") // 分页大小参数使用 pageSize
        );
// 调用 A 服务中的接口
List<User> users = romoteApi.getUserList(params);

或者,你也可以在服务启动时修改全局 RPC 参数名的默认配置:

java
RpcNames.DEFAULT          // 默认配置对象
    .separator("_")       // 字段参数名分隔符使用了下划线
    .page("pageNo")       // 分页页码参数使用 pageNo
    .size("pageSize");    // 分页大小参数使用 pageSize

该配置只影响 buildForRpc(..) 方法,对本服务的 BeanSearcherMapSearcher 检索器没有影响。

基于 Apache 许可发布