服务调用OpenFeign

news2024/11/28 18:49:52

OpenFeign

  • OpenFeign 介绍
  • OpenFeign 的使用
  • OpenFeign 参数传递
  • OpenFeign 超时控制
  • OpenFeign 日志设置
  • OpenFeign 的工作流程

OpenFeign 介绍

Feign 是 SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign集成了Ribbon、RestTemplate 实现了负载均衡的执行Http调用,对原有的方式(Ribbon+RestTemplate)进行了封装,对远程调用进行了简化,更加符合面向接口编程。
OpenFeign 是 springcloud 在 Feign 的基础上支持了 SpringMVC 的注解,如 @RequestMapping等。OpenFeign的 @FeignClient 可以解析 SpringMVC的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

请添加图片描述

OpenFeign 的使用

服务的消费者远程调用服务的提供者提供的接口,在服务的消费者中引入 OpenFeign 的依赖。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在启动类上添加注解@EnableFeignClients,开启openFeign功能。

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

编写接口,使用@FeignClient注解。value 属性指定了服务提供者在注册中心的服务名。

@FeignClient(value = "userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

服务提供者接口程序,FeignClient 的请求路径,方式和参数要和被调用的服务路径保持一致。

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}

通过以上的配置,服务的消费者通过@FeignClient声明接口,就可以像调用本地方法一样,调用远程服务。

@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private UserClient userClient;
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

OpenFeign 参数传递

传递JSON数据,通过@RequestBody标识入参。

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
    /**
     * 参数默认是 @RequestBody 标注的,这里的 @RequestBody 可以不填
     * 方法名称任意
     */
    @PostMapping("/openfeign/provider/order")
    Order createOrder(@RequestBody Order order);
}

POJO表单传参,参数使用POJO对象接收。openFeign提供了一个注解@SpringQueryMap完美解决POJO表单传参。

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
    /**
     * 参数默认是@RequestBody标注的,如果通过POJO对象传参的,使用@SpringQueryMap标注
     */
    @PostMapping("/openfeign/provider/order")
    Order createOrder(@SpringQueryMap Order order);
}

URL中携带参数,此种方式针对restful方式中的GET请求。注解@PathVariable接收url中的占位符。

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
    @GetMapping("/openfeign/provider/test/{id}")
    String get(@PathVariable("id")Integer id);
}

普通表单参数,此种方式传参不建议使用

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
    /**
     * 必须要@RequestParam注解标注,且value属性必须填上参数名
     * 方法参数名可以任意,但是@RequestParam注解中的value属性必须和provider中的参数名相同
     */
    @PostMapping("/openfeign/provider/test")
    String test(@RequestParam("id") String arg1, @RequestParam("name") String arg2);
}

OpenFeign 超时控制

Feign客户端调用远程接口时,默认会等待1秒钟,如果服务端处理,超过1秒钟则会报错。
可以在 application.yaml 配置文件中设置超时时长。

#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
# 表示建立连接后从服务器读取到可用资源,所用时间
 ReadTimeout:  5000
# 表示建立连接时间,适用于网络正常的情况下,两端连接所用时间
 ConnectTimeout: 5000

OpenFeign 日志设置

通过日志可以对 Feign 接口的调用情况进行监控和输出。通过配置,调整日志级别,从而了解 Feign 中 Http 请求的细节。openFeign 默认是不显示任何日志的。

openFeign的日志级别如下:

  • NONE:默认的,不显示任何日志
  • BASIC:仅记录请求方法、URL、响应状态码及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

使用配置类,进行日志级别设置

import feign.Logger;
import org.springframework.context.annotation.Bean;
@Configuration
public class FeignClientConfiguration{
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.FULL;
    }
}

全局配置,在启动类设置。

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class) 

局部配置,放到对应的接口类中。

@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)

yaml 文件中设置接口日志级别

logging:
  level:
    com.feign.service: debug

com.feign.service 是 openFeign 接口所在的包名

使用配置文件设置日志级别

# 全局配置
feign:
  client:
    config:
      default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #日志级别 

局部配置

feign:
  client:
    config:
      userservice: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #日志级别 

OpenFeign 的工作流程

OpenFeign 使用了一种动态代理技术来封装远程服务调用的过程,在上面的UserClient接口中已经对服务的名称、接口类型、访问路径已经通过注解做了声明。
OpenFeign 通过解析这些注解标签生成一个动态代理类,这个代理类会将接口调用转化为一个远程服务调用的 Request,并发送给目标服务。

OpenFeign 远程调用过程
请添加图片描述

  1. 从指定的目录下扫描并加载所有被 @FeignClient 注解修饰的接口。
  2. 对每一个 FeignClient 接口生成一个动态代理对象,即图中的 FeignProxyService
  3. 动态代理对象会被添加到 Spring 中,并注入到对应的服务里,也就是图中的 LocalService 服务
  4. LocalService 会发起底层方法调用。实际上这个方法调用会被 OpenFeign 生成的代理对象接管,由代理对象发起一个远程服务调用,并将调用的结果返回给 LocalService。

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

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

相关文章

拉普拉斯方程解决有介质导体球壳问题

一个内径和外径分别为和的导体球壳&#xff0c;带电荷&#xff0c;同心地包围着一个的导体球&#xff0c;使这个导体球接地&#xff0c;求空间各点的电势和这个导体球的感应电荷 我们不难发现&#xff0c;球对称性非常强&#xff0c;电势只和半径有关系 所以我们可以假设电势为…

Python面向对象编程1-面向过程的简单纸牌游戏程序 项目1.6 完整的猜大小纸牌游戏

总项目目标&#xff1a;用面向过程思想设计一个简单的纸牌游戏程序&#xff0c;称为"Higher or Lower"&#xff08;高还是低&#xff09;。游戏中&#xff0c;玩家需要猜测接下来的一张牌是比当前牌高还是低。根据猜测的准确性&#xff0c;玩家可以得到或失去相应的积…

学了些性能知识,实际工作如何开展性能测试?

目录 前言&#xff1a; 确定需求 了解业务 搭建测试环境 脚本执行及监控 收集测试结果 持续学习 前言&#xff1a; 学到了性能测试的知识&#xff0c;接下来如何在实际工作中开展性能测试呢&#xff1f; 确定需求 刚接触性能测试的同学往往不知道性能测试是有需求的。…

C++右值引用问题

1、右值引用与函数重载 class Int {int value; public:Int(int x 0) :value(x) { cout << "create " << this << endl; }~Int() { cout << "destroy " << this << endl; }Int(const Int& it) :value(it.value){…

系统原型设计,轻松搞定后台管理系统

伴随互联网的发展&#xff0c;越来越多的团队和企业开始使用自动化管理系统。近年来&#xff0c;各行各业的B端后台管理系统更是应运而生&#xff0c;并且快速发展迭代更新&#xff0c;直接推动了CMS、OA、 CRM、ERP、POS等系统原型的开发。 相比一般的web页面以及其他的互联网…

真实案例之视频下载性能测试分析报告

一、背景介绍 XXXX是一个以视频教学为主的教学平台&#xff0c;因此对服务器所支持的视频下载量、下载速度等都有相应的要求。其中视频采用HTTP协议&#xff0c;为下载后对视频进行一个播放和学习。为了得出测试服务器网络是否满足XXXX的要求&#xff0c;从而对该服务器做相应…

基于工业智能网关的电力能耗监测管理系统

据国家能源局最新数据显示&#xff0c;1至5月&#xff0c;全国全社会用电量35325亿千瓦时&#xff0c;同比增长5.2%&#xff0c;其中&#xff0c;5月份全国全社会用电量7222亿千瓦时&#xff0c;同比增长7.4%。 6月以来&#xff0c;随着我国经济形势的整体向好和气温的逐步升高…

流场粒子追踪精度数值实验

在计算流线&#xff0c;拉格朗日拟序结构等流场后处理时&#xff0c;我们常常需要计算无质量的粒子在流场中迁移时的轨迹&#xff0c;无质量意味着粒子的速度为流场当地的速度。此时&#xff0c;求解粒子的位移这个问题是一个非常简单的常微分方程问题。 假设流场中存在 i 个粒…

020:vue刷新跳转当前页面

第020个 查看专栏目录: VUE — element UI VUE刷新当前页面在很多场合都会使用到&#xff0c;比如在搜索页搜索内容并展示在搜索页&#xff1f;在当前页删除&#xff0c;添加内容的等&#xff0c;查看更新后的结果等。 方法一 用vue-router 重新路由的时候到当前页面的时候是…

vue移动端瀑布流布局

需求: 瀑布流, 图片大小统一不变, 描述长度根据内容确定, 不超过三行. 分两列,那边矮,下个元素就放那边 如图所示: 1. 给item设置top,和left 由于我的项目做了 amfe-flexible适配所以使用rem 完整 template <template><div class"HomePage"><van-l…

【好书精读】网络是怎样连接的 之 全世界 DNS 服务器的大接力

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 域名的层次结构 寻找相应的 DNS 服务器并获取 IP 地址 通过缓存加快 DNS 服务器的响应 DNS 服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应 客户端的查询消息&#xf…

信息量、熵、联合熵、条件熵、相对熵、交叉熵、JS散度、Wasserstein距离

信息量 I ( x i ) l o g 1 P ( x i ) − l o g P ( x i ) I(x_i)log \frac {1}{P(x_i)}-logP(x_i) I(xi​)logP(xi​)1​−logP(xi​) 信息量&#xff08;self-information&#xff09;&#xff0c;又译为信息本体&#xff0c;由克劳德 香农&#xff08;Claude Shannon&…

使用投票回归器VotingRegressor对糖尿病数据集进行回归预测

目录 1. 作者介绍2. 投票回归器VotingRegressor简介2.1 VotingRegressor介绍2.2 VotingRegressor算法遵循以下关键原则&#xff1a; 3. 使用投票回归器VotingRegressor对糖尿病数据集进行回归预测实验过程3.1 代码流程介绍3.2 完整代码3.3 实验结果 1. 作者介绍 余成伟&#x…

【深度学习】YOLOv8训练过程,YOLOv8实战教程,目标检测任务SOTA,关键点回归

文章目录 可用资源资源安装模型训练&#xff08;检测&#xff09;模型pridict模型导出 可用资源 https://github.com/ultralytics/ultralytics 官方教程&#xff1a;https://docs.ultralytics.com/modes/train/ 资源安装 更建议下载代码后使用 下面指令安装&#xff0c;这样…

Hug pylons, not trees 拥抱电网,而非树木 | 经济学人20230408版双语精翻

《经济学人》4月8日周报封面即社论区&#xff08;Leaders&#xff09;精选文章&#xff1a;《拥抱电网&#xff0c;而非树木》&#xff08;Hug pylons, not trees&#xff09;。 Hug pylons, not trees 拥抱电网&#xff0c;而非树木 The case for an environmentalism that bu…

100天精通Golang(基础入门篇)——第9天:Go语言程序的循环语句

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

UWB定位的两种解法

UWB(Ultra-Wideband)技术是一种短脉冲无线电技术(短脉冲意味着信号的带宽很大&#xff0c;因此称为超宽带)&#xff0c;其应用非常广泛&#xff0c;其中之一就是室内定位&#xff0c;通过计算信号传播的时间差&#xff0c;可以得到标签和基站之间的距离,如果有足够多的基站&…

Unity核心1——图片导入与图片设置

一、图片导入概述 ​ Unity 支持的图片格式有很多 BMP&#xff1a;是 Windows 操作系统的标准图像文件格式&#xff0c;特点是几乎不进行压缩&#xff0c;占磁盘空间大 TIF&#xff1a;基本不损失图片信息的图片格式&#xff0c;缺点是体积大 JPG&#xff1a;一般指 JPEG 格…

【Elasticsearch】 之 Translog/FST/FOR/RBM算法

目录 Translog FST/FOR/RBM算法解析 FST FOR&#xff08;Frame of Reference&#xff09;: RBM&#xff08;Roaring Bitmaps&#xff09;-(for filter cache) Translog es是近实时的存储搜索引。近实时&#xff0c;并不能保证被立刻看到。数据被看到的时候数据已经作为一…

工业级以太网RJ45温湿度监控系统解决方案之关键POE供电温湿度传感器

目 录 一、关键词…………………………………………………………………………3 二、 产品概述………………………………………………………………………3 三、 应用范围………………………………………………………………………3 四、 产品特点………………………………