服务调用OpenFeign
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的更多相关文章
- 【微服务】- 服务调用 - OpenFeign
服务调用 - OpenFeign 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 介绍 O ...
- 学习一下 SpringCloud (三)-- 服务调用、负载均衡 Ribbon、OpenFeign
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- SpringCloud Alibaba实战(8:使用OpenFeign服务调用)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一个章节,我们已经成功地将服务注册到了Nacos注册中心,实现了服务注册和服务发 ...
- 【Day01】Spring Cloud入门-架构演进、注册中心Nacos、负载均衡Ribbon、服务调用RestTemplate与OpenFeign
〇.课程内容 课程规划 Day1 介绍及应用场景 Day2 组件介绍及 广度 Day3 设计思想.原理和源码 Day4 与容器化的容器(服务迁移.容器编排) 一.业务架构的演进 1.单体架构时代 缺陷 ...
- SpringCloud系列——Feign 服务调用
前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...
- SpringCloud之声明式服务调用 Feign(三)
一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样.我们知道,阿里巴巴的doubbo采 ...
- 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 ...
- spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.feign 简介 在上一个用例中,我们使用ribbon+restTem ...
- Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现
介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...
- SpringCloud Alibaba微服务实战三 - 服务调用
导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...
随机推荐
- C#winform使用NOPI读取Excel读取图片
需求:在Winform使用NOPI做导入时候,需要导入数据的同时导入图片. 虽然代码方面不适用(我好像也没仔细看过代码),但是感谢大佬给了灵感http://www.wjhsh.net/IT-Ramon ...
- Web Api出现500 Internal Server Error 错误
在测试环境一切正常,但是部署到了生产环境发现一直报错.查询网上的方法设置了权限等等.都没有解决 原来发现是数据库连接字符串的问题.只需要把数据库连接字符串修改正确即可!
- C温故补缺(十四):内存管理
内存管理 stdlib库中有几个内存管理相关的函数 序号 函数和描述 1 void *calloc(int num, int size);在内存中动态地分配 num 个长度为size 个字节 的连续空 ...
- 总算给女盆友讲明白了,如何使用stream流的filter()操作
一.引言 在上一篇文章中<这么简单,还不会使用java8 stream流的map()方法吗?>分享了使用stream的map()方法,不知道小伙伴还有印象吗,先来回顾下要点,map()方法 ...
- 【Java EE】Day14 Servlet、HTTP、Request
一.Servlet 二.HTTP 三.Request 四.登录案例
- 【每日一题】【栈】2022年2月2日-NC40 两个链表生成相加链表
描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 答案:栈 import java.util.*; /* ...
- 如何通过C#合并Word文档?
合并Word文档可以快速地将多份编辑好的文档合在一起,避免复制粘贴时遗漏内容,以及耗费不必要的时间,同时,也方便了人们阅读或者对其进行再次修改.例如,在我们进行团队作业的时候,每个人都会有不同的分工, ...
- 像go 一样 打造.NET 单文件应用程序的编译器项目bflat 发布 7.0版本
现代.NET和C#在低级/系统程序以及与C/C++/Rust等互操作方面的能力完全令各位刮目相看了,有人用C#开发的64位操作系统: GitHub - nifanfa/MOOS: C# x64 ope ...
- flutter系列之:移动端手势的具体使用
目录 简介 赋予widget可以点击的功能 会动的组件 可删除的组件 总结 简介 之前我们介绍了GestureDetector的定义和其提供的一些基本的方法,GestureDetector的好处就是可 ...
- uniapp 微信小程序 引入 环信聊天
最近项目需要实现一个聊天的功能,群聊或者单聊,用到环信,根据官网实现一下相关的配置吧 第一:下载环信demo 地址:https://github.com/easemob/webim-uniapp-d ...