使用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");
? }
}為了簡化篇幅,并沒有處理異常。
當(dāng)使用者使用這兩個(gè)用戶相關(guān)的服務(wù),就需要自動(dòng)裝載兩個(gè)Service:
@Autowired private LocalUserService localUserService; @Autowired private RemoteUserService remoteUserService;
能不能簡化一下呢?將兩個(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:
測試發(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:
測試發(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)過測試發(fā)現(xiàn),我們以url的方式來訪問網(wǎng)站時(shí)可以直接跳過登陸頁面進(jìn)入后臺頁面,這樣顯然是不合理的,下面我們通過異常攔截器+boot來做到訪問限制,以及實(shí)現(xiàn)新增員工功能,制作全局異常處理器2022-10-10
java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
SpringCloudGateway使用Skywalking時(shí)日志打印traceId解析
這篇文章主要為大家介紹了SpringCloudGateway使用Skywalking時(shí)日志打印traceId解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
java保留小數(shù)的四種實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了java保留小數(shù)的四種實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11

