使用FeignClient調(diào)用遠程服務(wù)時整合本地的實現(xiàn)方法
FeignClient調(diào)用遠程服務(wù)時整合本地
包裝一個用戶服務(wù),一部分功能需要調(diào)用遠程服務(wù),而另一部分功能調(diào)用本地方法,如:
@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"); ? } }
為了簡化篇幅,并沒有處理異常。
當(dāng)使用者使用這兩個用戶相關(guān)的服務(wù),就需要自動裝載兩個Service:
@Autowired private LocalUserService localUserService; @Autowired private RemoteUserService remoteUserService;
能不能簡化一下呢?將兩個服務(wù)整合。
嘗試將本地方法加入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ā)現(xiàn),UserService 接口中定義本地方法 getUserId() 編譯器直接報錯了,要求必須有Mapping注解。
嘗試通過實現(xiàn)兩個接口
換一個思路,回到最初,在熔斷器中實現(xiàn)兩個接口:
@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ā)現(xiàn),本地方法正常,遠程方法根本無效,好像就是一個本地方法,直接走到了熔斷方法中。
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服務(wù)之間調(diào)用
服務(wù)A需調(diào)用服務(wù)B的test方法
B服務(wù)不動
A:
最好新建一個server
@Component @FeignClient(value = "tools") public interface ServiceAFeignClient { ?? ?@RequestMapping(value = "/hi") ? ? String test(); }
tools為服務(wù)B配置中的spring.application.name, hi為B中Controller的接口
然后A中代碼調(diào)用新建的server的接口即可,可能會出錯
com.netflix.client.ClientException: Load balancer does not have available server for client
A的application配置加
ribbon: ? eureka: ? ? enabled: true
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot異常處理器的使用與添加員工功能實現(xiàn)流程介紹
設(shè)計完了登錄與退出功能還只完成了冰山一角,經(jīng)過測試發(fā)現(xiàn),我們以url的方式來訪問網(wǎng)站時可以直接跳過登陸頁面進入后臺頁面,這樣顯然是不合理的,下面我們通過異常攔截器+boot來做到訪問限制,以及實現(xiàn)新增員工功能,制作全局異常處理器2022-10-10java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2021-11-11SpringCloudGateway使用Skywalking時日志打印traceId解析
這篇文章主要為大家介紹了SpringCloudGateway使用Skywalking時日志打印traceId解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06