Open Feign笔记
概念
声明式的web服务客户端。使用接口加注解的形式编程。它是对RestTemplate和ribbon做了进一步封装。
Feign已经停更,OpenFeign是在Feign的基础上又做了进一步的封装。
Feign:
- Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
- Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
- Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。
OpenFeign:
- OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
- OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
OpenFeign案例演示
1. pom文件配置
引入必要的jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 启动类配置
使用@EnableFeignClients注解,使当前微服务具有openfeign的功能。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class OrderOpenFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderOpenFeignMain80.class, args);
}
}
3. 编写接口
使用@FeignClient(value = “CLOUD-PAYMENT-SERVICE”)注解指定调用的微服务名称。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import com.gzq.springcloud.hoxton.entities.CommonResult;
import com.gzq.springcloud.hoxton.entities.Payment;
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) ;
}
4. 调用OpenFeign接口
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.gzq.springcloud.hoxtom.service.PaymentFeignService;
import com.gzq.springcloud.hoxton.entities.CommonResult;
import com.gzq.springcloud.hoxton.entities.Payment;
@RestController
public class OrderFeignController {
@Resource
private PaymentFeignService feignService;
@RequestMapping(value="openfeign/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentId(@PathVariable Long id){
return feignService.getPaymentById(id);
}
}
OpenFeign连接超时设置
配置application.yml文件中ribbon的ConnectTimeout和ReadTimeout属性即可,默认情况下OpenFeign的超时时间是1秒。
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ConnectTimeout: 4000
#指的是建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 3100
OpenFeign日志
OpenFeign的日志级别有:
- NONE: 默认的,不显示任何日志
- BASIC: 仅记录请求方法、URL、响应状态码以及执行时间
- HEADERS:除了BASIC 中自定义的信息外,还有请求和响应的信息头
- FULL: 除了HEADERS中定义的信息外, 还有请求和响应的正文以及元数据。
OpenFeign日志使用案例
1. 配置application.yml文件
logging:
level:
# feign日志以什么级别监控哪个接口
com.gzq.springcloud.hoxtom.service.PaymentFeignService: debug
2. 配置对应的bean
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}