SpringCloud踩坑笔记——Feign调用没有参数并且404

场景重现
我在demo项目中加入了zuul网关,写了俩服务,客户端向content服务发起get请求,经过zuul网关判断请求是否携带必要参数,然后再进入content服务,使用参数访问user服务。但是我写完这些之后,发现只要是请求就直接进到fallback方法里,提示远程方法超时,这就奇怪了,我远程服务好好的,都能请求的通的,那是什么原因呢。
跟踪Feign的执行接口Client.class的execute方法,发现我的url有俩问题
1.没有携带username参数
2.host不对,写的是服务名,也没有端口号

问题1:
请求只有url,没有参数,也就是说参数没有向下游传递。
解决方法:在content服务的接口方法的参数上添加@RequestParam注解,将请求参数与方法参数对应。同时保证远程调用接口的方法参数上也有该注解。
content接口

@RequestMapping("/listByUsername")
    public String listByUsername(@RequestParam("name") String name){
        List list = myService.listMyBlogs(name);
        return JSON.toJSONString(list);
    }

UserRemote接口

@Service
@FeignClient(name = "user")
public interface UserRemote {
    @RequestMapping("/findByUsername")
    String findByUsername(@RequestParam(value = "name") String name);
}

问题2:
host不对,我在比对了示例项目和自己项目的区别之后发现我少了个配置
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id= s p r i n g . c l o u d . c l i e n t . i p A d d r e s s : {spring.cloud.client.ipAddress}: spring.cloud.client.ipAddress:{server.port}
我只知道这样会使服务是用ip加端口的方式注册到eureka
我在user服务,content服务和zuul上都添加了这个配置

测试了一下,是好用的,具体是因为啥,还有待研究,暂时先这么解决。如果各位有更好的方法或者知道这个是怎么回事,也非常希望能告诉我一下呀~

你可能感兴趣的:(SpringCloud)