SpringCloud(7)OpenFeign服务调用

0.Feign的介绍

开发微服务,免不了需要服务间调用。Spring Cloud框架提供了RestTemplate和FeignClient两个方式完成服务间调用,之前一直是使用restTemplate+Ribbon负载均衡进行服务调用。使用Feign之后,可以简化web服务的调用,可以在接口上加入注解,即可使用服务

什么是OpenFeign?

OpenFeign就是SpringCloud对Feign的基础上添加了对Spring MVC的注解支持

1.依赖导入

		<!--OpenFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.4.RELEASE</version></dependency>

2.OpenFeign的使用

①首先需要在主启动类上加入@EnableFeignClients注解开启feign客户端

@SpringBootApplication
@EnableFeignClients
public class CloudConsumerFeignOrder9011Application {public static void main(String[] args) {SpringApplication.run(CloudConsumerFeignOrder9011Application.class, args);}
}

②新建一个接口,里面包含需要调用的方法,并需要加入@FeignClient注解并配合上SpringMVC的注解使用

下面是提供者的接口:

@GetMapping("/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable Long id){Payment payment = paymentService.getPaymentById(id);log.info("---------查询到结果:{}-----------,serverPort:{}",payment,serverPort);if (payment!=null){return new CommonResult<>(200,"success,serverPort:"+serverPort,payment);}else {return new CommonResult<>(400,"failed,serverPort:"+serverPort);}}

下面是我们消费者新创建的接口

@FeignClient注解需要指定要远程调用的服务ID,然后在需要的方法上面需要加入跟提供者的接口一样的地址,这个地方的@PathVariable注解必须写明id,不能省略

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface FeignService {@GetMapping("/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id);
}

③写一个控制器进行测试

@RestController
@Slf4j
@RequestMapping("/consumer/payment")
public class OrderController {/** 注入feign接口 */@AutowiredFeignService feignService;@GetMapping("/get/{id}")public CommonResult<Payment> getPayment(@PathVariable Long id){return feignService.getPayment(id);}
}

开启项目后,进行测试
第一次:
在这里插入图片描述
第二次:
在这里插入图片描述
可以看到,虽然没有注明@LoadBalanced,但是feign默认自带的有负载均衡

3.OpenFeign的超时控制

什么是超时控制?

OpenFeign默认会等待获取服务1秒钟,如果超过这个时间,则会直接报错,这个时间可以在配合文件中设置。

进行测试

①在提供者服务添加一个会超时的方法

这里会休眠3秒

/** 测试超时控制 */@GetMapping("/feign/timeout")public String feignTimeout(){try {Thread.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}return serverPort;}

②编写feign的接口,并创建一个控制器方法进行测试

feign的接口类:

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface FeignService {@GetMapping("/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id);@GetMapping("/payment/feign/timeout")public String feignTimeout();
}

控制器方法:

@GetMapping("/timeout")public String feignTimeout(){return feignService.feignTimeout();}

③开启项目测试

可以看到,超时直接报错
在这里插入图片描述
④修改默认的超时控制时间

在消费者的yml配置文件中添加超时时间配置

#设置feign客户端的超时时间,OpenFeign默认支持ribbon
ribbon:#指的是建立连接后,获取到对应的服务,超时条件的时间ReadTimeout: 5000#指两端建立连接,超时条件的时间ConnectTimeout: 5000

修改完成后,重新启动,再次进行测试,查看是否继续报错。

等了3秒钟后,返回了结果,说明配置生效,并没有达到超时所需的时间。
在这里插入图片描述

4.OpenFeign的日志打印功能

Feign提供了日志打印功能,可以通过配置来调整日志级别,从而了解Feign中HTTP请求的细节,说白了就是对Feign接口的调用情况进行监控和输出

以下是4种级别

  • NONE 默认的,不显示任何日志
  • BASIC 仅记录请求方法、URL、响应状态码和执行时间
  • HEADERS 包括BASIC中的信息,并额外显示请求头和响应头的信息
  • FULL 包括HEADERS中的信息,并额外显示请求和响应的正文和元数据

如何配置Feign的日志级别?

①新建一个配置类,然后写一个返回level类型的方法,返回需要的日志级别,并注册到容器中。注意,这个level类是feign包下的logger下的level

@Configuration
public class FeignConfig {@Beanpublic Logger.Level feignLevel(){return Logger.Level.BASIC;}
}

②在项目的yml配置文件中,开启日志

logging:level:#设置feign日志以什么级别监视什么服务,这个服务是feign接口的全路径名com.hht.cloud.service.FeignService: debug

③重新启动项目,进行测试

随便调用一个接口后,控制台打印出了相关日志
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部