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