Feign是⼀个声明式的HTTP客户端组件,它旨在是编写Http客户端变得更加容易。OpenFeign添加
了对于Spring MVC注解的⽀持,同时集成了Spring Cloud LoadBalancer和Spring Cloud
CircuitBreaker,在使⽤Feign时,提供负载均衡和熔断降级的功能。
OpenFeign的设计宗旨式简化Java Http客户端的开发。Feign在restTemplate的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了Spring cloud Ribbon的开发,自动封装服务调用客户端的开发量。
OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口且以申明式的方法,优雅而简单的实现了服务调用。
OpenFeign入门使用1.引入依赖
org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web
2.启动类编写
使⽤@EnableFeignClients启用OpenFeign功能
@EnableEurekaClient //启用服务注册客户端
@SpringBootApplication
@EnableFeignClients //启用OpenFeign
public class OpenFeignApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignMain.class,args);
}
}
3.application.yml配置
server:
port: 90001
spring:
application:
name: cloud-order
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9000/eureka/ #服务中心地址
instance:
prefer-ip-address: true #显示ip地址
4.编写接口类
@FeignClient(value = "payment")
public interface PaymentClient {
@GetMapping("/payment/{id}")
public Payment payment(@PathVariable("id") Integer id);
}
注解@FeignClient注解中,“payment”是服务名,使⽤这个名字来从Eureka服务列表中得到相应的服务,来创建LoadBalancer客户端,也可以使⽤url属性。
注解@GetMapping中value的属性值为你需要调用服务方法的请求url。
在controller中使用FeignClient访问接口类中声明的服务,代码如下
@Autowired
private PaymentClient paymentClient;
@GetMapping("/feign/payment/{id}")
public ResponseEntity getPaymentByFeign(@PathVariable("id")Integer id) {
Payment payment = paymentClient.payment(id);
return ResponseEntity.ok(payment);
}
5.启动并测试
访问http://localhost:9001/feign/payment/123,执⾏效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-onflezlN-1648106338673)(/Users/invictus/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/917bad4b2d9ad9a6d735f2ed31cc46f9/Message/MessageTemp/7dbc453bab701981a5042f13a432528b/Image/7911648105730_.pic.jpg)]
OpenFeign进阶1.超时配置
OpenFeign提供了2个超时参数。
connectTimeout防⽌由于服务器处理时间⻓⽽阻塞调⽤者。readTimeout 从连接建⽴时开始应⽤,在返回响应时间过⻓时触发
OpenFeign默认超时时间为1s,超过1s就会返回错误页面。如果我们的接口处理业务确实超过1s,就需要对接口进行超时配置。
对于所有的FeignClient配置,可以使⽤"default"代替,代码如下。
feign:
client:
config:
default:
connectTimeout: 5000 #防⽌由于服务器处理时间⻓⽽阻塞调⽤者
readTimeout: 5000 #从连接建⽴时开始应⽤,在返回响应时间过⻓时触发
设置openFeign的超时时间为5s
如果只对于具体FeignClient配置,可以把default换成具体的FeignClient的名字,代码如下
feign:
client:
config:
feignName: //需要配置Feign的名称
connectTimeout: 5000 #防⽌由于服务器处理时间⻓⽽阻塞调⽤者
readTimeout: 5000 #从连接建⽴时开始应⽤,在返回响应时间过⻓时触发
2.openFeign⽇志
可以配置打开Feign⽇志,显示Feign调⽤的详细信息,⽐如请求和响应的headers、body和
metadata。具体步骤如下:
设置⽇志级别
Feign Logging只响应debug级别,在application.yml中配置如下。
logging:
level:
com.cxl: debug
配置FeignLoggerLevel
可以在配置类中配置Logger.Level,告诉配置类Feign需要打印的内容,具体代码如下。
@Configuration
public class FooConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
其中Logger.Level级别详情如下:
NONE,⽆⽇志记录(默认)。BASIC, 只记录请求⽅法和 URL 以及响应状态码和执⾏时间。HEADERS, 记录基本信息以及请求和响应标头。FULL, 记录请求和响应的标头、正⽂和元数据



