两个子集pom互相调用_声明式服务调用组件Feign

什么是Feign?    Feign是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端。Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。

什么是OpenFeign?

    OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,其实就是对Feign的封装。

    tips:Feign是Netflix的第三大组件,已停更,基本也没人用了,SpringCloud对其进行了封装,也就是OpenFeign。以下所提到的Feign都是指OpenFeign。

Feign能干什么?

    Feign旨在使编写Java Http客户端变得容易。

    前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。    在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用Ribbon时,自己封装服务调用客户端的开发量。

    简单的讲Feign就是用来做服务之间调用的组件,注意是用于客户端(也就是消费方)。和上文提到的RestTemplate实现的功能是一样的。

Feign集成了Ribbon    上文利用Ribbon维护了Payment服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

一、使用OpenFeign实现服务调用

1. 为了不和Ribbon订单工程弄混,新建一个订单服务工程,工程名:cloud-consumer-fegin-order,pom文件添加feign依赖

    org.springframework.cloud    spring-cloud-starter-openfeign
2. 修改yml文件如下
server:  port: 80eureka:  client:    register-with-eureka: true    fetch-registry: true    service-url:      defaultZone: http://eureka8761.com:8761/eureka,http://eureka8762.com:8762/eureka
3. 主启动类添加注解开启Feign功能
@SpringBootApplication@EnableFeignClientspublic class OrderFeignApplication {  public static void main(String[] args) {    SpringApplication.run(OrderFeignApplication.class, args);  }}
4. 新建一个service接口
@Component@FeignClient(value = "CLOUD-PROVIDER-PAYMENT")public interface PaymentFeignService {  @GetMapping("/payment/get/{id}")  CommonResult getPaymentById(@PathVariable("id") Long id);}
5. 新建controller,内容如下
@RestControllerpublic class OrderFeignController {  @Resource  private PaymentFeignService paymentFeignService;    @GetMapping("/consumer/payment/get/{id}")  public CommonResult getPaymentById(@PathVariable("id") Long id){    return paymentFeignService.getPaymentById(id);  }}
6. 按顺序启动两个eureka及两个支付服务,最后启动本服务,在浏览器测试07263086990682742e4a3080240e32a5.gif

可以看到不仅成功调用了支付服务,且自带负载均衡的功能。

各类之间调用关系:

fb7df641251519e6412152f559f57fc9.png

二、OpenFeign超时控制

OpenFeign服务调用有个机制,当调用时间超过指定范围,会报错,默认1秒,我们模拟一个超时的场景。1. 在支付服务8001controller添加一个方法,让他休眠3秒
@GetMapping(value = "/payment/feign/timeout")public String paymentFeignTimeout(){  try { Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); }  return serverPort;}
2. 在feign接口添加新接口
@GetMapping(value = "/payment/feign/timeout")String paymentFeignTimeout();
3. OrderFeignController添加方法
@GetMapping(value = "/consumer/payment/feign/timeout")public String paymentFeignTimeout(){  // openfeign客户端,默认等待1秒  return paymentFeignService.paymentFeignTimeout();}
4. 启动两个注册中心,支付服务8001,以及feign客户端80,在浏览器访问

d1a19f55e78c686c66acc0e05c3f1edb.png

5. 报错的原因就是feign客户端80在访问支付服务8001超过1秒后,feign主动抛异常,但是这样肯定是不行的,实际工作中接口响应超过1秒太正常了,所以这时候我们需要设置超时控制。

    修改feign客户端80yml文件,添加如下配置,超时控制重点
ribbon:  ReadTimeout: 5000     #指的是建立连接所需要的时间  ConnectTimeout: 5000  #指的是建立连接后从服务器读取到可用资源所用的时间
    这时候再去访问,就可以正常返回了

1254b540d2a1015033b7748695b2f816.png

三、OpenFeign日志增强

Fegin提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Http请求的细节。说白了就是对Feign接口的调用情况进行监控和输出。1. 日志级别
  • NONE:默认的,不显示任何日志

  • BASIC:仅记录请求方法、URL、响应状态码及执行时间

  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息

  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

2. 配置Feign的日志管理

  • 添加一个FeignConfig类,内容如下,注意这里Logger导的包是feign下的,别导成Log4j的包。

import feign.Logger;@Configurationpublic class FeignConfig {  @Bean  Logger.Level feignLoggerLevel(){    return Logger.Level.FULL;  }}
  • yml文件添加如下配置

logging:  level:    # 日志以什么级别监控哪个接口    com.wangyg.springcloud.service.PaymentFeignService: debug
3. 重启Feign客户端80服务,浏览器请求8001支付服务,这时候查看80的控制台,就可以看到打印的feign接口详细调用信息。

24f3201a4fc4f84018551649c83ff693.png

到这里,OpenFeign的基本知识就学完了

接下来进入下一篇:服务熔断器Hystrix

本项目已上传到gitee和github,地址在公众号窗口 我的->git 查看相关内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓手机主题软件_安卓手机安装不了软件原因和方法

安卓手机不能安装软件其实有很多的原因,排除可以避免的原因(google授权),其他的硬件设施的支持,也可能出现软件不能安装的现象。有的是可以解决的,但有的是强制性原因,那就没有办法了。下面就来分析下软件不能安装的几…

java jbutton 不显示_java – JButton中的图像未显示

有人可以看看这段代码并告诉我我做错了什么?根本没有显示图像.它们在同一个包装中.谢谢public class MWindow31Pic extends JFrame implements ActionListener{private JPanel contPane (JPanel) this.getContentPane();private JButton button new JButton(new I…

python类的mod_apache+mod_python

一.安装apache(httpd-2.2.25.tar.gz )到 http://httpd.apache.org 下载最新的apache源码,解压后进入目录:我想把apache安装到/usr/lcoal/apache下,所以执行如下命令执行:./configure --prefix/usr/lcoal/apache --enable-track-va…

excel插入页码_Excel里毫不起眼的页眉页脚,居然有这3种高能用法!

点击上方蓝字关注星标★不迷路本文作者:小敏本文编辑:小叮一说到页眉页脚,你脑海中出现的,是不是这样一个画面?规规矩矩的页眉页脚,比如,公司 logo 或者文件名称放在页眉位置,底部加…

java nutz_jnutz: 基于nutz的java+js混合开发项目

nutz-jseversion 0.0.2jdk8 152 nutz es html如不使用let const等变量则jdk8 40即可如使用es6的部分请更换jdk9 181将 config/ioc/jjs.js 中的es6注释 添加到[]内项目使用说明将jse.properties文件放置在你的web根目录复制lib中的jar到 WEB-INFO/lib启动项目就ok了代码编写说明…

前端怎么获取cookie的值_京东购物小程序cookie方案实践(附Demo)

一、前言早期为了解决“会话保持”的需求,社区中出现了「cookie 方案」并最终成为 W3C 标准:当某个网站登录成功后,客户端(浏览器)收到一个 cookie 标识(文本)并保存下来,在后续请求中会自动带上这个字段,由此 Web 后台…

R 语言怎么保存工作目录到当前路径_【R语言基础】01.R语言软件环境搭建及常用操作...

一、R语言简介R语言是专业的统计分析软件,来自著名数据科学网站(http://www.kdnuggets.com/)发起的一个2019年统计分析和数据挖掘软件使用情况的调查结果:表明R语言是该领域近年来最受欢迎的软件之一。R语言的优势:(1)…

ssm java上传图片预览_ssm文件上传_上传图片

1、搭建好ssm框架2、导入文件上传所需依赖commons-fileuploadcommons-fileupload1.4commons-iocommons-io2.6commons-langcommons-lang2.63、springmvc的xml文件中配置文件所需的类4、jsp界面对应其次第二个文件上传对应的就是第二个div里面的内容4、form表单配置注意&#xff…

平台允许同时在线人数 显示_12万人同时在线,游戏未正式发售,国产“糖豆人”已诞生?...

《派对动物》目前在Steam平台上开启了试玩阶段,游戏离正式发行还有一段时间。这款游戏适合多人作战,正如它的名字一样《派对动物》。不过从游戏角色的形象设定上来看,有一些像学龄前儿童喜爱的动画片,因此并没有人给这部游戏太多的…

feign post 传递空值_听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺

文章来源:听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺原文作者:陈哈哈来源平台:CSDN我有一个老朋友,我们叫他熊猫。发际线及将触碰到后脑勺,大框金丝眼镜也掩盖不住那黝黑的眼圈,显得格外的…

java必知必会_Java构造器必知必会

在面向对象编程中,编程人员应该在意“资源”。比如String hello "hello";在代码中,我们很在意在内存中String类型的hello,它是有一个生命周期的。在它生命周期中,初始化(initialization)和清理(cleanup)是两…

post 请求 argument type mismatch_Flask-RESTful 请求解析

一、基本参数from flask.ext.restful import reqparseparser reqparse.RequestParser()parser.add_argument(rate, typeint, helpRate cannot be converted)parser.add_argument(name, typestr)args parser.parse_args()二、必需的参数parser.add_argument(name, typestr, re…

易语言单窗口单ip软件源码_梦幻西游怎样多开ip转金?十大攻略秘籍速来看

各位好!,我依然是小芝麻,近期几日总是有盆友在私聊我,“小芝麻看着你的转金专缉,那么多方式,能够 帮我建议一类,最安全可靠能用的吗?”“小芝麻,你的转金攻略大全&#x…

java高并发抢单编程模型_Java高并发模型

package MainFixedFuc;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class SingleTest {public static void main(String[] args) {// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待…

maven不配置环境变量可以使用吗_哪些土地可以不缴纳土地使用税?包括农村地吗?...

根据法律规定,县城以上城市进行土地开发时,需要征收土地使用税,对于公园、名胜、寺庙及文教、卫生、社会福利等单位使用的土地,城镇、街道、公共设施用地、铁路、机场、港区、车站、管理交通运输用地及水利工程,农、林…

小米答题题库_拼多多果园答题题库74(每日更新)

135编辑器拼多多答题题库七十四每周我们都会做一个总和的题库;希望大家持续关注!您的关注就是我们的动力!“成语之乡”指的是我国哪座城市?1.河北邯郸 2.安徽蚌埠答:河北邯郸邯郸位于河北省南部,是战国时期…

java 接口 print_Java-接口练习

编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法voidprintCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然后写一个类Print实现接口InterfaceA和InterfaceB,要求printCapi…

filestorage 修改吧部分数据_数据库系统概论课后答案||第五版

关注公众号,更多资源分享回复关键词:数据库系统概论即可获取相应资源其他章节关注公众号获取第 1 章 绪论1 . 试述数据、 数据库、 数据库系统、 数据库管理系统的概念。答:( l ) 数据( Data ) : 描述事物的符号记录称…

python zipfile 乱码_python zipfile文件名乱码问题

zipfile文件名乱码问题接到一个解压zip文件的任务。在几百G的文件里面找到zip文件,并解压到当前目录。这个任务看似很简单,但是全都是坑的。被坑的第一点,文件名乱码。搜索博客里面的教程,一般有两种方法。1、修改源码&#xff0c…

php时间戳本周,php获取今天,昨天,本周,上周,本月,上月的起止时间戳

如何使用php获取今天,昨天,本周,上周,本月,上月的起止时间戳,我们来看看下面的函数。date_default_timezone_set("Asia/Shanghai"); //设置为上海时间 否则开始时间会相差8个小时//获取今日开始时…