一、什么是Feign?
Feign是一个基于Java的声明式HTTP客户端框架,用于简化与RESTful API的交互。它是Spring Cloud生态系统中的一个组件,旨在使微服务之间的通信更加简单和优雅。
二、为什么要使用Feign?
起初微服务之间的调用是通过RestTemplate,调用比较复杂,url需要拼接,使用不太方便,而使用Feign,它是SpringCloud提供的声明式的HTTP客户端,只用编写接口,就能够通过http请求实现服务的调用。
三、介绍OpenFeign
OpenFeign = RestTemplate + Ribbon + Hystrix
OpenFeign是Feign的扩展,能够支持SpringMVC注解。与Feign相比,OpenFeign的一个主要改进是集成了Spring Cloud的服务发现功能,可以与注册中心(如Eureka、Consul等)无缝集成,简化了服务之间的调用。OpenFeign还提供了对Hystrix的集成,可以方便地实现服务的容错和故障转移。
使用OpenFeign,你只需要添加相应的依赖和配置,然后定义接口来描述API,并使用注解来指定请求的类型、路径、参数等。OpenFeign会自动生成具体的HTTP请求代码,并处理响应,让你能够以一种直观和简洁的方式与远程服务进行通信。
四、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.调用服务时,使用IOC容器实例接口对象,直接调用feign配置类中的方法。
@Autowired
private ProductServiceFeignClient productServiceFeignClient;
//使用feign客户端调用服务
ResponseEntity<Product> entity = productServiceFeignClient.getProductById(order.getProductId());
五、Feign使用
Feign整合Ribbon(负载均衡)
Feign默认整合了Ribbon实现负载均衡
-
全局配置
ribbon.属性 = 值
-
指定服务配置
服务名称.ribbon.属性 = 值
Ribbon常用配置:
-
ConnectionTimeout 连接超时
-
ReadTimeout 读取超时
-
OkToRetryOnAllOperations 对所有操作启动重试机制 true/false
-
MaxAutoRetries 最大重试次数
-
MaxAutoRetriesNextServer 最大重试下个服务器次数
Feign整合Hystrix
Feign默认整合了Hystrix 的熔断机制。可以单独编写定义类,编写降级方法。
实现:
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
Feign工作原理
六、总结
总的来说,Feign是一个用于轻松创建RESTful客户端的Java库。它是Netflix开源的项目之一,功能强大且易于使用。Feign的使用简单,可以减少大量的样板式的工作量,还整合了Ribbon和Hystrix,与这两个库无缝集成,Feign能够以更强大和可靠的方式调用远程服务。Feign支持多种协议,包括HTTP、HTTPS、HTTP/2和WebSocket。这使得Feign能够与各种类型的服务进行通信,并且可以根据需要轻松切换协议。