文章目录
1.OpenFeign使用步骤
1.1OpenFeign是啥玩意儿?他和Feign有啥区别?
Feign是一个声明式的Web Service客户端。它的出现使开发Web Service客户端变得很简单。使用Feign只需要创建一个接口加上对应的注解,比如:FeignClient注解。Feign有可插拔的注解,包括Feign注解和JAX-RS注解。
Feign也支持编码器和解码器,Spring Cloud Open Feign对Feign进行增强支持Spring MVC注解,可以像Spring Web一样使用HttpMessageConverters等。
Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。(官网上就是这么写的)
说白了你以前调用微服务接口必须通过restTemplate.getForObject去远程调用,但是Feign的出现你就不用非得使用restTemplate了,你可以向调用本地接口一样。OpenFegin就是在Fegin的基础上可以支持SpringMVC注解如requestMapping之类的。Fegin和OpenFegin里面都支持负载均衡
1.2导入pom文件
在pom文件当中要加上OpenFegin的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!----这块不加版本号是因为我在父pom当中已经导入了springcloud的常用依赖统一版本号所以子pom就不用导入了
1.3 yml文件
server:
port: 80
eureka:
client:
register-with-eureka: false#消费者用OpenFegin访问接口不用注册到eureka中
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka#从7001,7002集群当中选择被注册的服务提供者。
1.4主启动类
@SpringBootApplication
@EnableFeignClients//加上这个注解说明一下是用的Fegin
public class OrderFeginMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeginMain80.class,args);
}
}
1.5 service类
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")//一定要加这个注解value值为服务名称标注要找哪个服务提供者
public interface PaymentFeginService {
@GetMapping(value = "/payment/get/{id}")//注解的路径要和提供服务的controller路径一样
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);//和controller一样
}
1.6 controller类
@RestController
@Slf4j
public class PaymentFeginController {
@Autowired
private PaymentFeginService paymentFeginService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
{
return paymentFeginService.getPaymentById(id);//直接通过service类调用而不是通过restTemplate远程调用
}
}
这个虽然看起来是调你本地的应用但是他是在调用你远程提供的服务所以你要确保你远程的服务要提供相应的功能
1.7 结果展示
1.8 总结及注意事项
首先你在消费者的启动类上要加上@EnableFeginClients,然后你在消费者的service类中要加上@FeginClient(服务名称)这样的注解,然后这个接口中的方法的参数,路径要和你提供服务的方法一模一样(名称可以不一样)否则会报错。
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")//一定要加这个注解value值为服务名称标注要找哪个服务提供者
public interface PaymentFeginService {
@GetMapping(value = "/payment/find/{id}")//我把这个路径改了
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
结果:
2.OpenFeign超时控制
当消费者访问服务提供者这个过程当中出现了网络超时那么就会报超时的错误。比如说我重新写一个方法在return之前我做一些延时操作那么就会报超时的错误
比如说在服务提供者加上这个方法,暂停3s后返回serverPort
@GetMapping(value = "/testTimeOut")
public String TimeOutFeignTest(){
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return serverPort;
}
(OpenFegin配置略过)
结果是
出现了Read timed out的错误,那么我们怎么让延长这个超时时间呢?只需要更改yml文件就好了
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
ribbon:
ReadTimeout: 5000 #把他改成5s钟超时就行了
ConnectTimeout: 5000
改完之后结果是
3.OpenFeign日志打印功能
3.1什么是OpenFeign日志
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。说白了就是对Fegin接口的调用情况进行监控和输出。
3.2日志级别
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态及执行时间;
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
3.3配置日志bean
@Configuration
public class FeginConfig {
@Bean
Logger.Level feginLoggerLevel(){
return Logger.Level.FULL;
}
}
yml文件加上这一段
logging:
level:
#他是什么级别监控哪个接口
com.wjz.springcloud.service.PaymentFeginService: debug
调用这个接口你可以在后台清晰地看到HTTP调用的信息
参考:尚硅谷。