一、概述
「1. OpenFeign是什么?」
下面是关于OpenFeign的一段官方介绍:
Feign is a declarative web service client. It makes writing web service clients e asier. To use Feign create an interface and annotate it. It has pluggable annotat ion support including Feign annotations and JAX-RS annotations. Feign also suppor ts pluggable encoders and decoders. Spring Cloud adds support for Spring MVC anno tations and for using the same HttpMessageConverters used by default in Spring We b. Spring Cloud integrates Eureka, Spring Cloud CircuitBreaker, as well as Spring Cloud LoadBalancer to provide a load-balanced http client when using Feign.
这段话说的是:OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。
OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eureka(服务注册中心)和ribbon组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便。「2. OpenFeign能干啥?」
- OpenFeign的设计宗旨式简化Java Http客户端的开发。Feign在restTemplate的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了Spring cloud Ribbon的开发,自动封装服务调用客户端的开发量。
- OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口且以申明式的方法,优雅而简单的实现了服务调用。
二、OpenFeign入门使用
1. pom引入
<!--Open feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--服务发现客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--web服务--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2. yml配置
server: port: 81 #端口 spring: application: name: cloud-consumer #服务别名 eureka: client: serviceUrl: defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ #服务中心地址 instance: prefer-ip-address: true #显示ip地址
3. 主类编写
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; @EnableEurekaClient //启用服务注册客户端 @SpringBootApplication //springboot启动注解 @EnableFeignClients //启用OpenFeign public class OpenFeignMain { public static void main(String[] args) { SpringApplication.run(OpenFeignMain.class,args); } }
4. 编写接口
import com.yuyue.springcloud.common.dto.ResultDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; @Component //注册为spring组件,交予IOC容器管理 @FeignClient(value = "cloud-payment") //添加FeignClient注解,绑定服务提供者。 public interface TestService { @GetMapping("/payment/list") ResultDto list(); }
接口加注解即可绑定服务提供者。
5. controller层
import com.yuyue.online.springcloud.consumer81.service.TestService; import com.yuyue.springcloud.common.dto.ResultDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/consumer") public class TestController { @Autowired private TestService testService; @GetMapping("/list") public ResultDto list(){ return testService.list(); } }
和普通的controller层没有区别,和mapper访问数据库很类似。
6. 测试
测试结果为:轮询访问8080和8081两个服务提供者,实现了调用和负载均衡。
三、OpenFeign进阶
1. 超时控制
OpenFeign默认超时时间为1s,超过1s就会返回错误页面。如果我们的接口处理业务确实超过1s,就需要对接口进行超时配置,如下:
ribbon: #设置feign客户端连接所用的超时时间,适用于网络状况正常情况下,两端连接所用时间 ReadTimeout: 1000 #指的是建立连接所用时间 ConnectTimeout: 1000 #指建立连接后从服务读取到可用资源所用时间
2. 日志增强
「1. yml配置」
logging: level: com.yuyue.online.springcloud.consumer81.service.TestService: debug #指定openfeign日志以什么级别监控哪个接口(可多个)
「2. 配置日志bean」
- NONE:默认,不显示任何日志;
- BASIC: 仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS:除了BASIC中定义的信息之外,还有请求头和响应头信息;
- FULL:除了HEADERS中定义的信息之外,还有请求的正文和响应数据。
import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenFeignConfig { @Bean Logger.Level feignLogLevel(){ return Logger.Level.FULL; } }