远程调用-OpenFeign(一)

news2024/12/24 8:28:18

目录

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/2051311.html

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

相关文章

编程修炼之Hibernate--- springboot启动初始化ddl过程

文章目录 跟踪Springboot整合hibernate的启动代码&#xff1a; 开始初始化 entityManagerFactory 创建方言 dialect 继续排查

Koa商城项目-轮播图模块(后端)

前言 通过这次独自做前后端发现有很多需要提升的地方&#xff0c;很多细节处理不到位。下面简单看一下本人自己做的效果吧~~ Git地址 https://gitee.com/ah-ah-bao/koa_system 效果图 后端逻辑分析 首先编写route->banner.router.js /*** author: zxb* date: 2024-08-06…

Socket编程TCP 基础

一.什么是Socket(套接字&#xff09; 定义&#xff1a;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程&#x…

【文献阅读】A Comprehensive Review of Multimodal Large Language Models

一、回顾 MLLMs 在语言、图像、视频和音频处理等多模态任务中表现出色。这些模型通过整合多模态信息来增强多模态任务的有效性。 在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;如文本生成和机器翻译&#xff0c;MLLMs 利用图像、视频和音频提供上下文支持&am…

C#开发实验--卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例

前不久在公众号GIS研发看到了暑假公益C#开发教程&#xff0c;教大家ArcGIS Engine开发。 想到了自己本科阶段也学习了C#开发和AE开发&#xff0c;学习了使用C#添加空间等&#xff0c;进行卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例。 下面的…

数据结构与算法--插入排序与选择排序

文章目录 回顾提要排序基本概念排序的分类排序算法的稳定性排序算法的性能指标内排序 排序方法直接插入排序直接插入排序的要点直接插入排序的实现直接插入排序性能分析直接插入排序的适用情景 简单选择排序简单选择排序的要点简单选择排序的执行过程简单选择排序的实现简单选择…

虚幻5|布料模拟

打开骨骼网格体 1.Mass Prooerties 如果给角色施加风力&#xff0c;密度越大越难飘&#xff0c;相反密度越小飘动浮度也小 2.Material Proerties Edge Stiffness,对衣服的折痕处的调整&#xff0c;其值越大就越能维持原本的折痕&#xff0c;相反折痕就会变小&#xff0c;但…

【Mudo】实战项目之应用层模块

文章目录 前言正文1. Util1.1 File1.2 Url1.3 Str1.4 Infor 2. Http2.1 Request2.2 Response2.3 Context2.4 Server 尾序 前言 在上一篇文章当中&#xff0c;博主从代码的层面介绍了服务器模块的实现&#xff0c;最终封装出了一个传输层的TcpServer模块&#xff0c;那么在本篇…

中国篆刻艺术孙溟㠭凿木《未来之门》

孙溟㠭凿木《未来之门》 每人都有着自己对未来的期盼&#xff0c;未来并不遥远&#xff0c;下一秒就是未来&#xff0c;当下的一切好和一切的恶是暂时的&#xff0c;都会随着时间一秒一秒过去&#xff0c;走向未来&#xff0c;希望每人都能尽早打开未来之门&#xff0c;到达自己…

Arduino开源四足蜘蛛机器人制作教程

视频教程&#xff1a;手把手叫你做四足蜘蛛机器人——1零件介绍_哔哩哔哩_bilibili 一、项目介绍 1.1 项目介绍 Arduino主控&#xff0c;图形化编程&#xff0c;趣味学习 Arduino nano开发板舵机扩展底板 4.8V可充电电池&#xff0c;支持Arduino C语言编程和米思齐图形化编程…

Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

前言 应客户方的一个实际项目需求&#xff0c;需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。 该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡&#xff0c;搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头&#xff0c;拉取1920x108…

C++中二叉搜索树的底层原理及实现

小编在学习完二叉搜索树(SearchBinaryTree)之后觉得虽然二叉搜索树不是很难&#xff0c;但是它对于后面学习C中的AVL树和红黑树及map和set的封装都有重要的作用&#xff0c;因此小编今天带给大家二叉搜索树的原理及实现&#xff0c;话不多说&#xff0c;开始学习&#xff01;~~…

<Linux> git

在使用git之前&#xff0c;要先在linux中安装git yum list | grep git yum install -y 文件名 在第一次安装git时&#xff0c;需要进行下面的操作 git config --global user.email "你的邮箱名" git config --global user.name "你想要的名字" 1. git clon…

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…

NGINX 常用内置变量

目录 $remote_addr 变量 $args 变量 $is_args 变量 $document_root 变量 $document_uri 变量 $host 变量 $limit_rate 变量 $remote_port 变量 $remote_port --显示客户端端口 $request_method 变量 --返回请求方式 $request_filename 变量 --返回请求实际路径 $request_uri…

eNSP 华为ACL配置

华为ACL配置 需求&#xff1a;公司保证财务部数据安全&#xff0c;禁止研发部门和互联网访问财务服务器&#xff0c;但总裁办不受影响 R1&#xff1a; <Huawei>sys [Huawei]sys Router1 [Router1]undo info-center enable [Router1]int g1/0/0 [Router1-GigabitEthern…

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述&#xff08;必写&#xff09;&#xff1a;2 技术方案与实施步骤2.1 模型选择&#xff08;必写&#xff09;&#xff1a;2.2 数据的构建&#xff1a;2.3 功能整合&#xff08;进阶&#xff09;&#xff1a; 3 实施步骤&#xff1a;3.1 环境搭建&#xff08;…

【Nginx】nginx的核心配置

1.nginx的文件启动 [rootNginx ~]# vim /lib/systemd/system/nginx.service [Unit] DescriptionThe NGINX HTTP and reverse proxy server Aftersyslog.target network-online.target remote-fs.target nss-lookup.target Wantsnetwork-online.target [Service] Typeforking P…

Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 也求粉啊啊啊~ ]

本文介绍了GUI的图形界面编程&#xff08;相关视频是哔站上的应该搜这个题目就能找到&#xff09;&#xff0c;文章还是很基础的&#xff0c;反正我是小白从0开始&#xff0c;主要的结构tinkter库、重要组件简介&#xff08;这个不用死记硬背 用的时候再说&#xff09;、Label&…

诊断知识:DTC Status中pending位的使用

文章目录 前言OCC6的定义pending位的定义pending位的使用总结 前言 上一篇文章介绍了ConfirmedDTCLimit的使用&#xff0c;诊断知识&#xff1a;ConfirmedDTCLimit的使用&#xff0c;后面发现理解还是有问题的&#xff0c;其实原来的图画的没有问题&#xff0c;之前对OCC6理解…