openFeign介绍
Feign是一个声明式的Web Service客户端。它的出现使开发Web Service客户端变得很简单。使用Feign只需要创建一个接口加上对应的注解,比如:FeignClient注解。Feign有可插拔的注解,包括Feign注解和JAX-RS注解。
Feign也支持编码器和解码器,Spring Cloud Open Feign对Feign进行增强支持Spring MVC注解,可以像Spring Web一样使用HttpMessageConverters等。
Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
openFeign功能
1.可插拔的注解支持,包括Feign注解和JAX-RS注解。
2.支持可插拔的HTTP编码器和解码器(Gson,Jackson,Sax,JAXB,JAX-RS,SOAP)。
3.支持Hystrix和它的Fallback。
4.支持Ribbon的负载均衡。
5.支持HTTP请求和响应的压缩。
6.灵活的配置:基于 name 粒度进行配置
7.支持多种客户端:JDK URLConnection、apache httpclient、okhttp,ribbon)
8.支持日志
9.支持错误重试
10.url支持占位符
11.可以不依赖注册中心独立运行
openFeign使用
openFeign所需的依赖,在服务调用方即消费者方主启动类上添加
@EnableFeignClients
注解使用openFeign的功能
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
这里是消费者微服务yml文件所需要添加的配置
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
logging:
level:
# feign日志以什么级别监控哪个接口
com.springcloud.service.PaymentFeignService: debug
需要声明一个微服务消费者和生产者,消费者使用openFeign远程调用生产者的方法
/**
* 声明一个远程调用方法的接口,这个方法是存在于方法消费者项目里面
*/
@Component // 必须注入到spring容器中
@FeignClient("CLOUD-PAYMENT-SERVICE")//代表用微服务名字进行调用
public interface PaymentFeignService {
/**
* 当前的这个方法的方法名, @GetMapping注解,参数,要和生产者面的方法一一对应
* 如果使用的是对象入参一定要使用@ResquestBody注解
*/
@GetMapping("/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
@GetMapping("/payment/get/")
public CommonResult<Payment> getPaymentById(@ResquestBody Payment payment);
}
这里是方法生产者项目里面的方法
@GetMapping("/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
Payment payment = paymentService.getPaymentById(id);
if(payment != null)
{
return new CommonResult(200,"查询成功,serverPort: "+serverPort,payment);
}else{
return new CommonResult(444,"没有对应记录,查询ID: "+id,null);
}
}
@GetMapping("/payment/get/")
public CommonResult<Payment> getPaymentById(@ResquestBody User user){
Payment payment = paymentService.getPayment;
return new CommonResult(200,"查询成功,serverPort: "+serverPort,payment);
};
/**
* 这个配置类添加可以打印FeignConfig调用远程方法的日志
*/
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}