使用FeignClient调用远程服务时整合本地方法

背景

包装一个用户服务,一部分功能需要调用远程服务,而另一部分功能调用本地方法,如:

@FeignClient(value="USER-SERVICE")
public interface RemoteUserService{
  @GetMapping("getUserByUserId")
  public User getUserByUserId(String userId);
}

public interface LocalUserService{
  public String getUserId();
}

@Service
public class LocalUserServiceImpl implements LocalUserService{
  @Autowired
  private HttpServletRequest request;
  public String getUserId(){
    return (String)request.getSession().getAttribute("user-id");
  }
}

为了简化篇幅,并没有处理异常。

当使用者使用这两个用户相关的服务,就需要自动装载两个Service:

@Autowired
private LocalUserService localUserService;

@Autowired
private RemoteUserService remoteUserService;

能不能简化一下呢?将两个服务整合。

尝试将本地方法加入Feign接口

@FeignClient(value="USER-SERVICE",fallback=UserServiceHystrix.class)
public interface UserService{
  @GetMapping("getUserByUserId")
  public User getUserByUserId(String userId);

  public String getUserId();
}

@Service
public class UserServiceHystrix implements UserService{
  @Autowired
  private HttpServletRequest request;

  public User getUserByUserId(String userId){
    return null;
  }

  public String getUserId(){
    return (String)request.getSession().getAttribute("user-id");
  }
}

Fail:

测试发现,UserService 接口中定义本地方法 getUserId() 编译器直接报错了,要求必须有Mapping注解。

尝试通过实现两个接口

换一个思路,回到最初,在熔断器中实现两个接口:

@FeignClient(value="USER-SERVICE",fallback=UserServiceHystrix.class)
public interface UserService{
  @GetMapping("getUserByUserId")
  public User getUserByUserId(String userId);
}

public interface LocalUserService extends RemoteUserService{
  public String getUserId();
}

@Service
public class UserServiceHystrix implements LocalUserService,RemoteUserService{
  @Autowired
  private HttpServletRequest request;

  public User getUserByUserId(String userId){
    return null;
  }

  public String getUserId(){
    return (String)request.getSession().getAttribute("user-id");
  }
}

Fail:

测试发现,本地方法正常,远程方法根本无效,好像就是一个本地方法,直接走到了熔断方法中。

IS -> HAS

让 RemoteUserService is LocalUserService 既然不行,那么就试试让 LocalUserService has RemoteUserService。

@FeignClient(value="USER-SERVICE",fallback=UserServiceHystrix.class)
public interface UserService{
  @GetMapping("getUserByUserId")
  public User getUserByUserId(String userId);
}

public interface LocalUserService extends RemoteUserService{
  public String getUserId();
}

@Service
public class UserServiceImpl implements LocalUserService,RemoteUserService{
  @Autowired
  private HttpServletRequest request;
  @Autowire
  private RemoteUserService remoteUserService;

  public User getUserByUserId(String userId){
    return remoteUserService.getUserByUserId(userId);
  }

  public String getUserId(){
    return (String)request.getSession().getAttribute("user-id");
  }
}

这样是可以的。编码时稍微麻烦了一点,使用时就清晰多了。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/547825

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。