- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
Netflix Feign 是 Netflix 公司发布的一种实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Ribbon 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Feign。
Feign 对 Ribbon 进行了集成,利用 Ribbon 维护了一份可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。
Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。
通过 Feign,我们可以像调用本地方法一样来调用远程服务,而完全感觉不到这是在进行远程调用。
Feign 支持多种注解,例如 Feign 自带的注解以及 JAX-RS 注解等,但遗憾的是 Feign 本身并不支持 Spring MVC 注解,这无疑会给广大 Spring 用户带来不便。
2019 年 Netflix 公司宣布 Feign 组件正式进入停更维护状态,于是 Spring 官方便推出了一个名为 OpenFeign 的组件作为 Feign 的替代方案。
OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。
OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。
使用 OpenFegin 进行远程服务调用时,常用注解如下表。
相同点
Feign 和 OpenFegin 具有以下相同点:
不同点
Feign 和 OpenFeign 具有以下不同:
在consumer的pom.xml添加
<!-- openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
去掉之前添加的熔断和重试依赖,因为OpenFeign本身以及集成了
在启动类ConsumerApplication添加@EnableFeignClients
依赖 ,去掉之前添加的熔断器注解@EnableCircuitBreaker
,然后restTemplate也不需要使用了,现在启动类的代码如下:
添加application.yml配置
feign:
client:
config:
default:
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 #连接到返回响应时间
创建Feign接口
Feign里是支持mvc的所有注解的,所以在Feign接口和生产者的Controller保持一致就行
@FeignClient(name = "producer") // 生产者的服务名称
@RequestMapping("/user")
public interface ProducerFeign {
@GetMapping("/all")
List<UserEneity> getAll();
}
producer生产者的接口
有人会疑问生产者的接口返回类型和feign的接口怎么不一致呢,ResponseEntity这个是spring中提供的统一接口返回类,最后会将结果解析为List<UserEneity>
进行返回给前端的,所以我们在feign中接口的返回类型实际上是List<UserEneity>
为啥要设置feign日志? ,我觉得这是必须的,因为在很多时候联调是一件很费劲的事情,如果出现问题很难找到问题的源头,那么就很有必要去设置feign日志,这样就能减少查找问题的时间了
为每个创建的 Feign 客户端创建一个记录器。默认情况下,记录器的名称是用于创建 Feign 客户端的接口的完整类名。Feign logging 只响应DEBUG级别。
创建feign的配置类
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
添加application.yml配置
logging:
level:
# Fegin 日志以社么级别监听哪个接口 (是我们自己的feign接口)
com.consumer.client.ProducerFeign: debug
效果如下:
OpenFeign 中已经集成了相关的注解和配置,默认已经开启了轮询策略,我们只需要配置Ribbon的配置参数就行了,在之前common模块里application-common.yml
我们已经配置了
OpenFeign 中已经集成了熔断器相关的依赖,而且Feign对熔断器也有了不一样的用法,当然之前的使用方式还是好使的,下面就演示Feign的熔断器用法
修改consumer的application.yml配置
feign:
hystrix:
enabled: true # 开启熔断
然后熔断的配置和之前在common子模块application-common.yml中配置好了
想要在Feign中使用熔断器大概需要4步骤:
实现Feign接口,给每一个方法添加一个熔断处理
@FeignClient(name='服务名',fallback =熔断接口实现类))
@RequestMapping
了@Autowired
换成@Resource
主要是防止爆红@FeignClient(name = "producer",fallback = ProducerFeignImplHystrix.class)
public interface ProducerFeign {
@GetMapping("/user/all")
List<UserEneity> getAll();
}
//方法失败熔断器回调实现类
@Component
public class ProducerFeignImpl implements ProducerFeign {
@Override
public List<UserEneity> getAll() {
sendEmail();
//返回一个空的数组,防止调用方报错,不至于影响到其他功能的使用
return new ArrayList<UserEneity>();
}
public void sendEmail(){
System.out.println("发送邮件通知管理员,进行处理");
}
}
测试熔断还是和以前一样将timeoutInMilliseconds
改为1000毫秒 然后停止生产者2台之后立即使用消费者去访问,基本上试几次就出效果了
Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求的压缩功能简单来说就是发送的内容大小变小了,那么也就变相的加快了请求的速度 建议配置
修改consumer的application.yml配置
feign:
compression:
request:
enabled: true # 开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
min-request-size: 2048 # 设置触发压缩的大小下限
请求日志会显示gzip
如果前端访问时候出现 Access-Control-Allow-Origin
这种错误就表示需要开启feign的跨域在ConsumerApplication启动类里添加下面代码就行了
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 允许cookies跨域
config.addAllowedOrigin("*");// 允许向该服务器提交请求的URI,*表示全部允许。
config.addAllowedHeader("*");// 允许访问的头信息,*表示全部
config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许,也可以单独设置GET、PUT等
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖
Hive —— 入门 Hive介绍 Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一
HBase —— 入门 HBase介绍 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”
零:前端目前形势 前端的发展史 HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面 -> 给后端(PHP、Python、Go、Java) ->
在本教程中,您将了解在计算机上运行 JavaScript 的不同方法。 JavaScript 是一种流行的编程语言,具有广泛的应用程序。 JavaScript 以前主要用于使网页具有交
我曾经是一个对编程一窍不通的小白,但因为对互联网世界的好奇心和求知欲的驱使,我踏入了编程的殿堂。在学习的过程中,我发现了一门神奇的编程语言——Python。Python有着简洁、易读的语法,让初学者能
嗨,亲爱的读者们! 今天我要给大家分享一些关于Python爬虫的小案例。你是否曾为了获取特定网页上的数据而烦恼过?或者是否好奇如何从网页中提取信息以供自己使用?那么,这篇文章将会给你一些启示和灵感。
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想创建一个像https://apprtc.appspot.com/?r=04188292这样的应用程序。我对 webrtc 了解一点,但无法掌握 google app-engine。如何为 java
我刚刚开始使用 Python 并编写了一个简单的周边程序。但是,每当我在终端中键入 python perimeter.py 时,都会收到以下错误,我不知道如何解决。 >>> python perime
Redis有5个基本数据结构,string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了
创建发布web项目 具体步骤: 1.在开发工具中创建一个dynamic web project helloword 2.在webContent中创建index.html文件 3.发布web应用到
如果你在 Ubuntu 上使用终端的时间很长,你可能会希望调整终端的字体和大小以获取一种良好的体验。 更改字体是一种最简单但最直观的 Linux 的终端自定义 的方法。让我
1. 前言 ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。现在 SFS3 系统 (校园自由软件交流网学务系统) 计划的
我对 neo4j 完全陌生,我很抱歉提出这样一个基本问题。我已经安装了neo4j,我正在使用shell“localhost:7474/webadmin/#/console/” 我正在寻找一个很好的例子
我正在阅读 ios 4 的核心音频,目的是构建一个小测试应用程序。 在这一点上,我对所有 api 的研究感到非常困惑。理想情况下,我想知道如何从两个 mp3 中提取一些样本到数组中。 然后在回调循环中
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是无关紧要的,因
我下载了 GNUStep并安装了它,但是我不确定在哪里可以找到 IDE。有谁知道什么程序可以用作 GNUStep IDE/从哪里获取它们?否则,有没有人知道有关如何创建和编译基本 GNUStep 程序
我正在尝试开始使用 Apache Solr,但有些事情我不清楚。通读tutorial ,我已经设置了一个正在运行的 Solr 实例。我感到困惑的是 Solr 的所有配置(架构等)都是 XML 格式的。
请问有没有关于如何开始使用 BruTile 的文档? 我目前正在使用 SharpMap,我需要预缓存切片以加快进程 最佳答案 我今天正在研究这个:)Mapsui项目site严重依赖 SharpMap
尽我所能,我无法让 CEDET 做任何事情。 Emacs 24.3。我下载了最新的 CEDET 快照。我从他的底部(不是这样)Gentle Introduction 中获取了 Alex Ott 的设置
我是一名优秀的程序员,十分优秀!