1.什么是OpenFeign?
Feign是声明性的Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,创建一个接口并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,并支持使用HttpMessageConvertersSpring Web中默认使用的注释。Spring Cloud集成了Ribbon和Eureka以及Spring Cloud LoadBalancer,以在使用Feign时提供负载平衡的http客户端。
1.1.OpenFeign能干什么?
Feign是为了是编写Java Http变得更加容易,前面在使用Ribbon+RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模块化的调用方法。实际开发中,由于对服务依赖的调用不止一处,往往一处接口被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖接口的定义。我们只需要创建一个接口,并使用注解的方式来配置它,即可完成对服务提供方的接口绑定。
1.2.Feign 和 OpenFeign的区别?
2.OpenFeign的使用
2.1 服务消费者:
① :在父工程下,新建Module : cloud-consumer-feign-order80
② :引入相关依赖:
<dependencies>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--引入自己定义的api通用包,可以使用Payment支付Entity-->
<dependency>
<groupId>com.mk</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</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>
③:application.yml
server:
port: 80
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 #集群
④:主启动类
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class,args);
}
}
⑤:业务接口
@Component
@FeignClient(value = "cloud-provider-service")
public interface PaymentFeignService {
@GetMapping("/payment/get/{id}")
CommonResult selectTable(@PathVariable("id") Long id);
}
FeignClient里的value为服务提供者的服务名称,即下图所示
⑥:控制器
@RestController
public class PaymentFeignController {
@Autowired
private PaymentFeignService paymentFeignService;
@GetMapping("/consumer/payment/get/{id}")
public CommonResult selectTable(@PathVariable("id") Long id){
return paymentFeignService.selectTable(id);
}
}
启动测试:
依次启动cloud-eureka-server7001,cloud-eureka-server7002,cloud-provider-payment8001,cloud-provider-payment8002,cloud-consumer-feign-order80,访问测试
3.OpenFeign 日志打印
①:日志配置类
@Configuration
public class OpenFeignLogConfig {
@Bean
Logger.Level openFeignLoggerLeave(){
return Logger.Level.FULL;
}
}
NONE: 默认的,不显示任何日志
BASIC: 仅记录请求方法、URL、响应状态码以及执行时间
HEADERS:除了BASIC 中自定义的信息外,还有请求和响应的信息头
FULL: 除了HEADERS中定义的信息外, 还有请求和响应的正文以及元数据
②:yml增加配置
server:
port: 80
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 #集群
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的实际
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
logging:
level:
# feign日志以什么级别监控哪个接口
com.mk.service.PaymentFeignService: debug
效果如下: