Feign是什么?能干什么?
在前面是采用的Ribbon+TestTemplate封装http请求,形成一套模板化的调用方式,但在实际开发中,一个接口可能会被多次调用,所以针对每个微服务会自行封装一些客户端来对这些服务调用。
使用Feign,只需要创建一个接口,并使用@FeignClient注解这这个接口,在接口里面写上需要被调用的服务名称,即可以完成对生产者的接口绑定,简化了使用Ribbon+TestTemplate时的开发量。
Feign和OpenFeign的区别
创建新模块
1. pom文件
<dependencies>
<dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>org.example</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2. 配置yml文件
server:
port: 80
#这里只把feign做客户端用,不注册进eureka
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: false
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
3. 主启动类
注:
记得添加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class, args);
}
}
4. 创建service接口
注:
- 记得添加@FeignClient(“CLOUD-PAYMENT-SERVICE”),CLOUD-PAYMENT-SERVICE代表的是生产者服务名称
- 业务代码里面可以复制生产者controller内的代码,代表可以直接调用生产者controller中的接口
@Component
@FeignClient("CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
- 创建controller类
- 在controller中注入了接口,可以进行直接调用
@RestController
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
return paymentFeignService.getPaymentById(id);
}
}
测试
可以看到是默认是轮询的负载均衡策略
设置Feign客户端超时时间
yml中配置
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的实际
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
Feign日志设置
Feign提供了日志打印功能,通过yml配置文件来调整日志级别,可以通过日志了解Http请求的细节,实际上这就是对Feign接口的调用情况进行监控和输出。
- NONE:默认级别,不显示任何日志
- BASIC:仅记录请求方法、URL、相应状态码和执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和响应的征文及元数据
- 创建config类
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
- 配置yml文件
logging:
level:
#feign日志以什么级别监控那个接口
com.my.springcloud.service.PaymentFeignService: debug