本文采用的springcloud 版本 Dalston.SR4 全部例子以Dalston.SR4 版本爲準java
feign 做爲 springcloud 微服務 內部通訊的組件 仍是有不少坑的spring
坑1、 api
Load balancer does not have available server for client
這是由於 默認的eureka 啓動時 相關的服務端尚未來得及往 eureka 服務端註冊 或者 eureka server中沒有註冊 相關的服務 app
坑2、看了不少 教程 說 feign 類上的 @RequestMapping 不會被加入 接口映射 沒錯 想一想也應該是這樣 可是爲了解決這個問題 我在接口方法上加入映射路徑是否可行呢微服務
能夠作個 測試 我這裏有 2個服務 MESSAGE-SERVICE 是服務提供者 SMS-SERVICE 是 服務消費者 feignware 單獨模塊 用來統一提供 相互調用的api 生產中建議feign集中配置 一個eureka server post
MESSAGE-SERVICE 提供接口 :測試
@RestController @RequestMapping("/msg") public class UserController { @PostMapping("/get") public User getUser(@RequestBody User user) { System.out.println("i am message-service <<<<<<<<<<<<<<<<<<<<"); System.out.println(user); return user; } }
feignware : 這樣寫 直接加入 類一級的/msgspa
@FeignClient(value = "MEMBER-SERVICE") public interface UserService { @PostMapping("/msg/get") User get(@RequestBody User user); }
SMS-SERVICE 調用接口:code
@RestController @RequestMapping("/sms") public class RemoteController { @Resource private UserService userService; @GetMapping("/go") public User test(User user){ System.out.println(">>>>>>>>>>>"); User result=userService.get(user); System.out.println(result); return result; } }
流程是這樣的 : server
執行結果: 請求成功
去掉了 feignware 中 /msg 一級後 測試 結果:
結果說明: feign 類上的 @RequestMapping 不會被加入 接口映射 是對的 若是 想加入正好上面是個解決方案
坑3、 feign 調用是 post 請求 仍是上面的例子 測試看看 先說明一句 看到有的教程上說
feign只支持 @RequestMapping 這種說法是不對 上面已經有例子證實了這一點 起碼上 @GetMapping @PostMapping 是支持的 其餘 springcloud版本沒有試過
咱們先三者都採用@GetMapping 看看結果:
405 究竟是哪裏不支持 get呢 來幾組測試:
sms get feignware get message get 結果 405
sms get feignware post message get 結果 405
sms post feignware post message get 結果 405
sms post feignware get message post 結果 200
sms post feignware post message post 結果 200
sms get feignware post message post 結果 200
sms get feignware get message post 結果 200
結果總結一下 就是 @RequestBody 調用提供方 必定要用post feign包 跟消費方 無所謂