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
在后台服务是这么写的:
相关文章
- 如何在Spring boot中修改默认端口
- Spring Cloud Eureka 原理分析
- spring cloud 通过feign请求动弹设置请求头heades
- 我为什么放弃Spring Boot 中的 RestTemplate?选择 Retrofit
- 从架构演进的角度聊聊spring cloud都做了些什么?
- 使用Ocelot、IdentityServer4、Spring Cloud Eureka搭建微服务网关:Step by Step(一)
- ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由
- 漏洞复现----42、Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)
- Spring Cloud-Eureka 服务注册中心
- Spring Cloud Gateway - 快速开始
- Spring Cloud Netflix Eureka: 多网卡环境下Eureka服务注册IP选择问题
- 服务链路追踪(Spring Cloud Sleuth)
- Spring Cloud 系列之 Eureka 实现服务注册与发现
- Spring Cloud (boot) 集成Sentinel
- 【Spring Cloud】如何使用Feign实现远程调用
- Spring-Cloud-Eureka注册中心和调用实例
- Spring Cloud Alibaba Nacos 中处理Consumer的UnknownHostException的问题
- Spring的声明式事务@Transactional注解的6种失效场景
- Spring Cloud GateWay路由信息的获取
- Spring Cloud入门教程
- Spring-Cloud-Context模块
- spring cloud集成 consul源码分析
- Spring Cloud Netflix Eureka client源码分析
- spring cloud config配置中心源码分析之注解@EnableConfigServer
- spring-cloud导入eclipse时,@slf4j注解为什么找不到log变量
- spring-cloud-gateway获取post请求body参数以及响应数据
- 架构发展史Spring Cloud