SpringCloud(16)之SpringCloud OpenFeign和Ribbon

news2024/12/26 3:06:26

一、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-driver
  cloud:
    #Consul配置
    consul:
      host: localhost
      port: 8500
      discovery:
        #注册到Consul中的服务名字
        service-name: ${spring.application.name}
    feign:
      compression:
        request:
          enabled: true # 开启请求压缩
        response:
          enabled: true # 开启响应压缩

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

server:
  port: 18084
spring:
  application:
    name: hailtaxi-driver
  cloud:
    #Consul配置
    consul:
      host: localhost
      port: 8500
      discovery:
        #注册到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
     */
    @Bean
    public 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 {
    @Override
    public Server choose(Object o) {
        // 这里实现自己的负载均衡算法
        return null;
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
        
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return null;
    }
}

 

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

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

相关文章

Android 如何添加自定义字体

Android 如何添加自定义字体 比如我要添加 jetbrains 相关字体 在 res 文件夹中添加 font 文件夹。里面放入你的字体文件 .ttf .otf&#xff0c;字体文件名需要是小写&#xff0c;只能是字母和下划线。 在 xml 布局文件中直接通过 android:fontFamily"font/jetbrainsmo…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型

专属领域论文订阅 VX 关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉语言…

ChatGPT/GPT4科研应用与AI绘图及论文写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

LeetCode 448.找到所有数组中消失的数字

目录 1.题目 2.代码及思路 3.进阶 3.1题目 3.2代码及思路 1.题目 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&am…

代码随想录算法训练营第二十七天|93.复原IP地址、78.子集、90.子集II

93.复原IP地址 刷题https://leetcode.cn/problems/restore-ip-addresses/description/文章讲解https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html视频讲解https://www.bilibili.com/video/BV1XP4y1U73i/?vd_sourceaf4853e80f89e28094a5fe1e220d9…

【Java程序设计】【C00282】基于Springboot的校园台球厅人员与设备管理系统(有论文)

基于Springboot的校园台球厅人员与设备管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园台球厅人员与设备管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xf…

认识IP地址:互联网通信的关键

IP地址 IPv4和IPv6 在Internet上为每台计算机指定的唯一的地址称为IP地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;也称网际地址 在IPv4中&#xff0c;IP地址由32位二进制数组成&#xff0c;分为4段&#xff0c;其中每8位构成一段。为了便于识别和表达…

SpringBoot和SpringCloud的区别,使用微服务的好处和缺点

SpringBoot是一个用于快速开发单个Spring应用程序的框架&#xff0c;通过提供默认配置和约定大于配置的方式&#xff0c;快速搭建基于Spring的应用。让程序员更专注于业务逻辑的编写&#xff0c;不需要过多关注配置细节。可以看成是一种快速搭建房子的工具包&#xff0c;不用从…

Chrome插件(二)—Hello World!

本小节将指导你从头到尾创建一个基本的Chrome插件&#xff0c;你可以认为是chrome插件开发的“hello world”&#xff01; 以下详细描述了各个步骤&#xff1a; 第一步&#xff1a;设置开发环境 确保你拥有以下工具&#xff1a; 文本编辑器&#xff1a;如Visual Studio Cod…

国际贸易报关需要向海关提交哪些资料 | 全球数字贸易发展联盟 | 箱讯科技

1、进出口货物报关单。一般进口货物应填写一式二份;需要由海关核销的货物&#xff0c;如加工贸易货物和保税货物等&#xff0c;应填写专用报关单一式三份;货物出口后需国内退税的&#xff0c;应另填一份退税专用报关单。 2、货物发票。要求份数比报关单少一份&#xff0c;对货…

broom系列包: 整理模型输出结果

broom包 说明 tidy、augment和glance函数的输出总是一个小tibble。 输出从来没有行名。这确保了您可以将它与其他整洁的输出组合在一起&#xff0c;而不用担心丢失信息(因为R中的行名不能包含重复)。 有些列名保持一致&#xff0c;这样它们就可以跨不同的模型进行组合。 tidy(…

技术社区项目—利用SSE协议实现技术社区公众号扫码登录

前言 在技术社区项目中&#xff0c;用户登录是一个至关重要的环节&#xff0c;而传统的用户名密码登录方式已经无法满足用户对于便捷、安全的需求。为了提升用户体验&#xff0c;我们开发小组采用了一种基于SSE&#xff08;Server-Sent Events&#xff0c;服务器发送事件&…

常用显示屏学习——LCD12864(含高级驱动程序)

LCD12864液晶显示屏 屏幕介绍 ① 可显示四行字符&#xff0c;每行可显示8个汉字或者16个数字和字母&#xff1b; ②可串行通信和并行通信&#xff1b; ③ 串口接口管脚信号 通信方法 &#xff08;一&#xff09;八位并行通信方法 &#xff08;二&#xff09;串行通信方法 用…

Spring Session:入门案例

Spring Session provides an API and implementations for managing a user’s session information. Spring Session提供了一种用于管理用户session信息管理的API。 Spring Session特点 传统的Servlet应用中&#xff0c;Session是存储在服务端的&#xff0c;即&#xff1a;Ses…

RapidJson开源库使用

1.下载 GitHub - Tencent/rapidjson: A fast JSON parser/generator for C with both SAX/DOM style APIA fast JSON parser/generator for C with both SAX/DOM style API - Tencent/rapidjsonhttps://github.com/Tencent/rapidjson 官方使用手册&#xff1a;RapidJSON: 首页…

码上飞:免费制作自己的ChatBot

今天为大家介绍一款可以免费制作ChatBot的软件开发平台&#xff0c;码上飞CodeFlying&#xff0c;只需几步&#xff0c;即可完成ChatBot的开发&#xff0c;并且支持自定义添加自己的知识库&#xff01; 第一步&#xff1a;访问官网&#xff1a;码上飞 CodeFlying | AI 智能软件…

SpringMVC 学习(一)之 SpringMVC 介绍

目录 1 MVC 介绍 2 SpringMVC 介绍 2.1 SpringMVC 特点 2.2 SpringMVC 的核心组件 2.3 SpringMVC 执行流程 3 参考文档 1 MVC 介绍 MVC (Model View Controller) 是一种设计思想&#xff0c;它将应用程序分为三大组件&#xff1a;模型 (Model)、视图 (View)、控制器 (Con…

群晖NAS DSM7.2.1安装宝塔之后无法登陆账号密码问题解决

宝塔的安装就不在这赘述了&#xff0c;只说下&#xff0c;启动之后默认账号密码无法登陆的问题。 按照上面给出的账号密码&#xff0c;无法登陆 然后点忘记密码&#xff0c;由于是docker安装的&#xff0c;根目录下没有/www/server/panel 。 也没有bt命令 要怎么修改呢。 既然…

go使用trpc案例

1.go下载trpc go install trpc.group/trpc-go/trpc-cmdline/trpclatest 有报错的话尝试配置一些代理&#xff08;选一个&#xff09; go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://goproxy.io,direct go env -w GOPROXYhttps://goproxy.baidu.com/…

[面试] 如何保证Redis和MySQL数据一致性?

为什么要在Redis存数据 Redis 用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据 库 IO&#xff0c;还可以提升数据的 IO 性能。 因为Redis基于内存, 查询效率比MySQL快很多, 所以有限查询Redis中的数据,如果Redis没有就查询数据库然后同步到Redis 出…