本文采用的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包 跟消费方 无所谓