前言
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。只需要创建一个接口并在接口上添加注解即可。
它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HTTPMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign 能干什么?
Feign旨在使编写Java Http客户端变得更容易
在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装,这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(以前时Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon:
利用Ribbon维护了服务列表信息,并通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且声明式的方法,优雅而简单的实现了服务调用
本章的OpenFeign是根据:
我们在Eureka注册与发现的例子上稍作修改https://blog.csdn.net/javaasd/article/details/108791307
把客户端:cloud-consumer-order80给舍弃掉。
除了这个客户端,其余的四个项目正常启动,7001,7002,8001和8002。
然后我们在创建一个客户端:cloud-consumer-feign-order80
第一步:pom.xml中引入jar包依赖
<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>
第二步:配置application.yml配置文件
server:
port: 8083
eureka:
client:
#向注册中心注册自己(eureka server)
register-with-eureka: false
service-url:
#设置与eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群
第三步:创建启动类
@SpringBootApplication
@EnableFeignClients //激活开启feign
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class,args);
}
}
第四步:创建service接口
@Component
//调用Eureka服务下的注册服务项
@FeignClient(name = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
//服务项下的controller类里面的方法接口
@GetMapping(value = "/payment/getPaymentById/{id}")
CommonResult getPaymentById(@PathVariable("id") Integer id);
}
第五步:创建controller
@RestController
public class OrderFeignController {
//调用接口
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/getPaymentById/{id}")
public CommonResult getPaymentById(@PathVariable("id") Integer id){
return paymentFeignService.getPaymentById(id);
}
}
最后启动cloud-consumer-feign-order80访问http://localhost:8083/consumer/payment/getPaymentById/9
超时控制
在8001服务端的controller层的一个类中,模拟一个复杂的逻辑处理,它需要三秒的时间
//模拟这是一个复杂的业务逻辑,程序需要执行三秒钟
@GetMapping("/payment/feign/timeout")
public String paymentFeignTimeout(){
try {
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
return serverPort;
}
然后在80客户端的service层添加一下代码
@GetMapping("/payment/feign/timeout")
String paymentFeignTimeout();
controller层
@GetMapping("/consumer/payment/feign/timeout")
public String paymentFeignTimeout(){
//OpenFeign-ribbon默认等待1秒,这个时候这个程序需要等待三秒,
// 三秒过后会报连接超时的错误
return paymentFeignService.paymentFeignTimeout();
}
然后启动80客户端。我们直接访问服务端接口http://localhost:8001/payment/feign/timeout 等待三秒是可以正常的访问的到的。但通过用户端80去访问服务端的8001里面的接口会报错(报错内容如下)
这个错误就是连接超时。因为这个代码的执行时间是三秒,而用户端80,它只等待一秒,一秒钟后没有等到结果,就会直接报连接超时。
这个时候我们需要修改一下用户端80,的application.yml加上超时配置即可
server:
port: 8083
eureka:
client:
#向注册中心注册自己(eureka server)
register-with-eureka: false
service-url:
#设置与eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群
#设置OpenFeign客户端连接超时时间
ribbon:
#建立连接所用的时间,适用于网络状态正常的情况下,二端连接所用时间
ReadTimeout: 5000
#建立连接后从服务器读取到可用资源所用的时间
connectTimeout: 5000
重启项目即可正常访问
OpenFeign日志打印功能
Feign 提供了日志打印功能,我们可以通过配置来调整日期级别,从而了解Feign种的Http请求的细节。所白了就是对Feign接口的调用情况进行监控和输出。
日志级别:
1.NONE:默认的,不显示任何日志
2.BASIC:仅记录请求方法、url、响应状态及执行时间
3.HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息。
4.FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据
用法(80用户端)
第一步需要写一个日志工具类
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
第二步修改application.yml文件
server:
port: 8083
eureka:
client:
#向注册中心注册自己(eureka server)
register-with-eureka: false
service-url:
#设置与eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群
#设置OpenFeign客户端连接超时时间
ribbon:
#建立连接所用的时间,适用于网络状态正常的情况下,二端连接所用时间
ReadTimeout: 5000
#建立连接后从服务器读取到可用资源所用的时间
connectTimeout: 5000
logging:
level:
#日志以哪个级别监控哪个接口
com.atguigu.springcloud.service.PaymentFeignService: debug
第三步:重启80用户端口,然后随便访问一个接口。
最后看一下控制台输出
到此OpenFeign服务调用结束!