博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用FeignClient调用远程服务时整合本地方法
阅读量:7084 次
发布时间:2019-06-28

本文共 2633 字,大约阅读时间需要 8 分钟。

背景

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

@FeignClient(value="USER-SERVICE")public interface RemoteUserService{  @GetMapping("getUserByUserId")  public User getUserByUserId(String userId);}public interface LocalUserService{  public String getUserId();}@Servicepublic class LocalUserServiceImpl implements LocalUserService{  @Autowired  private HttpServletRequest request;  public String getUserId(){    return (String)request.getSession().getAttribute("user-id");  }}

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

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

@Autowiredprivate LocalUserService localUserService;@Autowiredprivate RemoteUserService remoteUserService;

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

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

@FeignClient(value="USER-SERVICE",fallback=UserServiceHystrix.class)public interface UserService{  @GetMapping("getUserByUserId")  public User getUserByUserId(String userId);  public String getUserId();}@Servicepublic 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();}@Servicepublic 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();}@Servicepublic 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");  }}

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

转载地址:http://ixmml.baihongyu.com/

你可能感兴趣的文章
JAVA入门[8]-测试mybatis
查看>>
C语言 · 大数乘法
查看>>
lower_bound与upper_bound
查看>>
HBase in Action前三章笔记
查看>>
iOS开发自己定义键盘回车键Return Key
查看>>
大型分布式站点的技术需求
查看>>
vue2
查看>>
自动工作负载库理论与操作(Automatic Workload Repository,AWR)
查看>>
python标准库介绍——21 UserDict 模块详解
查看>>
SpringMVC系列(四)使用 POJO 对象绑定请求参数值
查看>>
Nginx的https配置记录以及http强制跳转到https的方法梳理
查看>>
vue-worker的介绍和使用
查看>>
vue同一页面中拥有两个表单时,验证问题
查看>>
Roslyn还出现这么低级的错误,不应该呀!
查看>>
plsql 通过修改配置文件的方式实现数据库的连接
查看>>
VC++调用MSFlexGrid的SetRow方法,出现异常“Invalid Row Value”
查看>>
dubbo服务端,dubbo客户端,注册中心(zk)之间的心跳
查看>>
rapidjson使用总结
查看>>
MD5 Hashing in Java
查看>>
EMQ ---客户端上线自动订阅主题
查看>>