Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofit、 JAXRS-2.0、WebSocket 等类库。通过 Feign,我们可以像调用方法一样非常简单地访问 HTTP API。
OpenFeign是spring cloud在Feigh的基础上支持了springmvc的注解,如果@RequseMappering等等。OpenFeign的@FeignClient可以解析springmvc的@REquestMappering注解下的接口,并通过动态代理的方式产生实现类实现类中作负载均衡并调用其他服务
OpenFeign内含有ribbon负载均衡
使用
添加注解
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
主启动类上添加@EnableFeignClients
添加接口加注解
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE")//server的名称 public interface PaymentService { @GetMapping( "/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); }
controller层
@RestController @Slf4j public class OrderController { @Resource private PaymentService paymentService; @GetMapping( "/consumer/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){ return paymentService.getPaymentById(id); } }
可以像调用方法一样调用服务,不用spring的层层包装
而且自带负载均衡(ribbon)
openfeign超时控制
默认等待一秒超过一秒则报错
超时演示
服务模块添加超时服务
@GetMapping("/payment/feign/timeout") public String paymentFeignTimeout(){ try{ TimeUnit.SECONDS.sleep(3); }catch (InterruptedException e){ e.printStackTrace(); } return serverPort; }
消费模块接口添加方法
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface PaymentService { @GetMapping( "/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); @GetMapping("/payment/feign/timeout") public String paymentFeignTimeout(); }
controller层添加方法
@GetMapping("/consumer/payment/feign/timeout") public String paymentFeignTimeout(){ return paymentService.paymentFeignTimeout(); }
自测服务端口方法是否可以调用
消费模块调用测试
修改默认超等待
修改application.yml文件
ribbon: ReadTimeout: 5000 #建立链接的所用时间5秒 ConnectTimeout: 5000 #建立连接后从服务器读取可用资源的时间5秒
日志打印增强
日志级别:
NONE 默认的不显示任何日志
BASIC 仅记录请求方法,rul,响应状态码及执行时间
HEADERS 除了BASIC中定义的信息之外还有请求和响应的头信息
FULL 除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据
使用
配置类下添加bean
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
修改yml
logging: level: #添加地址 com.demo.springcloud.service.PaymentService: debug