spring cloud 中 eureka、ribbon、fegin踩过的坑

一、Eureka常见问题

1.System Status信息修改

在eureka注册中心的项目上进行修改:

eureka:
  environment: weifuwu
  datacenter: weifuwu-cloud

重启eureka进行访问:

2.eureka剔除心跳失败的节点

我们希望Eureka Server直接踢出已关停的节点的配置如下:

服务器端配置:

eureka:
  server:
    enable-self-preservation: false  (设为false,关闭自我保护)
    eviction-interval-timer-in-ms: 4000

客户端配置:

eureka:
    lease-renewal-interval-in-seconds: 10
    lease-expiration-duration-in-seconds: 30

这里我们设置服务端关闭自我保护,然后清理服务列表的时间间隔为4秒;客户端端租期更新时间间改为10秒,租期到期时间改为30秒,这样Eureka会更快感知到其租期到期,并直接关闭该服务。

3、Eureka配置instanceId显示IP

配置参数:${spring.cloud.client.ipAddress}

注意:spring could 2.0版本 需要改成${spring.cloud.client.ip-address}

eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}

二、ribbon常见问题

1.自定义配置时,@Configuration和@ComponentScan包不应重叠

自定义的RibbonConfiguration类必须用@Configuration注解标注,但是它不应该在主Application Context的组件扫描之中,否则它将被所有的Ribbon客户端共享

例如:自定义的配置类需要引入@Configuration注解,而启动类需要@SpringBootApplication,而次注解包含Application Context,所以二者不能放在同一个包下。

2.使用RestTemplate时,想要获得一个List时,应该用数组,而不应该直接用List

我们在user中编写代码来反映这个问题。我们在user的Controller类中添加这样一个服务:


@GetMapping("/list-all")
public List<User> listAll(){
    List<User> userList = new ArrayList();
    User u1 = new User();
    u1.setId(1L);
    u1.setName("jack1");
    User u2 = new User();
    u2.setId(2L);
    u2.setName("jack2");
    User u3 = new User();
    u3.setId(3L);
    u3.setName("jack3");
    userList.add(u1);
    userList.add(u2);
    userList.add(u3);
    return userList;

}

启动user,直接访问“list-all”得到的结果如下:

然后我们需要在movie的服务中通过ribbon去调用这个服务,所以在movie工程的Controller方法中添加这样一个服务:

@GetMapping("/list-all")
public List<User> listAll(){
    List<User> list = this.restRemplate.getForObject("http://microserver-provider-user/list-all/", List.class);
    for(User user:list) {
        System.out.println(user.getId());
    }
    return list;
}

启动movie服务,访问一下它的“list-all”服务:

解决办法,将接收的List类型数据,使用目标实体类的数组来接收:

三、fegin常见问题

1、自定义配置时,@Configuration和@ComponentScan包不应重叠
这一块和Ribbon一样,这里不再赘述。

2、@FeignClient所在的接口中,不支持@GetMapping等组合注解
通常我们在FeignClient中使用的接口修饰都是@RequestMapping或者@RequestLine主要看Contract 契约的设定,默认是SpringMVC的@RequestMapping,配置成Default就是@RequestLine),例如之前编写的UserFeignClient:

注意使用到了@RequestLine注解之后,一定要在congfiguration后面配置配置类中,开启fegin特有注解的支持。

3、使用@PathVariable时,需要指定其value
我们在FeignClient中使用@PathVariable时,即使参数不使用别名,也需要为@PathVariable指定value。

4、Feign暂不支持复杂对象作为一个参数

例如之前我们在浏览器上调用testPullUser方法。url路径是这么拼写的:
http://localhost:7901/testPullUser?id=888&username=杰克&name=jack&age=25&balance=2500
在后台服务是这么写的:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值