一、Feign简介
Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便。
它具有可插拔注释支持,包括Feign注解和JAX-RS注解、Feign还支持可插拔编码器和解码器、Spring Cloud增加了对Spring MVC注释的支持,并HttpMessageConverters在Spring Web中使用了默认使用的相同方式。Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供负载平衡的http客户端。
二、OpenFeign简介
Openfeign的全称是Spring Cloud Openfeign,是Feign(进入停更维护状态)的升级,是Spring 言方推出的-种声明式服务调用和负载均衡组件。
OpenFeign是一种声明式模板化的HTTP客户端, 在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样。
三、OpenFeign和Feign的关系
- Openfeign是Spring Cloud对Feign的二次封装,它具有Feign的所有功能。
- OpenFeign在Feign的基础上增加了对Spring MVC注解的支持,例如: @RequestMapping、 @GetMapping 和@PostMapping等。
四、OpenFeign 的使用
1、导入依赖
<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"})