简介
OpenFeign
OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件。OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。
Feign
Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。只需要创建一个接口并在接口上添加注解即可实现对HTTP接口的绑定。FEIGN集成了Ribbon,并且通过轮询的方式实现了客户端负载均衡。
OpenFeign的使用
搭建Spring Cloud项目
搭建消费者模块,命名为cloud-consumer80-openfeign
①导入依赖
<dependencies> <!--openfeign依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--consul 依赖:因为注册中心使用的是Consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--spring boot依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
②创建application.yml配置文件
server: port: 80 spring: application: name: cloud-consumer-openfeign cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name}
③创建启动类,添加@EnableFeignClients注解,激活OpenFeign组件
@EnableFeignClients @SpringBootApplication public class ConsumerConsule80OpenFeign { public static void main(String[] args) { SpringApplication.run(ConsumerConsule80OpenFeign.class, args); } }
④创建IService接口,添加@FeignClient注解,指定服务提供者
@Component @FeignClient(value = "cloud-provider") public interface IConsumerService { //服务提供者访问路径 @GetMapping("/provider/getUUID") public String getUUID(); }
⑤创建Controller,实现服务远程调用
@RestController @RequestMapping("consumer") public class ConsumerController { @Autowired private IConsumerService consumerService; @GetMapping("getUUID") public String getUUID() { return consumerService.getUUID(); } }
测试
①启动Consul注册中心(启动命令consul aget -dev)
②启动服务提供者cloud-provider8001
③启动服务提供者cloud-provider8002
④启动服务提供者cloud-provider8003
⑤启动服务消费者cloud-consumer80-openfeign
⑥访问http://localhost/consumer/getUUID,远程调用(多发几次请求,发现默认使用轮询方式实现负载均衡)
OpenFeign超时控制
OpenFEIGN客户端默认只等待1秒钟,服务端业务处理超过1秒钟,FEIGN直接返回报错信息,因此需要OpenFEIGN超时控制。
超时案例
①修改服务提供者业务
@RestController @RequestMapping("provider") public class ProviderController { @Value("${server.port}") private String port; @GetMapping("getUUID") public String getUUID() { //使业务沉睡三秒 //业务处理时间超过1秒 try { TimeUnit.SECONDS.sleep(3); } catch (Exception e) { } return port + " : " + UUID.randomUUID(); } }
②远程调用业务
③查看原因
配置超时时间
①编辑消费方application.yml配置文件
feign: client: config: default: readTimeout: 5000 connectTimeout: 5000
②测试
OpenFeign日志
OpenFeign日志是用来对OpenFeign接口的调用情况进行监控和输出的。在消费方使用。
OpenFeign日志级别
- NONE:默认的,不展示日志;
- BASIC:仅展示请求方式,URL,响应状态码以及执行时间;
- HEADERS:仅展示请求方式,URL,响应状态码,执行时间,请求头以及响应头信息;
- FULL:展示请求方式,URL,响应状态码,执行时间,请求头信息,响应头信息,请求和响应正文以及数据源。
OpenFeign日志配置
①创建OpenFeignLog类,用于设置日志级别
@Configuration public class OpenFeignLog { @Bean public Logger.Level getOpenFeignLogLevel() { return Logger.Level.BASIC; } }
②编辑application.yml配置文件,添加以下内容
logging: level: #添加@FeignClient注解的类全路径名 com.agi.springcloud.service.IConsumerService: debug
③查看日志