spring cloud Dalston.SR4 feign 实际开发中踩坑(一)

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

猜你喜欢

转载自my.oschina.net/u/2948566/blog/1591028