0. 简介
Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端,只需 创建一个
接口
并在接口上添加注解
即可。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用
1. Feign原理
Feign=Ribbon+RestTemplate(SpringMVC提供) Feign=接口interface+Feign注解
- 启动类添加
**@EnableFeignClients**
注解,Spring会扫描所有包下标记了@FeignClient注解的接口,并生成此接口的代理对象,代理对象会通过@RestTemplate发起远程http调用 **@FeignClient(value = "要请求的服务端服务名,可查看Eureka也可以在yml中配置好")**
即指定了cms的服务名称,Feign会从注册中心Eureka获取cms服务列表,并通过负载均衡算法进行服务调用。- 在接口方法 中使用注解
**@GetMapping("/cms/page/get/{id}")**
或者**@PostMapping("/cms/page/get/{id}")**
等———什么请求方式写什么@xxxMapping,指定调用的url,Feign将根据url进行远程调用。2. Feign和OpenFeign的区别
2. 依赖
<!-- 消费端引入 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign‐okhttp</artifactId>
</dependency>
3. 使用步骤
3.1 YAML
server:
port: 80
eureka:
client:
register-with-eureka: false
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
3.2 启动类———@EnableFeignClients
主启动类添加@EnableFeignClients注解
3.3 业务接口———@FeignClient
@FeignClient(value = XcServiceList.XC_SERVICE_MANAGE_CMS)
public interface CmsPageClient {
@GetMapping("/cms/page/get/{id}")
public CmsPage findById(@PathVariable("id") String id);
}
3.4 使用接口
@RunWith(SpringRunner.class)
@SpringBootTest
public class FeignTest {
@Autowired
CmsPageClient cmsPageClient;
@Test
public void testFeign() {
//通过服务id调用cms的查询页面接口
CmsPage cmsPage = cmsPageClient.findById("5a754adf6abb500ad05688d9");
System.out.println(cmsPage);
}
}
3.5 Feign自带负载均衡配置项
由于openFeign的依赖中自带引入了Ribbon,因此具备负载均衡
3.6 总结
4. 使用OpenFeign注意点
SpringCloud对OpenFeign进行了增强兼容了SpringMVC的注解 ,在使用SpringMVC的注解时需要注意:
- feignClient接口有参数在参数必须加@PathVariable(“XXX”)和@RequestParam(“XXX”)
- feignClient返回值为复杂对象时其类型必须有无参构造函数。
5. OpenFeign超时控制
5.1 原因
服务提供方的业务时长太久时会有超时报错,OpenFeign默认等待1s
5.2 解决方案
OpenFeign默认支持Ribbon,因此在配置文件中配置Ribbon的超时时间即可
# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
ReadTimeout: 5000
# 指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
6. OpenFeign日志打印功能
6.1 简述
6.2 日志级别
6.3 配置类
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
// 请求和响应的头信息,请求和响应的正文及元数据
return Logger.Level.FULL;
}
}
6.4 配置文件
# 设置logger的日志级别
logging:
level:
# feign日志以什么级别监控哪个接口
com.atguigu.springcloud.service.PaymentFeignService: debug