一、简介
Feign是Netflix开发的声明式,模块化的HTTP客户端
1 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2 配置调用接口
/*
* 声明需要调用的微服务名称
* @FeignClient
* */
@FeignClient(name = "service-product")
public interface ProductFeignClient {
/*
* 配置需要调用的微服务接口
* */
@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
public Product findById(@PathVariable Long id);
}
3 在启动类上激活feign
@EnableFeignClients
4 通过自动的接口调用远程微服务
@Autowired
private ProductFeignClient productFeignClient;
@GetMapping("{id}")
public Product findById(@PathVariable Long id){
Product product = productFeignClient.findById(id);
return product;
}
二:日志追踪
配置服务消费者的配置文件
# 配置feign日志输出
# 日志级别: NONE(不输出日志,性能高) BASIC(适用于生产环境追踪问题)
# HEADERS(在BASIC基础上,记录请求和响应头信息) FULL(记录所有信息)
feign:
client:
config:
service-product: # 需要调用的服务名称,即服务服务提供者
loggerLevel: FULL
logging:
level:
com.gfy.eureka.feign.ProductFeignClient: debug
三、源码分析
启动类 @EnableFeignClients
--->FeignClientsRegister.class(1.注册配置2.创建并注册FeignClientFactoryBean对象)
--->FeignClientFactoryBean
--->FeignInvocaitonHandler(动态代理对象)
扫描所有@FeignClien注解,找到对应的接口
创建标注了@FeignClient接口的动态代理对象FeignInvocationHandler
四、高并发问题
由于tomcat会以线程池的形式对所有请求进行统一管理,所以当某个方法存在耗时问题时,
外面积压的请求越来越多,会导致其他请求无法访问,最终导致系统的崩溃
为了解决该问题,采用两种方法:
1.线程池隔离(为访问量高的接口创建独立的线程池)
2.信号量隔离(为每个请求设置访问阈值,请求量若超过阈值,则请求失败)标签:Feign,服务,请求,product,接口,组件,feign,id From: https://www.cnblogs.com/Fei-Gao/p/16814227.html
五:雪崩
由于系统服务之间的强依赖性,导致在某服务处于长时间等待时,导致依赖其服务的服务积压过多的请求,造成服务瘫痪(故障传播)。
解决方法:
1.服务隔离
2.熔断降级
3.服务限流