远程调用-OpenFeign

news2024/11/27 3:41:55

目录

1.RestTemplate存在问题

2.OpenFeign介绍

一、主要特点

二、应用场景

3.OpenFeign快速上手

3.1引入依赖

3.2添加注解

3.3编写OpenFeign的客户端 

3.4远程调用

​编辑3.5测试

4.OpenFeign参数传递

4.1传递单个参数

4.2传递多个参数

4.3传递对象 

4.4传递JSON


1.RestTemplate存在问题

观察原本远程调用的代码

 public OrderInfo selectOrderById(Integer orderId) {
     OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
     String url = "http://product-service/product/"+ orderInfo.getProductId();
     ProductInfo productInfo = restTemplate.getForObject(url, 
ProductInfo.class);
     orderInfo.setProductInfo(productInfo);
     return orderInfo;
 }

虽说RestTemplate对HTTP进行封装后,比直接使用HTTPClient方便很多,但还是存在一些问题:

  1. 需要拼接URL,灵活性高,但是封装臃肿,URL复杂时,容易出错
  2. 代码可读性差,风格不统一

微服务之间的通信方式,通常有两种:RPC和HTTP

在SpringCloud中,默认是使用HTTP来进行微服务的通信,最常用的实现形式有两种:RestTemplate和OpenFeign 

RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机上请求服务,而不需要了解底层网络通信细节。RPC可以使用多种网络协议进行通信,如HTTP、TCP、UDP等,并且在TCP/IP网络四层模型中跨越了传输层和应用层。简言之RPC就是像调用本地方法一样调用远程方法

常见的RPC框架有:
Dubbo: https://cn.dubbo.apache.org/zh-cn/

Thrift :Apache Thrift - Home

gRPC:gRPC                    

2.OpenFeign介绍

OpenFeign是一种声明式的REST客户端,它是Netflix开源的一款基于Java的HTTP客户端库,后成为Spring Cloud的二级子项目。OpenFeign通过声明式的方式定义REST API接口,并自动生成实现该接口的客户端代码,从而极大地简化了HTTP请求和响应的处理过程,特别是在微服务架构中,它极大地简化了服务之间的调用。以下是对OpenFeign的详细介绍:

一、主要特点

  1. 声明式API:通过注解方式声明API接口,如使用@GetMapping、@PostMapping等Spring MVC注解,让代码更加简洁和易于维护。
  2. 自动封装HTTP请求:OpenFeign自动封装HTTP请求,包括HTTP方法、请求URL、请求参数、请求头等,开发者无需手动编写HTTP请求代码。
  3. 支持多种编解码器:支持JSON、XML、Form等多种数据格式的编解码,开发者可以根据需要选择合适的编解码器。
  4. 请求拦截器和响应拦截器:开发者可以通过实现请求拦截器和响应拦截器来对HTTP请求和响应进行处理,如添加认证信息、重试机制等。
  5. 负载均衡:支持通过Ribbon进行负载均衡,可以实现多个服务提供方的负载均衡。
  6. 熔断器支持:集成了Hystrix熔断器,可以在服务调用失败或超时时进行降级处理,保证服务的可靠性和可用性。
  7. 灵活的配置方式:支持多种配置方式,包括通过注解、属性文件、Java配置等方式进行配置,可以灵活地适应不同的需求。

二、应用场景

OpenFeign在微服务架构中有着广泛的应用场景,主要包括:

  1. 服务间调用:在微服务架构中,服务间的调用是常见的需求,OpenFeign提供了一种简单、高效的方式来实现服务间的远程调用。
  2. 客户端负载均衡:通过整合Ribbon,OpenFeign可以实现客户端的负载均衡,提高系统的可用性和响应速度。
  3. 服务降级:集成Hystrix熔断器,可以在服务调用失败或超时时进行降级处理,避免级联故障的发生。

3.OpenFeign快速上手

3.1引入依赖

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

3.2添加注解

在order-service的启动类添加注解 @EnableFeignclients,开启OpenFeign的功能

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

3.3编写OpenFeign的客户端 

基于SpringMVC的注解来声明远程调用的信息
 import com.bite.order.model.ProductInfo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;

 @FeignClient(value = "product-service", path = "/product")
 public interface ProductApi {
     @RequestMapping("/{productId}")
     ProductInfo getProductById(@PathVariable("productId") Integer productId);
 }

@FeignClient注解作用在接口上,参数说明:

  • name/value:指定FeignClient的名称,也就是微服务的名称,用于服务发现,Feign底层会使用 SpringCloud LoadBalance进行负载均衡.也可以使用url属性指定一个具体的url
  • path:定义当前FeignClient的统一前缀.

3.4远程调用

修改远程调用的方法

 @Autowired
 private ProductApi productApi;
 /**
  * Feign实现远程调⽤
  * @param orderId
  */
 public OrderInfo selectOrderById(Integer orderId) {
     OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
     ProductInfo productInfo = productApi.getProductById(orderInfo.getProductId());
     orderInfo.setProductInfo(productInfo);
     return orderInfo;
 }

代码对比:


3.5测试

启动服务, 访问接口, 测试远程调用: http://127.0.0.1:8080/order/1
可以看出来, 使⽤Feign也可以实现远程调用.
Feign简化了与HTTP服务交互的过程, 把REST客⼾端的定义转换为Java接口, 并通过注解的方式来声明请求参数,请求方式等信息, 使远程调用更加方便

4.OpenFeign参数传递

通过观察,我们可以发现,Feign的客户端和服务提供者的接口声明非常相似

上面例子中,演示了Feign从URL中获取参数,接下来演示下Feign参数传递的其他方式

4.1传递单个参数

服务提供方product-service

 @RequestMapping("/product")
 @RestController
 public class ProductController {
     @RequestMapping("/p1")
     public String p1(Integer id){
         return "p1接收到参数:"+id;
     }
 }

Feign客户端:

 @FeignClient(value = "product-service", path = "/product")
 public interface ProductApi {

     @RequestMapping("/p1")
     String p1(@RequestParam("id") Integer id);
 }

注意: @RequestParam 做参数绑定, 不能省略

服务消费方order-service
 @RequestMapping("/feign")
 @RestController
 public class TestFeignController {
     @Autowired
     private ProductApi productApi;

     @RequestMapping("/o1")
     public String o1(Integer id){
         return productApi.p1(id);
     }
 }

 测试远程调用:http://127.0.0.1:8080/feign/o1?id=5

4.2传递多个参数

使用多个@RequestParam进行参数绑定即可

服务提供方product-service:

 @RequestMapping("/p2")
 public String p2(Integer id,String name){
     return "p2接收到参数,id:"+id +",name:"+name;
 }

Feign客户端:

 @RequestMapping("/p2")
 String p2(@RequestParam("id")Integer id,@RequestParam("name")String name);

服务消费方order-service:

 @RequestMapping("/o2")
 public String o2(@RequestParam("id")Integer id,@RequestParam("name")String name){
     return productApi.p2(id,name);
 }
测试远程调用: http://127.0.0.1:8080/feign/o2?id=5&name=zhangsan

4.3传递对象 

服务提供方product-service:

 @RequestMapping("/p3")
 public String p3(ProductInfo productInfo){
     return "接收到对象, productInfo:"+productInfo;
 }

Feign客户端:

 @RequestMapping("/p3")
 String p3(@SpringQueryMap ProductInfo productInfo);

服务消费方order-service:

 @RequestMapping("/o3")
 public String o3(ProductInfo productInfo){
     return productApi.p3(productInfo);
 }

测试远程调用:http://127.0.0.1:8080/feign/o3?id=5&productName=zhangsan

4.4传递JSON

服务提供方product-service:

 @RequestMapping("/p4")
 public String p4(@RequestBody ProductInfo productInfo){
     return "接收到对象, productInfo:"+productInfo;
 }

Feign客户端:

 @RequestMapping("/p4")
 String p4(@RequestBody ProductInfo productInfo);

服务消费方order-service:

 @RequestMapping("/o4")
 public String o4(@RequestBody ProductInfo productInfo){
     System.out.println(productInfo.toString());
     return productApi.p4(productInfo);
 }

测试远程调用:http://127.0.0.1:8080/feign/o4

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

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

相关文章

搬瓦工美国西海岸CN2 GIA VPS测评

很多人想知道搬瓦工美国CN2 GIA VPS系列怎么样&#xff1f;实际情况是&#xff1a;搬瓦工在美国西海岸的sanjose和losangeles运作着2.5Gbps-10Gbps CN2GIA带宽的VPS&#xff0c;底层虚拟为KVM&#xff0c;纯SSD阵列&#xff0c;支持在多机房之间切换。由于三网强制走同样的路由…

每日OJ_牛客_QQ2 微信红包

目录 牛客_QQ2 微信红包 解析代码 牛客_QQ2 微信红包 微信红包_牛客题霸_牛客网 解析代码 本题很多思路&#xff0c;第一种排序思路&#xff0c;如果一个数出现次数超过一半了&#xff0c;排序过后&#xff0c;必然排在中间&#xff0c;则最后遍历整个数组查看是否符合即可。…

在java环境下判断某个元素是否存在

1、在做web功能自动化时&#xff0c;有时需要通过判断某个元素是否存在来决定下一步的操作&#xff0c;但如果直接通过如下命令来进行查找时&#xff0c;如果不存在程序会报错&#xff0c;无法达到想要的效果&#xff0c;而java中也没有可以直接调用的工具类&#xff0c;因此就…

【java工具类】计算两个经纬度点之间的距离

计算两个经纬度点之间的距离 1、计算两个经纬度点之间的距离2、代码如下 1、计算两个经纬度点之间的距离 2、代码如下 public class DistanceCalculatorUtils {// 地球半径&#xff0c;单位为米private static final double EARTH_RADIUS 6371000;/*** 计算两个经纬度点之间的…

使用 HTTPS 代理在本地测试 AWS Lambdas

​ 欢迎来到雲闪世界。AWS Lambda 通常是在云中部署和执行代码的最简单方法之一&#xff0c;尤其是在使用sam CLI部署代码时。无服务器资源定义的简单性加上在本地打包资源并确保它们在 AWS 上运行的能力&#xff0c;提供了美妙的开发体验。 但有时&#xff0c;当构建和…

torch.roll()函数使用方法

官方文档在这里&#xff0c;说的比较清楚&#xff0c;但是举的例子不是很直观。我们再详细解释一下&#xff1a; torch.roll(input, shifts, dimsNone) → Tensor input&#xff1a;输入的tensorshifts&#xff1a;滚动的方向和长度&#xff0c;若为正&#xff0c;则向索引大…

Web 服务基础介绍

目录 1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache 经典的 Web 服务端 1.2.1.1 Apache prefork 模型 1.2.1.2 Apache worker 模型 1.2.1.3 Apache event模型 1.2.2 Nginx-高性能的 Web 服务端 1.2.3 用户访问体验和性能 1.2.3.1 用户访问体验统计 1.2.3.2 …

数字孪生技术框架:从数据到决策的桥梁

随着科技的飞速发展&#xff0c;数字孪生技术作为一种创新的信息化手段&#xff0c;正逐步渗透到各个行业领域&#xff0c;成为推动数字化转型的重要力量。数字孪生技术框架&#xff0c;作为支撑这一技术体系的核心架构&#xff0c;以其独特的层级结构&#xff0c;实现了从数据…

Matlab进阶绘图第66期—特征渲染的滑珠气泡图

特征渲染的滑珠气泡图是在滑珠散点图的基础上&#xff0c;添加散点大小与颜色参数&#xff0c;通过散点的尺寸与颜色表示两个额外的特征。 由于Matlab中没有现成的函数绘制特征渲染的滑珠气泡图&#xff0c;因此需要大家自行解决。 本文利用自己制作的BubbleScatter工具&…

奥威BI数据可视化展示:如何充分发挥数据价值

奥威BI数据可视化展示&#xff1a;如何充分发挥数据价值 在大数据时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;仅仅拥有海量数据并不足以带来竞争优势&#xff0c;关键在于如何有效地挖掘、分析和展示这些数据&#xff0c;从而转化为有价值的洞察和决策…

更改Docker默认存储位置

Docker镜像和容器等数据默认保存在目录/var/lib/docker目录下&#xff0c;我们可以更改Docker 的默认存储位置&#xff0c;比如改到数据盘。需注决&#xff0c;变更存储位置时&#xff0c;原来的镜像和容器有可能丢失。 1、确认docker默认存放目录 [rootkfk12 ~]# docker inf…

算法的学习笔记—链表中环的入口结点(牛客JZ23)

&#x1f600;前言 在链表的操作中&#xff0c;环形链表是一个常见且需要特别处理的结构。当我们遇到一个包含环的链表时&#xff0c;如何找到环的入口结点是一个经典的问题。本文将详细介绍使用双指针技术来解决这一问题&#xff0c;并提供一个基于 Java 的实现代码。 &#x…

搭建内网开发环境(五)|基于nexus搭建npm私服

引言 在前面一篇教程中&#xff0c;通过 nexus 搭建了 maven 的私服&#xff0c;并通过脚本将本地的依赖文件批量上传到私服中&#xff0c;本文介绍通过 nexus 搭建 npm 私服&#xff0c;同样也通过脚本将本地依赖文件同步到私服中。 搭建内网开发环境&#xff08;一&#xff…

目标检测 | yolov6 原理和介绍

前言&#xff1a;目标检测 | yolov5 原理和介绍 后续&#xff1a; 1.简介 YOLOv6是由美团视觉智能部研发的一款目标检测框架&#xff0c;专注于工业应用&#xff0c;致力于提供极致的检测精度和推理效率。相较于YOLOv4和YOLOv5&#xff0c;YOLOv6在网络结构方面进行了深入优化…

动手学深度学习(pytorch)学习记录12-激活函数[学习记录]

激活函数 激活函数&#xff08;activation function&#xff09;通过计算加权和并加上偏置来确定神经元是否应该被激活&#xff0c; 它们将输入信号转换为输出的可微运算。 import torch import matplotlib.pyplot as plt 简单定义一个画图的函数 def graph_drawing(x_,y_…

Robotics: Aerial Robotics 部分笔记——Week3(2)规划部分

3.2 轨迹不同于路径&#xff0c;需要是光滑的&#xff0c;考虑无人机动力学约束三阶导控制jerk&#xff0c;四阶导控制snap如果轨迹要满足某个特点&#xff0c;如&#xff1a;最短时间、最短路径&#xff0c;此时最优控制思路会被引入&#xff0c;变分法等算法可用以求解,选择…

2024最新版本Python安装及开发环境配置(vscodepython)

python安装 去Python官网下载最新版本&#xff1a; 接下来请一步步按照图片操作&#xff1a; 这样子就安装完成了 测试Python安装是否成功 先打开终端 右键Windows徽标&#xff0c;点击终端 然后输入python&#xff0c;如果如下图所示&#xff0c;就说明安装成功&#xff0…

【深度学习实战】利用Linear Regression预测房价

本文参考了李沐老师的b站深度学习课程 课程链接&#xff0c;使用了线性回归模型&#xff0c;特别适合深度学习初学者。通过阅读本文&#xff0c;你将学会如何用PyTorch训练模型&#xff0c;并掌握一些实用的训练技巧。希望这些内容能对你的深度学习学习有所帮助。 安装pytorch …

【书生大模型实战营(暑假场)】基础任务四 XTuner微调个人小助手认知

基础任务四 XTuner微调个人小助手认知 任务文档视频XTuner微调前置基础 文章目录 基础任务四 XTuner微调个人小助手认知0 认识微调0.1 Fine-tune 的两种范式0.2 常见微调技术 1 微调工具 XTuner1.1 认识高效微调框架 XTuner1.2 XTuner 具有出色的优化效果1.3 XTuner 零显存浪费…

【已成功EI检索】第五届新材料与清洁能源国际学术会议(ICAMCE 2024)

重要信息 会议官网&#xff1a;2024.icceam.com 接受/拒稿通知&#xff1a;投稿后1周内 收录检索&#xff1a;EI, Scopus 会议召开视频 见刊封面 EI检索页面 Scopus 检索页面 相关会议 第六届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2025&#xff09; 大会官网&…