背景 嘗試將本地方法加入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:
這樣是可以的。編碼時稍微麻煩了一點,使用時就清晰多了。