使用FeignClient調用遠程服務時整合本地的實現方法
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:
測試發(fā)現,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:
測試發(fā)現,本地方法正常,遠程方法根本無效,好像就是一個本地方法,直接走到了熔斷方法中。
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"); ? } }
SUCCESS:
這樣是可以的。編碼時稍微麻煩了一點,使用時就清晰多了。
FeignClient服務之間調用
服務A需調用服務B的test方法
B服務不動
A:
最好新建一個server
@Component @FeignClient(value = "tools") public interface ServiceAFeignClient { ?? ?@RequestMapping(value = "/hi") ? ? String test(); }
tools為服務B配置中的spring.application.name, hi為B中Controller的接口
然后A中代碼調用新建的server的接口即可,可能會出錯
com.netflix.client.ClientException: Load balancer does not have available server for client
A的application配置加
ribbon: ? eureka: ? ? enabled: true
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot異常處理器的使用與添加員工功能實現流程介紹
設計完了登錄與退出功能還只完成了冰山一角,經過測試發(fā)現,我們以url的方式來訪問網站時可以直接跳過登陸頁面進入后臺頁面,這樣顯然是不合理的,下面我們通過異常攔截器+boot來做到訪問限制,以及實現新增員工功能,制作全局異常處理器2022-10-10SpringCloudGateway使用Skywalking時日志打印traceId解析
這篇文章主要為大家介紹了SpringCloudGateway使用Skywalking時日志打印traceId解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06