SpringCloud(16)之SpringCloud OpenFeign和Ribbon

一、Spring Cloud OpenFeign介绍

        Feign [feɪn] 译文 伪装。Feign是一个轻量级的Http封装工具对象,大大简化了Http请求,它的使用方法 是定义一个接口,然后在上面添加注解。不需要拼接URL、参数等操作。项目主页:GitHub - OpenFeign/feign: Feign makes writing java http clients easier

  • 集成Ribbon的负载均衡功能;
  • 集成了Hystrix的熔断器功能;
  • 支持请求压缩;
  • 大大简化了远程调用代码,同时功能还增强了;
  • Feign以更优雅的方式编写远程调用代码,并简化了重复代码;

1.1业务分析

        按照上图所示,我们就要实现打车用户打车下单,打车下单的时候需要匹配指定司机并更改司机状态,由之 前空闲状态改成接单状态。这时候就涉到 hailtaxi-order服务调用 hailtaxi-driver服务了,此时 如果使用HttpClient工具,操作起来非常麻烦,我们可以使用 SpringCloud OpenFeign实现调用。

1.2OpenFeign应用

        使用OpenFeign实现服务之间调用,可以按照如下步骤实现:

  1. 导入feign依赖;
  2. 编写feign客户端接口-将请求地址写到该接口上;
  3. 消费者启动类上加开启feign功能注解;
  4. 访问测试接口;

1)导入依赖

         hailtaxi-api 中导入如下依赖:

        <!--配置feign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

 2)创建Feign客户端接口

        代码如下:

@FeignClient(value = "hailtaxi-driver")//value = "hailtaxi-driver"指定服务的名字
public interface DriverFeign {/***** 更新司机信息,该方法和hailtaxi-driver服务中的方法保持一致*/@PutMapping(value = "/driver/status/{id}/{status}")Driver status(@PathVariable(value = "id")String id, @PathVariable(value = "status")Integer status);
}

         参数说明:Feign启动的时候会扫描所有带有@FeignClient的注解,最后会通过动态代理,帮我们生成实现类,注解@FeignClient声明Feign的客户端,注解value指明的是服务的名称,接口定义的方法,采用SpringMVC的注解。Feign会根据注解帮我们生成URL地址。

3)Controller调用

        修改 hailtaix-order 的下单方法,在下单方法中调用 DriverFeign修改司机状态,代码如下:

    /***** 更新司机信息*/@PutMapping(value = "/status/{id}/{status}")public Driver status(@PathVariable(value = "id")String id,@PathVariable(value = "status")Integer status){Driver driver = new Driver(id,"张司机(18081)",5.0f,null,status);System.out.println("司机状态变更(18081):"+driver);return driver;}

 4)启动OpenFeign

        以上的准备工作做完之后,此时我们就要启动OpenFeign,此时我们就要启动类上加上注解,代码如下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.itheima.driver.feign")
public class DriverApplication {public static void main(String[] args) {SpringApplication.run(DriverApplication.class,args);}
}

1.3数据压缩

        用户在网络请求的过程中,如果网络不佳、传输数据过大,会造成体验差的问题,我们需要将传输的数据进行压缩来提升体验。SpringCloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。

        通过配置开启请求与响应的压缩功能:

 

server:port: 18084
spring:application:name: hailtaxi-drivercloud:#Consul配置consul:host: localhostport: 8500discovery:#注册到Consul中的服务名字service-name: ${spring.application.name}feign:compression:request:enabled: true # 开启请求压缩response:enabled: true # 开启响应压缩

         也可以对请求的数据类型,以及触发压缩的大小下限进行设置:

server:port: 18084
spring:application:name: hailtaxi-drivercloud:#Consul配置consul:host: localhostport: 8500discovery:#注册到Consul中的服务名字service-name: ${spring.application.name}feign:compression:request:enabled: true # 开启请求压缩mime-types: text/html,application/xml,application/json # 设置压缩的数据类型 min-request-size: 2048 # 设置触发压缩的大小下限#以上数据类型,压缩大小下限均为默认值response:enabled: true # 开启响应压缩

 1.4OpenFeign日志配置

        我们知道可以通过loggin.level.xx=debug来设置日志级别,但是这个对Feign客户端不会生效,@FeignClient注解修饰的客户端在被代理时,都会创建一个新的Feign.Logger实例。我们需要额外通过 配置类的方式指定这个日志的级别才可以。

1)普通日志级别设置

         hailtaxi-order 的配置文件中设置com.itheima包下的日志级别都为debug 

# com.jokerMqc包下的日志级别都为Debug
logging:level:com.jokerMqc: debug

2) Feign日志等级配置

          hailtaxi-order 启动类 OrderApplication 中创建 Logger.Level ,定义日志级别:

    /**** 日志级别* @return*/@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}

        feign支持4种级别,如下:

  •  NONE:不记录任何日志,默认值;
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间;
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息;
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据;

重启之后,访问打印如下:


二、Spring Cloud Ribbon

2.1什么是ribbon 

        Ribbon是NetFlix发布的负载均衡器,有助于控制HTTP客户端行为。为Ribbon配置服务提供者地址列表后,Ribbon就可以基于负载均衡算法,自动帮助服务消费者发送请求。

        Ribbon默认提供的负载均衡算法:轮询,随机,重试法,加权,当然我们也可以实现自己的负载均衡算法。

        有人会有一个疑问,Nginx也可以实现负载均衡,那他跟Ribbon有什么区别,其实Nginx是在服务器端在负载均衡,而Ribbon是发生在客户端的负载均衡。

2.2Ribbon使用

1)业务分析 

 

        如上图, 当用户下单调用 hailtaxi-order服务的时候,该服务会调用 hailtaxi-driver ,此时如果是 抢单过程,查询压力也会很大,我们可以为 hailtaxi-driver做集群,做集群只需要把工程复制多分    即可,多个工程如下图:

         

2)调用测试 

        此时我们执行 http://localhost:8001/order?token=zhangsan调用,可以发现已经实现负载均衡 了,  18081  18084 服务会轮询着调用。

2.3Ribbon算法

        上面我们没有做任何操作,只是把服务做成集群就实现了负载均衡,这是因为OpenFeign默认使用了Ribbon的轮询算法,如下图:

 

   我们如果想改变相关算法,可以直接在 application.yml 中配置算法即可。      

#修改负载均衡算法,默认是轮询,配置之后变随机
ribbon:#轮询NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule#随机算法#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule#重试算法,该算法先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule#加权法,会根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信息足够会切换到自身规则。#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

 2.4自动负载均衡算法

public class MyRule implements IRule {@Overridepublic Server choose(Object o) {// 这里实现自己的负载均衡算法return null;}@Overridepublic void setLoadBalancer(ILoadBalancer iLoadBalancer) {}@Overridepublic ILoadBalancer getLoadBalancer() {return null;}
}

 

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

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

相关文章

【竹篮打水】OpenCV4.x 中新增并行代码执行演示

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV支持的并行框架 OpenCV从4.5版本开始&#xff0c;新增了并行代码执行支持&#xff0c;以常见的图像像素遍历卷积计算为…

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…

hash,以及数据结构——map容器

1.hash是什么&#xff1f; 定义&#xff1a;hash,一般翻译做散列、杂凑&#xff0c;或音译为哈希&#xff0c;是把任意长度的输入&#xff08;又叫做预映射pre-image&#xff09;通过散列算法变换成固定长度的输出&#xff0c; 该输出就是散列值。这种转换是一种压缩映射&…

Android14之input高级调试技巧(一百八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

JVM面试

什么是JVM 1.JVM是java虚拟机&#xff0c;是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件 2.为了支持java中的一次编译到处运行的跨平台特性&#xff0c;jvm可以在不同的系统上运行 3.jvm能自动为对象&#xff0c;方法等分配内存&#xff0c;以及自动的…

Day01:Web应用架构搭建站库分离路由访问配置受限DNS解析

目录 常规的Web应用搭建 三种常规网站搭建模式 程序源码 中间件配置 数据库类型 文件访问路径 总结 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件…

如何在Win系统搭建Oracle数据库并实现远程访问【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

nginx高级配置详解

目录 一、网页的状态页 1、状态页的基本配置 2、搭配验证模块使用 3、结合白名单使用 二、nginx 第三方模块 1、echo模块 1.1 编译安装echo模块 1.2 配置echo模块 三、nginx变量 1、内置变量 2、自定义变量 四、自定义图标 五、自定义访问日志 1、自定义日志格式…

2024-2-22 作业

作业要求&#xff1a; 复习前面知识点(指针、结构体、函数)整理思维导图顺序表(按位置插入、按位置删除和去重、重新写)理解链表的代码&#xff0c;尝试写一下链表的尾插和输出 1.复习前面知识点(指针、结构体、函数) 2.整理思维导图 3.顺序表(按位置插入、按位置删除和去重、…

供应链大数据:穿越经济迷雾的指南针

随着经济形势的变幻莫测&#xff0c;企业运营面临着前所未有的挑战。在这个充满不确定性的时代&#xff0c;供应链大数据如同一盏明亮的指南针&#xff0c;为企业提供精准的方向指引。下面&#xff0c;我们将深入探讨供应链大数据如何帮助企业洞察市场趋势、优化库存管理、降低…

RabbitMQ开启MQTT协议支持

1&#xff09;RabbitMQ启用MQTT插件 rootmq:/# rabbitmq-plugins enable rabbitmq_mqtt Enabling plugins on node rabbitmq: rabbitmq_mqtt The following plugins have been configured:rabbitmq_managementrabbitmq_management_agentrabbitmq_mqttrabbitmq_web_dispatch Ap…

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…

docker build基本命令

背景 我们经常会构建属于我们应用自己的镜像&#xff0c;这种情况下编写dockerfile文件不可避免&#xff0c;本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令&#xff1a; env指令用于设置shell的环境变量&am…

WPF真入门教程29--MVVM常用框架之MvvmLight

1、MVVM模式回顾 关于mvvm模式的基础知识&#xff0c;请看这2个文章&#xff1a; WPF真入门教程23--MVVM简单介绍 WPF真入门教程24--MVVM模式Command命令 做过VUE开发或微信小程序开发的伙伴&#xff0c;就知道MVVM模式&#xff0c;核心就是数据驱动控件&#xff0c;全栈开…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…

Spring 中 ApplicationContext 和 BeanFactory 的区别有哪些

先看一张类图&#xff1a; 区别&#xff1a; 1&#xff1a;包目录不同&#xff1a; spring-beans.jar 中 org.springframework.beans.factory.BeanFactory spring-context.jar 中 org.springframework.context.ApplicationContext 2&#xff1a;国际化&#xff1a; BeanFacto…

vue2和vue3对比(语法层面)

阅读文章你将收获&#xff1a; 1 了解不使用组件化工具时&#xff0c;vue在html是如何使用的 2 知道vue2的生命周期函数有哪些 3 知道如何在组件化开发中使用vue 4 大致了解了vue2和vue3在使用上什么不同 最后&#xff1a;vue2和vue3除了下面我列出的有差异化的地方&…

【python】学习笔记03-循环语句

3.1 whlie循环的基础语法 - while循环的语法格式 - while循环的注意事项 条件需提供布尔类型结果&#xff0c;True继续&#xff0c;False停止 空格缩进不能忘 请规划好循环终止条件&#xff0c;否则将无限循环 """ 演示while循环基础练习题&#xff1a;求1-10…

蜂邮EDM-新手教程-新手也能使用

一、登录注册账号&#xff0c;注册登录地址&#xff1a;fengemail.com 二、配置邮箱 选择“账号设置”——“邮箱设置”进行发信邮箱配置。每个账号将默认存在一个“系统默认接口”&#xff0c;点击右侧的编辑按钮即可对该配置进行修改。 注&#xff1a;发信邮箱暂不支持个人…

本博客工程源码总目录----方便你快速找到自己喜欢的项目

目录 1、前言2、本人项目总分类3、FPGA图像处理类项目-->快速查找3.1、图像采集-->MIPI视频类3.2、图像采集-->SDI视频类3.3、图像采集-->PAL视频类3.4、图像采集-->Cmeralink视频类3.5、图像转换-->LVDS视频转换3.6、图像缩放&#xff08;纯Verilog版本HLS版…