Ribbon与Feign的入门使用
1. 负载均衡Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
负载均衡策略
- 随机策略:该策略实现了从服务清单中随机选择一个服务实例的功能。
- 轮训策略:该策略实现按照线性轮询的方式依次选择实例的功能。
基于基于ribbon实现负载均衡
开启ribbon负载均衡,注解@LoadBalanced
@Configurationpublic class ConfigBean {@Bean/*** 添加了@LoadBalanced注解之后,Ribbon会给restTemplate请求添加一个拦截器,在拦截器中获取* 注册中心的所有可用服务,通过获取到的服务信息(ip,port)替换 serviceId 实现负载请求。*/@LoadBalanced //开启负载均衡,默认是轮询策略public RestTemplate getRestTemplate(){return new RestTemplate();}}//指定随机策略@Beanpublic IRule iRule() {return new RandomRule();}
发送请求,借助RestTemplate对象发送请求,请求路径不再是ip+端口号,而是在nacos注册的服务名
String serviceUrl = "ribbon-provider"; return restTemplate.getForObject("http://" + serviceUrl + "/provider/getUserById/" + id, User.class);
ribbon的问题
拼接url和参数,是一种硬编码的方式。为了解决把请求路径硬编码的问题,我们推荐使用Feign声明式调用服务
2.声明式服务调用Feign
什么是feign
- Feign是Spring Cloud提供的声明式、模板化的HTTP客户端,工作在consumer端
- feign支持springmvc注解
- feign集成了Ribbon也支持负载均衡
- (ribbon+restTemplate)+优化=feign
feign依赖:spring-cloud-starter-openfeign
feign 的入门使用
消费者通过feign接口来调用某一个服务,需要三个模块,服务消费者,服务提供者,feign接口
创建provider,即服务提供者
RestController @RequestMapping("/provider") public class ProviderController {@Autowiredprivate UserService userService;@RequestMapping("/getUserById/{id}")public User getUserById(@PathVariable Integer id){return userService.getUserById(id);} }
创建feign_interface工程,注意feign接口必须在名为feign的包下
引入openfeign依赖
feign接口,@FeignClient注解里的值为在nacos中注册的服务名,即要调用的服务;接口的方法名和所有注解要和调用的服务的方法保持一致
@FeignClient("服务名") public interface UserFeign{@RequestMapping("/getUserById/{id}")User getUserById(@PathVariable("id") Integer Id); }
创建consumer,即服务消费者
依赖引入feign_interface
controller层,注入UserFeign的代理类,直接使用UserFeign代理类调用所需的服务
@RestController @RequestMapping(value = "/consumer") public class ConsumerController {@Autowiredprivate UserFeign userFeign;@RequestMapping("getUserById/{id}")public User getUserById(@PathVariable Integer id){return userFeign.getUserById(id);} }
application启动类上,添加@EnableFeignClients注解,表示开启feign注解扫描
feign接口的三种传参方式
键值对传参或者路径?拼接传参
参数前加@RequestParam(“id”),注解的值必须写明
restful风格传参,即路径传参
参数前加@PathVariable(“id”),注解的值必须写明
pojo传参,即前端传json串之后json转换工具转换成java对象,包括实体对象、数组、集合等
参数前加@RequestBody
feign原理
- 将feign接口的代理类扫描到Spring容器中:
@EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,并把接口和代理类交给Spring的容器管理。 - 为接口的方法创建RequestTemplate,当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数)
- 发出请求:
代理类会通过RequestTemplate创建Request,然后client(URLConnetct、HttpClient、OkHttp)使用Request发送请求
feign优化
开启feign日志
feign日志默认有四种输出级别:NONE,BASIC,HEADERS,FULL
NONE:没有日志记录
BASIC:记录请求方法、URL以及响应状态代码和执行时间(一般使用这个)
HEADERS:记录基本信息以及请求和响应头信息
FULL:记录基本信息以及请求和响应头信息、请求和响应体信息
特别提醒:在为某一个FeignClient文件设置日志记录级别的时候,一定要先设置好日志级别,推荐日志级别设置为DEBUG
# feign配置feign:client:config:default: #default默认所有服务,也可以写要调用的服务名称loggerLevel: fulllogging: level:com.bjpowernode.feign: debug #配置feign所在包的日志级别
feign超时
## 方法一:设置在ribbon上
ribbon:OkToRetryOnAllOperations: false #对所有操作请求都进行重试,默认falseReadTimeout: 5000 #负载均衡超时时间,默认值5000ConnectTimeout: 3000 #ribbon请求连接的超时时间,默认值2000MaxAutoRetries: 0 #对当前实例的重试次数,默认0MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认1## 方法二:设置在feign client上
feign:client:config:default:connectTimeout: 5000 #请求连接的超时时间readTimeout: 3000 #请求处理的超时时间
http连接池
feign的Http客户端支持3中框架,HttpURLConnection,HttpClient,OkHttp
两台服务器建立HTTP连接的过程涉及到多个数据包的交换,因为Feign默认采用的是传统JDK中的java.net.HttpURLConnection,每次请求都会建立,关闭连接,Http 连接需要的 3 次握手 4 次分手开销很大,很消耗时间。
所以我们需要更换http通信框架来节约大量的时间提示吞吐量,把它换成HttpClient作为底层通信框架。HttpClient 相比传统 JDK 自带的 HttpURLConnection,它封装了访问 http 的请求头,参数,内容体,响应等等;它不仅使客户端发送 HTTP 请求变得容易,而且也方便了开发人员测试接口(基于 Http 协议的),即提高了开发的效率,也方便提高代码的健壮性;另外高并发大量的请求网络的时候,还是用“连接池”提升吞吐量。
解决办法:添加依赖
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId> </dependency>
配置文件中开启
feign:httpclient: #开启httpclientenabled: true
gzip压缩
为什么要开启gzip压缩:
我们压缩文件的目的就是为了把传输文件的体积减小,加快传输速度。我们在
http
传输中开启gZip
的目的也是如此,我们写的代码(css,js
)之类的文件会有很好的压缩效果,但是图片之类文件则不会被gzip
压缩太多,因为它们已经内置了一些压缩。feign的gzip压缩配置
### Feign 配置 feign:compression:request:# 开启请求压缩enabled: true# 配置压缩的 MIME TYPE(这项默认压缩所有它认定的文件类型,可以不写)mime-types: text/xml,application/xml,application/json# 配置压缩数据大小的下限min-request-size: 2048
Ribbon与Feign的入门使用相关推荐
- 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)
场景 SpringCloud -创建统一的依赖管理: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102530574 Sprin ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- ribbon和feign的区别
pring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign. Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器 它可以在客户端配置 rib ...
- SpringCloud系列之服务消费Ribbon和Feign区别
在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构.基于Spring Cloud的微服务架构.从概念上来讲,Dubbo和Spring Cloud并不能放在一起对比,因为Dubbo仅仅是一个 ...
- springCloud负载均衡Ribbon和Feign的区别
1.什么是负载均衡: 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据[均匀]分摊到多个操作单元上执行,负载均衡的关键在于[均匀]. 2.常见的负 ...
- spring cloud 微服务调用--ribbon和feign调用
这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...
- 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例
转载自 实践出真知之Spring Cloud之基于Eureka.Ribbon.Feign的真实案例 Eureka是Spring Cloud Eureka的简称,是Netflix提供的组件之一.通过E ...
- 【springCloud搭建】四、集成ribbon+hystrix+feign
上篇文章传送门:[springCloud搭建]三.集成springCloudGateway网关 ribbon+hystrix+feign所需的第三方包 <!--feign服务通讯组件--> ...
- Ribbon和Feign区别在哪
先说一下负载均衡:服务访问量忒大,一个服务器顶不住,服务器一崩那不凉了,怎么办--多用几个服务器,使单个服务器承受的访问量分散开,通过调度算法让他们都有休息的时间,就算有一个服务器凉了,至少还有其他的 ...
最新文章
- 每天工作四小时的程序员-转
- 超级简单的配置虚拟机网络yum源
- docker初识_初识 docker 搭建自己的开发环境
- html中购物车总金怎么算额,计算购物车金额总和( jquery )
- 他与她,一个两年前的故事
- 线程知识点(一)—— 程序、进程、线程之间的区别与联系、Java的线程状态和生命周期
- 深入理解Java 虚拟机
- Java调用存储过程返回数组
- java语言飞机大战代码_飞机大战JAVA代码
- 这篇文章让你搞懂 SpringMVC 国际化!
- (附源码)Springboot宠物医院管理系统 毕业设计 180923
- Crontab 在线生成器 - Linux计划任务
- vue-cropper 截图
- 北京邮电大学计算机学院考研调剂,2020考研调剂信息:北京邮电大学计算机学院招生信息...
- Markdown安装/破解/下载
- WorldPress 设置固定连接 Apache 服务器无法打开网页(100%解决这个问题)
- [GKCTF 2021]excel 骚操作
- html文本怎么转化为数字html,将阿拉伯数字转换为html文件中的阿拉伯/波斯数字...
- 计算机编程里面counter是什么意思,step在计算机编程中的意思是什么
- nsfw什么颜色_“ NSFW”是什么意思,以及如何使用它?
热门文章
- 【论文翻译】ORB-SLAM: A Versatile and Accurate Monocular SLAM System
- 9秒游戏开发开源---cocos2d,及各种web游戏平台开源案例,非常值得学习
- js trim()方法兼容性IE8
- oppo reno5和oppo reno4se哪个好有什么区别 oppo reno5和oppo reno4se参数对比哪款更值得入手
- GNU操作系统和操作系统内核和MinGW
- 华为nova3计算机怎么算汇率,华为阅读兑换码
- 腾讯俞栋:定义下一代智能人机交互,从目标、挑战到实现路径
- mongodb根据表名查询_使用MongoDB数据库查询数据
- 镇魔曲手游服务器维护,《镇魔曲手游》11月11日维护公告
- IPC与TCP/IP应用及比较