1、介绍

①什么是OpenFeign

OpenFeign是在Feign的基础上进行了加强

使用在Client-Consuemr(消费者客户端)

Fiegn是一个声明式的Web服务客户端,让编写Web服务客户端非常容易,只需要创建一个接口并且在接口上添加注解即可

OpenFeign底层使用的是Ribbon做负载均衡的

②为什么需要OpenFeign

原因:

我们之前写restTemplate很麻烦,每个Controller都需要注入RestTemplate,需要手写Provider的Url,在多次复用的时候也需要反复编写,或者需要封装

在前面我们使用Ribbon+RestTemplate时,使用RestTemplate对Http请求进行封装。形成一套模板化的调用方法。但是在实际的开发中,由于对服务依赖的调用可能不止一处。一个接口会被多次调用,所以通常对每个微服务自行封装一些客户端来包装这些依赖服务的调用。

Feign在这个基础上做了进一步的封装,通过Feign我们能够定义和实现依赖服务接口的定义。

在Feign的实现下,我们只需要创建一个接口并使用注释的方式来配置他(以前是Dao接口标注Mapper,现在是一个微服务接口上标注一个Feign注解就行了)

这样就完成了对Provider提供的接口的绑定,简化我们使用RestTemplate手写url等的麻烦。

③Feign和OpenFeign

2、搭建

1.新建子模块cloud-consumer-feign-order80

2.pom.xml:

<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>cn.zko0.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</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>

3.yml:

注意这里,rigister-with-eureka为false,不将自己注册进eureka,但是它是可以发现到eureka上的provider服务的

server:
port: 80 eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

4.启动类:

@EnableFeignClients //激活feign
@SpringBootApplication
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class, args);
}
}

5.新建Provider提供相关服务的接口

新建service包(可以体现,使用OpenFeign就像使用本地的Service一样,能够结合SpringMVC)

可以看到,在PaymentController中存在一个接口为getPaymentById。我们使用Feign来让Service调用provider的这个接口,作为service提供给该项目的controller

@Component
//Feign去
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
}

6.在controller中注入这个feign的service,远程调用provider的接口

@Slf4j
@RestController
public class OrderFeignController { @Resource
private PaymentFeignService paymentFeignService; @GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
return paymentFeignService.getPaymentById(id);
}
}

7.调用测试:成功!

3、超时控制

①超时错误现象

设置provider休眠3s:

@GetMapping("/payment/feign/timeout")
public String paymentFeignTimeOut(){
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return port;
}

在Order消费者出定义该接口:

在消费者中,openfrign-ribbon,客户端一般默认是等待1s

@Component
//Feign去
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService { @GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id); //在消费者中,openfrign-ribbon,客户端一般默认是等待1s
@GetMapping("/payment/feign/timeout")
public String paymentFeignTimeOut(); }

在消费者Controller中,使用service这个该方法:

@GetMapping("/consumer/payment/feign/timeout")
public String paymetFeignTimeout(){
//openfeign-ribbon,客户端一般默认等待1s
return paymentFeignService.paymentFeignTimeOut();
}

启动测试:

feign超过1s报错

②修改等待时间

openFeign最底层使用ribbon实现负载均衡

修改consumer的yml:

#没提示不管它,可以设置
ribbon:
#指的是建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 5000
#指的是建立连接使用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ConnectTimeout: 5000

测试:

超过3s依然能够调用:

4、日志打印功能

Feign提供日志打印功能,可以通过配置调整日志级别,从而了解Feign中Http请求的细节。

即对Feign接口的调用情况进行监控和输出

①日志级别

  • NONE :默认,不显示日志
  • BASIC :仅记录请求的方法,URL,响应状态码还有执行时间
  • HEADER :除了BASIC中定义的信息外,还有请求和响应的头信息
  • FULL :除了HEADER中定义的信息外,还有请求和响应的正文以及元数据

②日志配置

1.配置日志Bean

在springclou包下新建FeignLoggerConfig配置类

@Configuration
public class FeignLoggerConfig {
@Bean
Logger.Level feignLoggerLevel(){
//打印最详细的日志
return Logger.Level.FULL;
}
}

2.添加yml:

#开启日志的feign客户端
logging:
level:
#feign日志以什么级别监控哪个接口
cn.zko0.springcloud.service.PaymentFeignService: debug

3.测试

服务调用OpenFeign的更多相关文章

  1. 【微服务】- 服务调用 - OpenFeign

    服务调用 - OpenFeign 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 介绍 O ...

  2. 学习一下 SpringCloud (三)-- 服务调用、负载均衡 Ribbon、OpenFeign

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  3. SpringCloud Alibaba实战(8:使用OpenFeign服务调用)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一个章节,我们已经成功地将服务注册到了Nacos注册中心,实现了服务注册和服务发 ...

  4. 【Day01】Spring Cloud入门-架构演进、注册中心Nacos、负载均衡Ribbon、服务调用RestTemplate与OpenFeign

    〇.课程内容 课程规划 Day1 介绍及应用场景 Day2 组件介绍及 广度 Day3 设计思想.原理和源码 Day4 与容器化的容器(服务迁移.容器编排) 一.业务架构的演进 1.单体架构时代 缺陷 ...

  5. SpringCloud系列——Feign 服务调用

    前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...

  6. SpringCloud之声明式服务调用 Feign(三)

    一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样.我们知道,阿里巴巴的doubbo采 ...

  7. Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

    错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refre ...

  8. spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.feign 简介 在上一个用例中,我们使用ribbon+restTem ...

  9. Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现

    介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...

  10. SpringCloud Alibaba微服务实战三 - 服务调用

    导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...

随机推荐

  1. 【Java并发入门】02 Java内存模型:看Java如何解决可见性和有序性问题

    如何解决其中的可见性和有序性导致的问题,这也就引出来了今天的主角--Java 内存模型. 一.什么是 Java 内存模型? 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性.有序性最直 ...

  2. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(36)-掌握Fiddler中Fiddler Script用法,你会有多牛逼-上篇

    1.简介 Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有 ...

  3. 【机器学习】李宏毅——Recurrent Neural Network(循环神经网络)

    假设我们当前要做一个人工智能客服系统,那该系统就需要对用户输入的话语进行辨认,例如用户输入: I want to arrive Taipei on November 2nd 那么该系统就能够辨认出来T ...

  4. 新项目决定用 JDK 17了

    大家好,我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 最近在调研 JDK 1 ...

  5. python 水仙花数、菱形、99乘法表、直角三角形

    空心菱形 i = 1 while i <= 3: # 控制行数 j = 1 k = 1 while j <= 3-i: # 控制空格数量 print(" ", end= ...

  6. Jmeter——循环控制器中实现Counter计数器的次数重置

    近期在使用Jmeter编写个辅助测试的脚本,用到了多个Loop Controller和Counter. 当时想的思路就是三个可变的数量值,使用循环实现:但第三个可变值的数量次数,是基于第二次循环中得到 ...

  7. [图像处理] YUV图像处理入门5

    12 yuv420转换为rgb(opencv mat) yuv格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式,而且自己造轮子工作量太大.因此通常都会将yuv转换为rgb, ...

  8. [OpenCV实战]50 用OpenCV制作低成本立体相机

    本文主要讲述利用OpenCV制作低成本立体相机以及如何使用OpenCV创建3D视频,准确来说是模仿双目立体相机,我们通常说立体相机一般是指双目立体相机,就是带两个摄像头的那种(目就是指眼睛,双目就是两 ...

  9. Dubbo架构设计与源码解析(二) 服务注册

    作者:黄金 一.Dubbo简介 Dubbo是一款典型的高扩展.高性能.高可用的RPC微服务框架,用于解决微服务架构下的服务治理与通信问题.其核心模块包含 [RPC通信] 和 [服务治理] ,其中服务治 ...

  10. DevExpress 的LayoutControl控件导致资源无法释放的问题处理

    现象记录 前段时间同事发现我们的软件在加载指定的插件界面后,关闭后插件的界面资源不能释放, 资源管理器中不管内存,还是GDI对象等相关资源都不会下降. 问题代码 问题的代码大概如下. public v ...