服务调用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作为消费者远 ...
随机推荐
- 【DL论文精读笔记】VGGNet
VGGNet(Very Deep Convolutional Networks) 1.introduction ● 采用3x3的小卷积核应用在比较深的网络里 ● 结果不错,赢得了2014 Imagen ...
- Training: WWW-Robots
原题链接:http://www.wechall.net/challenge/training/www/robots/index.php 打开网页他给我们说什么 说什么这是一个小挑战,你将会了解到机器人 ...
- C温故补缺(十六):未定义行为
未定义行为 在计算机程序设计中,未定义行为是指执行某种计算机代码 所产生的结果,这种代码在当前程序状态下的行为在其所使用的语言标准中没有规定. 以C语言为例,未定义行为指C语言标准未作规定的行为,同时 ...
- 安装BurpSuite (专业版)
BurpSuite简介: Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTT ...
- pagehelper踩坑记之分页乱套
我们在使用数据库进行查询时,很多时候会用到分页展示功能,因此除了像mybatis这样的完善的orm框架之外,还有pagehelper这样的插件帮助减轻我们的工作. pagehelper的实现方式是,不 ...
- from 表单非空验证以及多表单提交
开发中我们常用到$('#formid').serialize()方法进行表单序列化提交,但也相应催生了表单的非空严重以及多表单提交. form html: <form id="form ...
- 重新认识下JVM级别的本地缓存框架Guava Cache(3)——探寻实现细节与核心机制
大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 通过<重新认识下JVM级别的本地 ...
- Kubernetes专栏 | 安装部署(一)
--随着云原生概念的普及,许多企业的业务纷纷上云,为了追求可靠性,稳定性,和弹性伸缩,提升资源利用率等需求.Kubernetes这个谷歌开源的容器编排平台已日益流行,被大家熟知和使用. 通常来说,Ku ...
- Apache手动安装教程及报错解决梳理
操作参考教程:https://www.cnblogs.com/haw2106/p/9839655.html 下载地址(例):wget https://dlcdn.apache.org/httpd/ht ...
- 漫谈计算机网络:番外篇 ------网络安全相关知识——>公钥与私钥、防火墙与入侵检测
<漫谈计算机网络>上次已经完结啦,今天出一个番外篇! 2022-12-06 今天我们来聊一聊网络安全 废话不多说直接进入正题 网络安全问题概述 计算机网络面临的安全性威胁 两大类威胁:被动 ...