简介
Feign 是声明性(注解)Web 服务客户端。它使编写 Web 服务客户端更加容易。要使用 Feign, 请创建一个接口并对其进行注解。Spring Cloud 集成 了 Ribbon 和 Eureka 以及 Spring Cloud LoadBalancer,以在使用 Feign 时提供负载平衡 的 http 客户端。
Feign 是一个远程调用的组件 (接口,注解) http 调用的
Feign 集成了 ribbon ribbon 里面集成了 eureka
快速入门
结构
1.创建OrderService
导入Web、DiscoveryClient、Lombok依赖
修改版本号,重命名启动类(详细见Eureka客户端创建篇)
修改yml文件
server:
port: 8080
spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
2.创建User-Server
同上
依赖:
要使用Feign进行远程调用,要先在启动类上加注解@EnableFeignClients
之后需要创建一个接口,并对其进行注解@FeignClient(value = “order-service”),接着将需要调用的服务方法签名粘贴到接口中
/*
* @FeignClient(value = "order-service")
* value是提供者的应用名称
* */
@FeignClient(value = "order-service")
public interface UserOrderFeign {
@GetMapping("doOrder")
String doOrder();
}
在user-service的controller中将接口注入,使用方法调用
测试:
总结:
浏览器(前端)——》user-service(/userDoOrder)——》rpc(feign)——》order-service(/doOrder)
OpenFeign等待时间
默认OpenFeign调用其他服务,只会等待1s,超时则会报错,若想延长时间,可以在消费者端yml中进行配置
- 因为feign只是封装了远程调用功能,底层还是ribbon,所以可以对ribbon进行配置
ribbon不会进行提示,可以双shift查找DefaultClientConfigImpl
在注释中可以找到
进行配置:
ribbon:
ReadTimeOut: 3000 # 给3s服务调用超时时间
ConnectTimeout: 3000 # 连接服务超时时间
手写OpenFeign的过程
接口是被jdk动态代理,进行Debug会发现是一个$Proxy对象
jdk动态代理,只要是代理对象调用的方法必须走 invoke
在调用方法处打断点,浏览器进行访问,按住Alt键,鼠标点击实例对象
简单说就是使用动态代理的invoke方法,拿到GetMapping注解里面的值,再拿FeignClient注解里面的值,将他们拼成ribbon所需的url模式,交给ribbon去处理