使用FeignClient調用遠程服務時整合本地方法

來源:互聯網
上載者:User

背景 嘗試將本地方法加入Feign介面 嘗試通過實現兩個介面 IS -> HAS

背景

封裝一個使用者服務,一部分功能需要調用遠程服務,?而另一部分功能調用本地方法,如:

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

SUCCESS:

這樣是可以的。編碼時稍微麻煩了一點,使用時就清晰多了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.