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接口

  1. 创建provider,即服务提供者

    RestController
    @RequestMapping("/provider")
    public class ProviderController {@Autowiredprivate UserService userService;@RequestMapping("/getUserById/{id}")public User getUserById(@PathVariable Integer id){return userService.getUserById(id);}
    }
  2. 创建feign_interface工程,注意feign接口必须在名为feign的包下

    • 引入openfeign依赖

    • feign接口,@FeignClient注解里的值为在nacos中注册的服务名,即要调用的服务;接口的方法名和所有注解要和调用的服务的方法保持一致

      @FeignClient("服务名")
      public interface UserFeign{@RequestMapping("/getUserById/{id}")User getUserById(@PathVariable("id") Integer Id);
      }
      
  3. 创建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原理

  1. 将feign接口的代理类扫描到Spring容器中:
    @EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,并把接口和代理类交给Spring的容器管理。
  2. 为接口的方法创建RequestTemplate,当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数)
  3. 发出请求:
    代理类会通过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的入门使用相关推荐

  1. 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)

    场景 SpringCloud -创建统一的依赖管理: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102530574 Sprin ...

  2. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  3. ribbon和feign的区别

    pring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign. Ribbon  是一个基于 HTTP 和 TCP 客户端的负载均衡器  它可以在客户端配置 rib ...

  4. SpringCloud系列之服务消费Ribbon和Feign区别

    在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构.基于Spring Cloud的微服务架构.从概念上来讲,Dubbo和Spring Cloud并不能放在一起对比,因为Dubbo仅仅是一个 ...

  5. springCloud负载均衡Ribbon和Feign的区别

    1.什么是负载均衡: 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据[均匀]分摊到多个操作单元上执行,负载均衡的关键在于[均匀]. 2.常见的负 ...

  6. spring cloud 微服务调用--ribbon和feign调用

    这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...

  7. 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例

    转载自  实践出真知之Spring Cloud之基于Eureka.Ribbon.Feign的真实案例 Eureka是Spring Cloud Eureka的简称,是Netflix提供的组件之一.通过E ...

  8. 【springCloud搭建】四、集成ribbon+hystrix+feign

    上篇文章传送门:[springCloud搭建]三.集成springCloudGateway网关  ribbon+hystrix+feign所需的第三方包 <!--feign服务通讯组件--> ...

  9. Ribbon和Feign区别在哪

    先说一下负载均衡:服务访问量忒大,一个服务器顶不住,服务器一崩那不凉了,怎么办--多用几个服务器,使单个服务器承受的访问量分散开,通过调度算法让他们都有休息的时间,就算有一个服务器凉了,至少还有其他的 ...

最新文章

  1. 每天工作四小时的程序员-转
  2. 超级简单的配置虚拟机网络yum源
  3. docker初识_初识 docker 搭建自己的开发环境
  4. html中购物车总金怎么算额,计算购物车金额总和( jquery )
  5. 他与她,一个两年前的故事
  6. 线程知识点(一)—— 程序、进程、线程之间的区别与联系、Java的线程状态和生命周期
  7. 深入理解Java 虚拟机
  8. Java调用存储过程返回数组
  9. java语言飞机大战代码_飞机大战JAVA代码
  10. 这篇文章让你搞懂 SpringMVC 国际化!
  11. (附源码)Springboot宠物医院管理系统 毕业设计 180923
  12. Crontab 在线生成器 - Linux计划任务
  13. vue-cropper 截图
  14. 北京邮电大学计算机学院考研调剂,2020考研调剂信息:北京邮电大学计算机学院招生信息...
  15. Markdown安装/破解/下载
  16. WorldPress 设置固定连接 Apache 服务器无法打开网页(100%解决这个问题)
  17. [GKCTF 2021]excel 骚操作
  18. html文本怎么转化为数字html,将阿拉伯数字转换为html文件中的阿拉伯/波斯数字...
  19. 计算机编程里面counter是什么意思,step在计算机编程中的意思是什么
  20. nsfw什么颜色_“ NSFW”是什么意思,以及如何使用它?

热门文章

  1. 【论文翻译】ORB-SLAM: A Versatile and Accurate Monocular SLAM System
  2. 9秒游戏开发开源---cocos2d,及各种web游戏平台开源案例,非常值得学习
  3. js trim()方法兼容性IE8
  4. oppo reno5和oppo reno4se哪个好有什么区别 oppo reno5和oppo reno4se参数对比哪款更值得入手
  5. GNU操作系统和操作系统内核和MinGW
  6. 华为nova3计算机怎么算汇率,华为阅读兑换码
  7. 腾讯俞栋:定义下一代智能人机交互,从目标、挑战到实现路径
  8. mongodb根据表名查询_使用MongoDB数据库查询数据
  9. 镇魔曲手游服务器维护,《镇魔曲手游》11月11日维护公告
  10. IPC与TCP/IP应用及比较