Springboot-微服务-微服务组件之服务管理-优雅的调用服务-Feign
简介
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
快速入门
重要点
引入feign相关依赖
在Springboot启动类上,开始@EnableFeignClients
编写一个Fegin接口
注入Fegin接口相关类,调用接口。
引入feign相关依赖
<!--引入feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
在Springboot启动类上,开启@EnableFeignClients 注解
package com.caicai;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
//@EnableDiscoveryClient//开启eureka服务端的调用
//@SpringBootApplication
//@EnableCircuitBreaker //添加Hystrix
//@EnableHystrix
@EnableFeignClients //添加feign启动注解
@SpringCloudApplication // 一个标准的eureka标准的客户端都需要配置以上三个注解,所以Spring 提供一个新的注解SpringCloudApplication包含的以上三个注解
public class ConsumerServiceApplication {
//Spring boot 调用的接口都是rest风格的接口,这里我们使用,Spring 自带的resTemplate 去调用,它包含了:http,post 等等
// @Bean
// @LoadBalanced//开启负载均衡注解
// public RestTemplate restTemplate(){
//
// return new RestTemplate();
// }
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication.class);
}
}
编写一个Fegin接口
为什么要编写这个接口?
因为fegin 要靠这个接口,知道接口请求路径,服务地址,以及参数
package com.caicai.Consumer.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("user-service")
public interface UserClient {
@GetMapping("user/{id}")
String queryById(@PathVariable("id") Long id);
}
注入Fegin接口相关类,调用接口。
@Autowired
UserClient userClient;
// @HystrixCommand
@GetMapping("{id}")
public String queryById(@PathVariable("id") Long id)
{
return userClient.queryById(id);
}
问题
调用服务,失败!
Request processing failed; nested exception is feign.RetryableException: Read timed out executing GET
java.net.SocketTimeoutException: Read timed out
解析
当访问微服务的响应时间超过5秒,就会出现 :
Read timed out executing with root cause
后面查阅很多资料,发现是ribbon的配置问问题
详细说明
-
ribbon.ConnectTimeout:请求连接的超时时间
默认1S
-
ribbon.ReadTimeout:请求处理的超时时间
默认1S
-
ribbon.OkToRetryOnAllOperations:对所有操作请求都进行重试
-
ribbon.MaxAutoRetriesNextServer:切换实例的重试次数
-
ribbon.MaxAutoRetries:对当前实例的重试次数
解决这个问题,我们只需在yml配置文件中添加ribbon的ConnectTimeout、ReadTimeout ,这两个时间长一点,即可解决sockt 超时问题**
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000