【SpringCloud学习笔记】Feign
Feign 的使用
- 什么是Feign
Feign是声明性的web服务客户端。它使编写web服务客户端更加容易,它封装类Ribbon和RestTemplate
- Feign vs OpenFeign
1、Feign是Netflix公司写的,是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端,是SpringCloud中的第一代负载均衡客户端
2、OpenFeign是SpringCloud自己研发的,在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。是SpringCloud中的第二代负载均衡客户端
3、Feign本身不支持Spring MVC的注解,使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务
4、OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
- 如何在项目中使用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
搭建产品服务者,消费者
- yaml配置文件
server:
port: 1001
spring:
application:
name: product-service
datasource: # 数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: root
eureka:
instance:
hostname: 127.0.0.1
client:
register-with-eureka: true #默认值是true,是否将自己注册到注册中心
fetch-registry: false # 默认值是true,是否从注册中心拉取服务
service-url: #注册中信对外暴露的注册中心地址
defaultZone: http://localhost:8761/eureka/
pom.xml
文件中引入OpenFeign 组件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
消费者
定义一个ProductServiceApi接口,在接口上添加@FeignClient注解,括号内是服务名
@FeignClient("product-service")
public interface ProductServiceApi {
@GetMapping(value = "/product/selectAllProductInfo")
List<ProductEntity> selectAllProductInfo();
}
- 在业务处理的service中引入ProductServiceApi
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductServiceApi productServiceApi;
@Override
public List<ProductEntity> selectAllProductInfo() {
return productServiceApi.selectAllProductInfo();
}
}
启动类
上添加@EnableFeignClients注解,在服务启动时,@FeignClints修饰的接口会被Spring扫描到,基于动态代理生成本地JDK Proxy代理对象实例,然后将这些代理实例注册到IOC容器中,当远程接口被调用时,由Proxy代理实例去完成真正的远程访问
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class ProductConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ProductConsumerApplication.class, args);
}
}
- openfeign的超时时间,默认的超时时间是1s,如果请求超过1s就会报读取超时错误
在配置文件中配置openfeign的超时时间
feign:
client:
config:
default:
# 连接超时时间
connectTimeout: 3000
# 请求处理超时时间
readTimeout: 3000