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


声明:本文转载自https://my.oschina.net/polly/blog/1637853,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

背景

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

@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");   } } 

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

本文发表于2018年03月17日 22:38
(c)注:本文转载自https://my.oschina.net/polly/blog/1637853,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2976 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1