浅谈Spring Cloud OpenFeign

news2024/11/27 9:42:02

OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式。首先利用了OpenFeign的声明式方式定义Web服务客户端;其次还更进一步,通过集成Ribbon或Eureka实现负载均衡的HTTP客户端。

OpenFeign 组件的前身是 Netflix Feign 项目。后来 Feign 项目被贡献给了开源组织,才有了今天使用的 Spring Cloud OpenFeign 组件。
OpenFeign 提供了一种声明式的远程调用接口,它可以简化远程调用的编程体验。

在项目启动阶段,OpenFeign 框架会发起一个主动的扫包流程,从指定的目录下扫描并加载所有被 @FeignClient 注解修饰的接口。
OpenFeign 会针对每一个 FeignClient 接口生成一个动态代理对象。
FeignProxyService,这个代理对象在继承关系上属于 FeignClient 注解所修饰的接口的实例。
这个动态代理对象会被添加到 Spring 上下文中,并注入到对应的服务里,也就是图中的 LocalService 服务。
LocalService 会发起底层方法调用。实际上这个方法调用会被 OpenFeign 生成的代理对象接管,由代理对象发起一个远程服务调用,并将调用的结果返回给 LocalService。

Feign底层是ribbon

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netf1ixRib5实现。通过 Spring C1oud的封装,可以让我们轻松地将面向服务的REST模版请求自动转換成客户端负载均衡的服务调用。轮询hash权重.

简单的说 Ribbon就是 netfix公司的一个开源项目,主要功能是提供客户端负载均衡算法和服务调用。 Ribbon客户端组件提供了一套完善的配置项,比如连接超时,重试等。在 Spring Cloud构建的微服务系统中, Ribbon作为服务消费者的负载均衡器,有两种使用方式,一种是和 Resttemplate相结合,另一种是和 Openfeign相结合。 openfelgn已经默认集成了 Ribbon,关于 Openfeign的内容将会在下一章进行详细讲解。 Ribbon有很多子模块,但很多模块没有用于生产环境

Openfeign快速入门

Provider端

.yml

server:
  port: 8080  
spring:
  application:
    name: provider-server #应用名称

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

User(消费端)

server:
  port: 8081
spring:
  application:
    name: user-server #应用名称

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

#设置超时时间
ribbon:
  ReadTimeout: 3000 # 3秒
  ConnectTimeout: 3000 #连接服务的超时时间

OpenFeign调用参数处理(重点)

@PathVariable注解:获取url中的数据

解决映射名称不一致问题(提交请求参数的action的形参名称不一致,使用@RequestParam注解解析)

Feign传参确保消费者和提供者的参数列表一致包括返回值方法签名要一致

1.通过URL传参数,GET请求,参数列表使用@PathVariable (“”)

2.如果是GET请求,每个基本参数必须加回 @Requestparam(“”)

3.如果是posT请求,而且是对象集合等参数,必须加@ Requestbody或者@ Requestparam

provider-service端

@RestController

public class ParamController {

    //url传参
    @GetMapping("param/{name}/{age}")
    public String param(@PathVariable("name") String name,@PathVariable("age") int age){
        System.out.println("姓名: "+name+" 年龄 "+age);
    return "姓名: "+name+" 年龄 "+age;
    }
    @GetMapping("getParam")
    public String getParam(@RequestParam(required = false) String name){
        System.out.println("姓名: "+name);
        return "姓名: "+name;
    }
    @GetMapping("twoParam")
    public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)int age){
        System.out.println("姓名: "+name+" 年龄 "+age);
        return "姓名: "+name+" 年龄 "+age;
    }
    @PostMapping("oneObject")
    public String oneObject(@RequestBody User user){
        System.out.println(user.toString());
        return user + "";
    }

}

User-service端

@FeignClient(value = "provider-server") //提供者的应用名称
public interface UserProviderFeign {

    @GetMapping("provider")
    public String provider();

    @GetMapping("param/{name}/{age}")
    public String paramUrl(@PathVariable("name") String name, @PathVariable("age") int age);

    @GetMapping("getParam")
    public String getParam(@RequestParam(required = false) String name);

    @GetMapping("twoParam")
    public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)int age);

    @PostMapping("oneObject")
    public String oneObject(@RequestBody User user);

}

@GetMapping("paramTest")

public String paramTest(){

    userProviderFeign.paramUrl("张三",20);
    userProviderFeign.getParam("李四");
    userProviderFeign.twoParam("小红",18);
    User user = User.builder()
            .name("小冰")
            .age(18)
            .time(new Date()).build();
    userProviderFeign.oneObject(user);
    return "provider";

}

Feign传递时间

@GetMapping("testTime")
public String testTime(@RequestParam Date date){
    return date +"";
}

@GetMapping("time")
public String time(){
Date date =new Date();
    System.out.println(date);
    String s = userProviderFeign.testTime(date);
    return s;

}

Feign日志处理

Feign提供了日志打印功能,我们在项目中可以通过配置来调整日志级别,从而了解Feign中http请求的细节 ,也就是说feign提供的日志功能可以对接口的调用情况进行监控和输出。

日志级别:

NONE: 默认的,不显示任何日志

BASIC:仅记录请求方法、URL、响应状态码以及执行时间

HEADERS:除了BASIC中定义的信息以外,还有请求和响应的头信息

FULL: 除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

public Logger.Level level(){

    return Logger.Level.FULL;

}

logging:
  level:
    com.example.feign.UserProviderFeign : debug

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

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

相关文章

临期食品电商 APP 的设计与开发

摘 要 : 在移动互联网和电子商务产业的快速发展中,越来越多的消费者开始慢慢的接触网上购 物,互联网经济的全面动员将席卷全球,各种电商应用将在时代的浪潮中层出不穷。在未来各国的 不断发展中互联网很可能会成为销售各种货物的…

在线商城前台开发环境配置

一、项目配置 node 15.14.0 官网下载 https://nodejs.org/zh-cn/download/releases npm 7.7.6 下载node后自动安装npm,如果版本不对就更换对应版本 npm install react7.7.6 下载项目源码 链接:https://www.123pan.com/s/bT07Vv-WICcv.html 解压到一…

【P50】JMeter 汇总报告(Summary Report)

文章目录 一、汇总报告(Summary Report)参数说明二、准备工作三、测试计划设计 一、汇总报告(Summary Report)参数说明 可以查看事务或者取样器在某个时间范围内执行的汇总结果 使用场景:用于评估测试结果 使用频率…

java boot将一组yml配置信息装配在一个对象中

其实将一组yml数据封进一个对象中才是以后的主流开发方式 我们创建一个springboot项目 找到项目中的启动类所在目录 在同目录下创建一个类 名字你们可以随便取 我这里直接叫 dataManager 然后 在yml中定义这样一组数据信息 然后 我们在类中定义三个和这个配置信息相同的字段…

全志V3S嵌入式驱动开发(触摸屏驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓的触摸屏,其实就是在普通的lcd屏幕之上,再加一层屏而已。这个屏是透明的,这样客户就可以看到下面lcd屏幕的…

想要提高办公效率,可以采用表单自定义工具

当前,随着社会的进步和科技的发展,表单自定义工具逐渐在现代化办公场所中得到重用和喜爱。因为它的灵活、简便、易操作等优势特性,使得其突破了传统表单制作工具的局限,成为广大中大型企业实现流程化管理和数字化进程的得力助手。…

UnityVR--组件5--Animation动画

目录 新建动画Animation Animation组件解释 应用举例1:制作动画片段 应用举例2:添加动画事件 Animator动画控制器 应用举例3:在Animator中设置动画片段间的跳转 本篇使用的API:Animation、Animator以及Animator类中的SetFlo…

程序语言排行榜有哪些

程序语言排名 程序语言排行NO.1Java Java是基于类的面向对象的编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。任职于Sun Microsystems的詹姆斯高斯林等人于1990年代初开发Java语言的雏形,最初被…

超低功耗待机血压计语音IC方案,智能提示NV080C-S8

随着我国步入21世纪的步伐和改革开放的不断深入,我国医疗水平和人民的生活水平不断提高,致使我国已经成为了全球老龄化为严重的国家,老年人占据的比重越来越大,一些常见的却不容易治愈的老年性疾病的预防工作已成为现今确保老年人…

LVM逻辑卷元数据丢失恢复案例 —— 筑梦之路

Lvm常见的故障主要是pv出现异常,有以下几种情况 一个是pv所在的磁盘发生了lvm的元数据损坏一个是系统无法识别到pv所在的磁盘一个是系统异常,断电等导致重启后盘符发生变化,也就是系统识别的磁盘uuid发生变化,但是wwid还是可以对应…

4.6 Monitor概念

目录 1、对象头2、原理Monitor3、原理之Synchronized4、原理之Synchronized进阶1)轻量级锁2)锁膨胀3)自旋优化4)偏向锁5)锁消除 1、对象头 64 位虚拟机 在加锁的过程中,Mark Word中的62位将会指向操作系统…

外包呆了5年终上岸,劝各位别去了...

有些测试员朋友找工作过程中问我,或者网上问有外包公司的offer,要不要去外包公司?在这里我结合我自己的经历和身边一些朋友的情况来谈谈这个问题。首先我呆过两家外包公司,并且身边有不少朋友是在外包公司工作。所以我只是尽量客观的分析这个…

Python 接口自动化测试导入接口无法上传文件有什么原因? 详细教程

在Python接口自动化测试中,上传文件通常需要使用requests库来发送HTTP请求。以下是一个示例代码来实现上传文件的功能: 如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站百万播放全网第一的自动化测试教程&am…

畅聊趣坊项目测试报告

文章目录 项目背景项目功能测试计划与设计功能测试自动化测试 测试结果功能测试结果UI自动化测试结果 项目背景 在浏览网站时,发现好多网站开放出聊天的窗口,我们一发送消息就会收到一条消息,好奇这个功能是怎么实现的,最后查阅资…

七日杀EOS错误,开服出现房间无法被搜索的问题

如题,本问题建立在你的服务器已经正常启动的情况下。 如果你的服务器根本做不到正常启动,那么这个方案可能并不适合你。 这里只提供windows端的配套过程,如果你的os是linux,那么需要自行bing一下证书导入方法。 本文默认你的serve…

Numpy---类型修改、去重、级联、拆分、拷贝复制

1. 类型修改 ndarray.astype(type) 返回修改了类型之后的数组 stock_change np.random.normal(0, 1, (4, 5)) stock_change.astype(np.int32)ndarray.tostring([order]) ndarray.tobytes([order]) 构造包含数组中原始数据字节的Python字节 arr np.array([[[1, 2, 3], […

【C++学习】特殊类设计 | 类型转换

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 特殊类设计 | 类型转换 一、特殊类设计1.1 不能被拷贝的类1.2 只能在堆上创建的类1.3 只能在栈上创建…

SpringBoot整合ShardingSphere5.x实现数据加解密功能

环境&#xff1a;Springboot2.6.14 ShardingSphere5.3.0 准备环境 添加依赖 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>${shardingsphere.version}</ve…

【数据分享】1929-2022年全球站点的逐日最低气温(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2022年全球气象站…

【资料分享】过压保护自锁控制电路

概述(电路类别、实现主要功能描述)&#xff1a; 在电源系统中&#xff0c;当反馈回路失效时&#xff0c;输出电压不受控&#xff0c;电压升高超出规定范围&#xff0c;此时过高的输出电压有可能造成后续电器设备的损坏。为解决这问题&#xff0c;通常在电源中增加过压保护电路…