本文采用的springcloud 版本 Dalston.SR4 所有例子以Dalston.SR4 版本为准
feign 作为 springcloud 微服务 内部通信的组件 还是有很多坑的
坑1、
Load balancer does not have available server for client
这是因为 默认的eureka 启动时 相关的服务端还没有来得及往 eureka 服务端注册 或者 eureka server中没有注册 相关的服务
坑2、看了很多 教程 说 feign 类上的 @RequestMapping 不会被加入 接口映射 没错 想想也应该是这样 但是为了解决这个问题 我在接口方法上加入映射路径是否可行呢
可以做个 测试 我这里有 2个服务 MESSAGE-SERVICE 是服务提供者 SMS-SERVICE 是 服务消费者 feignware 单独模块 用来统一提供 相互调用的api 生产中建议feign集中配置 一个eureka server
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 : 这样写 直接加入 类一级的/msg
@FeignClient(value = "MEMBER-SERVICE")
public interface UserService {
@PostMapping("/msg/get")
User get(@RequestBody User user);
}
SMS-SERVICE 调用接口:
@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;
}
}
流程是这样的 :
执行结果: 请求成功
去掉了 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包 跟消费方 无所谓