1、介绍
项目github地址:https://github.com/OpenFeign/feign
。
Feign是Netflix公司开源的轻量级REST客户端框架,使用Feign能够非常方便的实现Http 客户端,可以把REST的请求进行隐藏,像调用本地方法一样进行远程服务接口调用,不用自己再编码url、参数信息等。
2、使用
演示操作在Hystix基础上进行,Hystix教程可参考:http://t.csdn.cn/Tn5cP
。
详细演示代码:https://gitee.com/micro_service_xk/netflix-cloud-demo.git user-service-feign模块
①引入feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
②开启feign
@EnableDiscoveryClient //开启Eureka客户端
@EnableCircuitBreaker //开启hystrix
@EnableFeignClients // 开启Feign功能
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
演示feign远程调用
编写Feign客户端接口
/**
* FeignClient 指定远程调用的服务名
*/
@FeignClient(value = "order-service")
public interface OrderFeignClient {
@GetMapping("/order/{orderId}")
Order queryById(@PathVariable("orderId") Integer id);
}
使用Feign客户端接口
@Autowired
private OrderFeignClient orderFeignClient;
@GetMapping("{userId}")
@ResponseBody
public User queryById(@PathVariable("userId") Integer id){
User user = new User(1,"张三","成都市");
//使用Feign客户端接口
Order order = orderFeignClient.queryById(1);
user.setOrder(order);
return user;
}
演示fiegn的熔断降级
开启Feign的Hystix
feign:
hystrix:
enabled: true # feign开启熔断降级
Feign客户端接口添加降级属性(注意:Feign客户端接口使用降级操作时,接口上不能写@RequestMapping注解,使url重复,导致降级类无法注入
)
/**
* FeignClient
* value 指定远程调用的服务名
* fallback 指定降级处理类
*/
@FeignClient(value = "order-service",fallback = OrderFeignClientFallback.class)
public interface OrderFeignClient {
@GetMapping("/order/{orderId}")
Order queryById(@PathVariable("orderId") Integer id);
}
Feign降级属性类
@Slf4j
@Component
public class OrderFeignClientFallback implements OrderFeignClient{
@Override
public Order queryById(Integer id) {
log.error("订单服务远程调用失败");
return null;
}
}
使用Feign客户端接口
@Autowired
private OrderFeignClient orderFeignClient;
@GetMapping("{userId}")
@ResponseBody
public User queryById(@PathVariable("userId") Integer id){
User user = new User(1,"张三","成都市");
//使用Feign客户端接口
Order order = orderFeignClient.queryById(1);
user.setOrder(order);
return user;
}