一、OpenFeign概述
Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
OpenFeign是Feign的扩展,能够支持SpringMVC的注解,OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类。
OpenFeign = RestTemplate + Ribbon + Hystrix
二、OpenFeign的使用
1)OpenFeign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2) 编写Feign客户端接口
/**
* 调用商品服务的Feign客户端
* @FeignClient需要设置调用的服务名
*/
@FeignClient("product-service")
public interface ProductServiceFeignClient{
/**
* 调用商品id查询
* @param id
* @return
*/
@GetMapping("/product/{id}")
ResponseEntity<Product> getProductById(@PathVariable Long id);
}
3)启动类加注解扫描feign接口 @EnableFeignClients(basePackages = "com.blb.orderservice.feign")
4)调用服务时
@Autowired
private ProductServiceFeignClient productServiceFeignClient;
//使用feign客户端调用服务
ResponseEntity<Product> entity = productServiceFeignClient.getProductById(order.getProductId());
三、Feign整合Ribbon
Feign默认整合了Ribbon实现负载均衡
全局配置
ribbon.属性 = 值
指定服务配置
服务名称.ribbon.属性 = 值
Ribbon常用配置:
ConnectionTimeout 连接超时
ReadTimeout 读取超时
OkToRetryOnAllOperations 对所有操作启动重试机制 true/false
MaxAutoRetries 最大重试次数
MaxAutoRetriesNextServer 最大重试下个服务器次数
四、Feign整合Hystrix
Feign默认整合了Hystrix的熔断机制
Feign可以单独定义类,编写降级方法
实现:
1)定义降级处理类,实现对应的FeignClient接口
2)实现接口中的方法,所有方法均为降级方法
/**
* 降级处理类
*/
@Component
public class ProductServiceFallback implements ProductServiceFeignClient {
/**
* 降级方法返回兜底数据
*/
@Override
public ResponseEntity<Product> getProductById(Long id) {
Product product = new Product(id,"降级数据", BigDecimal.valueOf(0),"测试");
return ResponseEntity.ok(product);
}
}
3)在FeignClient注解中配置降级方法处理类
@FeignClient(value = "product-service",fallback = ProductServiceFallback.class)
4)启动Feign的Hystrix特性
feign.hystrix.enabled=true
PS: 如果feign接口和降级类和服务提供者项目不是同一个项目,需要加包的扫描
@SpringBootApplication(scanBasePackages = {"com.blb.orderservice","com.blb.common"})
五、Feign配置优化
1. 优化连接池
Feign是基于HTTP协议,HTTP协议基于TCP协议,TCP具有三次握手四次挥手机制,频繁的创建连接比较消耗系统的资源和时间,降低系统的吞吐量。
使用连接池可以减少网络连接的创建,提高连接的使用效率,提高系统吞吐量。
Feign默认使用JDK自带的HttpURLConnection,没有连接池。
可以使用HttpClient或OkHttp
使用步骤:
1)导入feign-httpclient依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2)feign.httpclient.enable=true
2. 请求压缩优化
Feign可以对网络数据进行GZIP压缩,减少网络流量,提高速度
启动压缩:
#启动请求压缩
feign.compression.request.enabled=true
#启动响应压缩
feign.compression.response.enabled=true
#设置请求压缩的多媒体类型
feign.compression.request.mime-types=text/html,application/xml,application/json
#设置请求压缩的下限 (默认2048)
feign.compression.request.min-request-size=1024
3. 使用日志对连接过程进行监控
1)开启debug日志
logging.level.包名.FeignClient接口名=DEBUG
2)定义配置类,配置日志
/** Feign日志配置 */
@Configuration
public class FeignLoggerConfig {
/** 返回日志类型,NONE没有日志,BASIC基本信息(请求方法,URL,响应代码等),HEADERS(头部信息),FULL(基本+头部)*/
@Bean
public Logger.Level level(){
return Logger.Level.BASIC;
}
}
4. 超时优化
Ribbon是具有重试机制的,就是连接失败后进行重连,问题是:Hystrix的超时时间默认是小于Ribbon的超时,Hystrix会提前熔断,Ribbon无法进行重试
Hystrix的超时要大于Ribbon的超时
# hystrix的超时
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
# ribbon的超时
ribbon.ConnectionTimeout=1000
ribbon.ReadTimeout=3000
一、Feign工作原理
为什么Feign只需要编写接口就能完成远程服务的调用
关键技术:
IOC
动态代理
HTTP网络连接
实现步骤:
1) 添加@EnableFeignClients后,对Feign接口进行扫描,加载FeignClient接口信息到IOC容器中
2) 使用JDK动态代理创建FeignClient接口的实现类
3) 在JDK动态代理的InvocationHandler中的invoke方法实现方法的调用,创建RequestTemplate对象
4) 将RequestTemplate对象交给负载均衡器处理,对请求进行编码,发送HTTP请求
5) 获得响应,对响应进行解码,返回数据